【问题标题】:How can I use Lucene for personal name (first name, last name) search?如何使用 Lucene 进行个人姓名(名字、姓氏)搜索?
【发布时间】:2010-05-07 18:44:49
【问题描述】:

我正在为 NFL 球员的数据库编写搜索功能。

用户输入搜索字符串,如 “Jason Campbell”“Campbell”“Jason”

我无法获得适当的结果。

索引时我应该使用哪个Analyzer?查询时是哪个Query?我应该区分名字和姓氏还是只索引全名字符串?

我想要以下行为:

查询“Jason Campbell” -> 结果:完全匹配 1 名玩家,Jason Campbell

查询“Campbell” -> 结果:所有名字中包含 Campbell 的玩家

查询“Jason” -> 结果:所有名字中有 Jason 的玩家

查询“Cambel” [拼写错误] -> 结果:所有名字中包含 Campbell 的玩家

【问题讨论】:

标签: lucene


【解决方案1】:

StandardAnalyzer 应该适用于上述所有查询。您的第一个查询应该用双引号括起来以获得完全匹配,您的最后一个查询需要一个模糊查询。例如你可以设置Cambell~0.5,你可以得到Campbell作为匹配(波浪号后面的数值表示模糊)。

顺便说一句,我建议使用 Solr,它提供拼写检查和自动建议功能,这样您就不必重新发明轮子了。这类似于谷歌的“你的意思是……”

【讨论】:

  • 您将使用哪种查询实现?我很难让 TermQuery 匹配一个确切的短语。 (您可以通过编程方式设置 FuzzyQuery 的模糊工厂,不需要波浪号。)
  • 正如术语所暗示的(不是双关语),TermQuery 是一个术语,您应该根据案例查看查询。如果您想完全匹配 匹配“John Smith”,请使用 PhraseQuery。 If you want to Johnson Smith" 当用户键入 John Smith 时,您应该查看 FuzzyQuery
  • 我基本上最终使用了你建议的东西。谢谢。首先尝试使用 TermQuery 或 PhraseQuery 进行精确匹配,具体取决于查询中有多少项。模糊查询的方法相同,因为它以单个术语作为输入,因此您需要使用 BooleanQuery 构建短语。谢谢,这有帮助。
  • surname 和 firstname 是单独的字段时如何进行字段注释?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2016-02-22
  • 2011-08-19
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多