2010-05-07 91 views
3

我正在为NFL球员的数据库写一个搜索功能。如何使用Lucene进行个人姓名(名字,姓氏)搜索?

用户输入等“贾森坎贝尔”搜索字符串“坎贝尔”“杰森”

我无法获得适当的结果。

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

我想以下行为:

查询“贾森坎贝尔” - >结果:1名玩家精确匹配,贾森坎贝尔

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

查询“杰森” - >结果:在他们的名字

查询杰森所有玩家:“康贝尔” [拼写错误] - >结果:所有球员坎贝尔在他们的名字

+0

你可能做的名字搜索有兴趣在我的这篇博客文章:http://www.opensourceconnections.com/2013/08/21/name-search -in-solr/ – 2013-08-21 20:28:18

回答

3

StandardAnalyzer应该适用于上述所有查询。您的第一个查询应该用双引号括起来进行完全匹配,最后一个查询需要模糊查询。例如,你可以设置坎贝尔〜0.5,你可以得到坎贝尔匹配(在代字号后面的数字值表示模糊性)。

BTW我会建议使用Solr的它提供了拼写检查和功能自动提示,所以你就不必推倒重来。这类似于谷歌的“你的意思是......”

+0

您将使用哪种查询实现?我需要很长时间才能使TermQuery匹配一个确切的短语。 (您可以通过编程设置FuzzyQuery的模糊性工厂,不需要波浪符号。) – os111 2010-05-07 20:48:16

+0

顾名思义(没有双关语意)一个TermQuery是一个学期,你应该看看根据案件的查询。如果你想匹配“John Smith”*完全匹配*,则使用PhraseQuery。如果你想约翰逊史密斯”当用户键入约翰·史密斯,你应该看看FuzzyQuery – Mikos 2010-05-07 21:53:44

+0

我基本上结束了使用像你的建议。谢谢。 首先尝试精确匹配使用或者TermQuery或PhraseQuery取决于有多少项是在模糊查询的查询。 同样的方法,因为它需要单一方面作为其输入,所以你需要使用BooleanQuery。 由于建立短语,这有助于。 – os111 2010-05-07 22:13:46

相关问题