按姓/名进行智能搜索

时间:2011-06-23 18:48:25

标签: search lucene

我必须建立一个能够按名字/姓氏搜索成员的搜索工具,并且可能是其他一些搜索参数(即地址)。

搜索应该提供匹配候选者列表,以便用户可以选择他/她看起来“正确”匹配的任何内容。

搜索应该足够聪明,以便“正确”结果将成为列表中的前几个项目。搜索也应该容忍拼写错误和拼写错误,甚至可能知道名称捷径,即Bob vs. Robert或Bill vs. William。

我开始调查Lucene和家人(如弹性搜索)作为工作的工具。虽然它有一系列令人印象深刻的功能解决全文搜索的类似问题,但我不太确定如何将它们用于我的任务 - 直到可能Lucene根本不是正确的工具。

你们怎么想?我如何利用弹性搜索来解决我的问题?或者我应该去别处看看?

3 个答案:

答案 0 :(得分:3)

Lucene支持编辑距离查询,以便您的搜索查询可以容忍某些拼写错误,您可以将其定义为术语允许的编辑距离。

例如:

name:johnni~0.8

将返回“johnny”

Solr还提供各种现成的搜索filters和可用于搜索的分析器。 在您的情况下,我可能会将几个过滤器工厂链接在一起:

  • TrimFilterFactory - 修剪查询
  • LowerCaseFilterFactory - 摆脱案例差异
  • ISOLatin1AccentFilterFactory - 从字母中删除重音符号(大多数人不会用重音搜索)
  • PhoneticFilterFactory - 用于匹配类似以下查询的声音:kris - >克里斯

查看链接下的文档,如何使用使用所有上述过滤器的Analyzer设置新的solr实例非常简单。我使用了类似的搜索城市名称的东西,它运作得相当好。

答案 1 :(得分:0)

Lucene可以容忍拼写错误和拼写错误,并且可以使用同义词。至于

  

搜索应该足够聪明,以便“正确”的结果将成为列表中的前几个项目

是否有任何搜索引擎不尝试这样做?

答案 2 :(得分:0)

就Bob / Robert而言,这可以通过同义词来完成,但您需要从一些可靠的来源获取同义词数据。

除了@Asaf提到的内容之外,您可以尝试使用N-gram索引来处理拼写变体。有关如何执行此操作的示例,请参阅CJKAnalyzer