问题描述
|
我必须建立一个搜索功能,能够按成员的名字/姓氏搜索成员,并且可能是其他一些搜索参数(即地址)。
搜索应提供匹配候选者列表,以便用户可以选择他/她认为正确的匹配项。
搜索应足够聪明,以使“正确”的结果位于列表的前几项之内。搜索还应容忍拼写错误和拼写错误,并且甚至应注意姓名快捷键,例如Bob与Robert或Bill与William。
我开始调查Lucene及其家人(例如弹性搜索)作为工作的工具。尽管它具有一系列令人印象深刻的功能,可以解决全文搜索中的类似问题,但我不确定如何将其用于我的任务-到目前为止,Lucene根本不是正确的工具。
你们怎么看-如何利用Elastic Search解决我的问题?还是我应该去别的地方?
解决方法
Lucene支持编辑距离查询,以便您的搜索查询可以忍受某些错字,您可以将其定义为术语允许的编辑距离。
例如:
name:johnni~0.8
会返回“约翰尼”
Solr还提供了许多现成的搜索过滤器和分析器,可用于搜索。
在您的情况下,我可能会将多个过滤器工厂链接在一起:
TrimFilterFactory-修剪查询
LowerCaseFilterFactory-消除大小写差异
ISOLatin1AccentFilterFactory-从字母中删除重音符号(大多数人无论如何都不使用该重音符号搜索)
PhoneticFilterFactory-用于匹配查询之类的声音:kris-> chris
查看链接下的文档,可以很直接地了解如何使用使用上述所有过滤器的分析器设置新的Solr实例。我使用类似的方法搜索城市名称,并且效果很好。
, Lucene可以容忍错别字和拼写错误,并且可以使用同义词。至于
搜索应足够聪明,以使“正确”的结果位于列表的前几项中
是否有不尝试这样做的搜索引擎?
, 就Bob / Robert而言,这可以使用同义词来完成,但是您需要从一些可靠的来源中获取同义词数据。
除了@Asaf提到的内容外,您还可以尝试使用N-gram索引处理拼写变体。有关如何执行此操作的示例,请参见CJKAnalyzer。