如何使用Lucene进行个人姓名(名字、姓氏)搜索?

如何使用Lucene进行个人姓名(名字、姓氏)搜索?,lucene,Lucene,我正在为NFL球员数据库编写一个搜索功能 用户输入搜索字符串,如“Jason Campbell”或“Campbell”或“Jason” 我很难得到合适的结果 索引时应该使用哪个分析器?查询时使用哪个Query?我应该区分名字和姓氏还是只索引全名字符串 我喜欢以下行为: 查询:“杰森·坎贝尔”->结果:一名球员杰森·坎贝尔的精确匹配 查询:“坎贝尔”->结果:所有以坎贝尔为名的球员 查询:“Jason”->结果:所有名字中有Jason的玩家 查询:“Cambel”[拼写错误]->结果:所有名字中有

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

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

我很难得到合适的结果

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

我喜欢以下行为:

查询:“杰森·坎贝尔”->结果:一名球员杰森·坎贝尔的精确匹配

查询:“坎贝尔”->结果:所有以坎贝尔为名的球员

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


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

StandardAnalyzer应该可以很好地处理上述所有查询。第一个查询应该用双引号括起来,以便精确匹配,最后一个查询需要模糊查询。例如,您可以将Cambell设置为0.5,并且可以将Campbell设置为匹配(瓷砖后面的数值表示模糊性)


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

你会使用哪种查询实现?我很难让TermQuery匹配一个精确的短语。(您可以通过编程方式设置FuzzyQuery的模糊工厂,无需使用波浪形符号。)正如术语所暗示的(没有双关语的意思),TermQuery是术语的缩写,您应该根据具体情况查看查询。如果您想精确匹配“John Smith”,请使用短语查询。如果你想成为约翰逊·史密斯“当用户输入John Smith时,你应该看看FuzzyQueryi基本上使用了你建议的东西。谢谢首先,根据查询中的术语数量,使用TermQuery或PhraseQuery尝试精确匹配。模糊查询也采用同样的方法,因为它将单个术语作为输入,所以需要使用BooleanQuery构建短语。谢谢,这很有帮助。当姓氏和名字是分开的字段时,你如何做字段注释?你可能会对我的这篇博客文章感兴趣,以便进行名称搜索: