我想在我目前正在开展的网络应用中实施模糊搜索工具。后端是用Java编写的,每个人在这里推荐的搜索引擎Lucene都是用Java编写的。然而,由于以下几个原因,我不愿意使用它:
待索引的数据可能是英语中的整套名词和专有名词,因此您可以看到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文件(如果存在)。然后,我可以对这组数据执行任何过滤操作(消除不在给定长度范围内的操作,执行编辑距离计算等),而不是对整个数据集执行此操作。
我的问题是......我想我有几个问题。
答案 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都有多年的性能改进,因此您几乎无法实现相同的性能。当然,对你的情况来说可能已经足够了......