3

我想在我目前正在开发的网络应用程序中实现一个模糊搜索工具。后端是用 Java 编写的,碰巧这里大家推荐的搜索引擎Lucene也是用 Java 编写的。但是,出于以下几个原因,我回避使用它:

  1. 我会觉得自己完成了一些事情。
  2. Lucene 有很多我认为自己没有使用的功能。我想尽量减少臃肿。
  3. 据我了解,Lucene 的模糊搜索实现手动评估索引的每个术语的编辑距离。我觉得我想采取的方法(下文详述)会更有效。

要索引的数据可能是英语中的整组名词和代名词,所以你可以看到 Lucene 的模糊搜索方法让我感到厌烦。

我想要做的是采用基于 n-gram 的方法来解决这个问题:从数据库中读取和标记每个项目,并将它们保存到由给定 n-gram 及其位置命名的文件中的磁盘中。

例如:假设n = 3我的文件命名方案类似于:[n-gram]_[location_of_n-gram_in_string].txt.

该文件bea_0.txt将包含:

bear
beau
beacon
beautiful
beats by dre

当我收到要搜索的术语时,我可以简单地将其标记为 n-gram,并使用它们及其相应的位置来读入相应的 n-gram 文件(如果存在)。然后,我可以对这组数据执行任何过滤操作(消除那些不在给定长度范围内的操作,执行编辑距离计算等),而不是对整个数据集执行此操作。

我的问题是……好吧,我想我有几个问题。

  1. Lucene 的模糊搜索是否有任何改进,我不知道这会使我的方法变得不必要?
  2. 这是实现模糊搜索的好方法(考虑到我正在处理的数据集),还是我过于简化/遗漏了什么?
4

2 回答 2

3

Lucene 3.x 模糊查询用于评估查询词与每个索引词之间的Levenshtein距离(蛮力方法)。鉴于这种方法效率相当低,Lucene 拼写检查器过去常常依赖类似于您所描述的内容:Lucene 将首先搜索与查询词具有相似 n-gram 的词,然后根据字符串距离对这些词进行评分(例如Levenshtein 或Jaro-Winckler)。

然而,这在 Lucene 4.0 中发生了很大变化(几天前已经发布了 ALPHA 预览版):FuzzyQuery 现在使用 Levenshtein 自动机来有效地与术语字典相交。这要快得多,以至于现在有一个新的直接拼写检查器,它不需要专用索引,并且可以直接将术语字典与自动机相交,类似于 FuzzyQuery。

于 2012-07-07T10:25:07.830 回答
1

作为记录,当您处理英语语料库时,Lucene(或 Solr,但我想您可以在 vanilla lucene 中使用它们)有一些可能有用的语音分析器(DoubleMetaphone、Metaphone、Soundex、RefinedSoundex、Caverphone)

Lucene 4.0 alpha 刚刚发布,现在很多东西更容易定制,所以你也可以在它的基础上创建一个定制的模糊搜索。

在任何情况下,Lucene 都有多年的性能改进,因此您几乎无法获得相同的性能。当然,对于您的情况,这可能已经足够了...

于 2012-07-06T17:19:59.900 回答