对于我的数据集,我的模糊搜索方法是否优于使用Lucene?

时间:2012-07-06 14:39:36

标签: algorithm search lucene fuzzy-search similarity

我想在我目前正在开展的网络应用中实施模糊搜索工具。后端是用Java编写的,每个人在这里推荐的搜索引擎Lucene都是用Java编写的。然而,由于以下几个原因,我不愿意使用它:

  1. 我觉得自己有能力建造自己的东西。
  2. Lucene拥有众多我不习惯使用的功能;我想尽量减少臃肿。
  3. 根据我的理解,Lucene的模糊搜索实现手动评估索引的每个术语的编辑距离。我觉得我想采取的方法(详见下文)会更有效率。
  4. 待索引的数据可能是英语中的整套名词和专有名词,因此您可以看到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. 这是一种实施模糊搜索的好方法,(考虑到我处理的数据集),还是有些东西我过度简化/缺失?

2 个答案:

答案 0 :(得分:3)

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

然而,这在Lucene 4.0(an ALPHA preview has been released a few days ago)中发生了很大变化:FuzzyQuery now uses a Levenshtein automaton to efficiently intersect the terms dictionary。这要快得多,现在有一个新的direct spellchecker不需要专用索引,并且直接将术语字典与自动机相交,类似于FuzzyQuery。

答案 1 :(得分:1)

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

Lucene 4.0 alpha刚刚发布,现在很多东西都更容易定制,所以你也可以在它上面构建一个自定义模糊搜索。

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