Algorithm 对于我的数据集,我的模糊搜索方法会比使用Lucene更好吗?

Algorithm 对于我的数据集,我的模糊搜索方法会比使用Lucene更好吗?,algorithm,search,lucene,fuzzy-search,similarity,Algorithm,Search,Lucene,Fuzzy Search,Similarity,我想在我目前正在开发的web应用程序中实现一个模糊搜索功能。后端是用Java编写的,碰巧大家推荐的搜索引擎也是用Java编写的。一、 然而,出于以下几个原因,我不敢使用它: 我会觉得自己有成就感 Lucene有太多的功能,我不认为自己在使用这些功能;我想尽量减少浮肿 据我所知,Lucene的模糊搜索实现手动评估每个索引项的编辑距离。我觉得我想采取的方法(详见下文)会更有效率 要编入索引的数据可能是英语中的一整套名词和专业名词,因此你可以看到Lucene的模糊搜索方法让我感到厌倦 我想做的是采用一

我想在我目前正在开发的web应用程序中实现一个模糊搜索功能。后端是用Java编写的,碰巧大家推荐的搜索引擎也是用Java编写的。一、 然而,出于以下几个原因,我不敢使用它:

  • 我会觉得自己有成就感
  • Lucene有太多的功能,我不认为自己在使用这些功能;我想尽量减少浮肿
  • 据我所知,Lucene的模糊搜索实现手动评估每个索引项的编辑距离。我觉得我想采取的方法(详见下文)会更有效率
  • 要编入索引的数据可能是英语中的一整套名词和专业名词,因此你可以看到Lucene的模糊搜索方法让我感到厌倦

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

    例如:假设
    n=3
    ,我的文件命名方案类似于:
    [n-gram]\uu[n-gram\u在字符串中的位置].txt

    文件
    bea_0.txt
    将包含:

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

    我的问题是。。。我想我有几个问题

  • Lucene的模糊搜索是否有任何改进,但我不知道这会使我的方法变得不必要
  • 这是一种实现模糊搜索的好方法(考虑到我正在处理的数据集),还是有一些我过于简单化/遗漏的地方

  • 作为记录,当你处理英语语料库时,Lucene(或Solr,但我想你可以在vanilla Lucene中使用它们)有一些可能有用的语音分析器

    Lucene 4.0 alpha刚刚发布,现在很多东西更容易定制,因此您还可以在此基础上创建自定义模糊搜索


    在任何情况下,Lucene都有多年的性能改进,因此您很难实现相同的性能。当然,对于您的情况来说,它可能已经足够好了……

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

    然而,这在Lucene 4.0()中发生了很大变化:。这是如此之快,现在有一个新的,不需要一个专门的索引,并直接与一个自动机相交的术语词典,类似于FuzzyQuery