我最近刚开始与Lucene(特别是lucene.net)合作,并成功地创建了几个起诉状,对其中任何一个都没有问题。在与Endeca合作之前,我发现Lucene重量轻、功能强大,而且学习曲线要低得多(主要是由于一个简洁的API)。
但是,我有一个特定的索引/查询情况,我在处理这些情况时遇到了一些问题。我有个人目录。在这个应用程序中可以搜索人员,目的是返回精确匹配和近似匹配。现在,在索引中,我将“firstname”和“lastname”连接到一个名为“fullname”的字段中,在两个字段之间添加一个空格。因此,名字:jon,姓:smith,产生全名:jon smith。我确实预料到中间名和后缀的可能性,但这目前并不重要。
我想对这个名字做一个模糊的搜索,所以搜索“约翰·史密斯”的人仍然会得到“乔恩·史密斯”。不过,我曾经考虑过多搜索,如果他的名字实际上是“乔恩·德尔·卡门”或“乔恩·保罗·德尔·卡门”,这就更复杂了。我不知道用户输入什么来描述名字或姓氏片段。
唯一的想法是我可以用一个不会被丢弃的字符替换连接值中的空格。如果我在为索引构建文档以及解析查询时这样做,我可以将其视为一个更大的单词,对吗?有没有另外一种方法可以同时用于简单的名字(“乔恩·史密斯”)和更复杂的名字(“乔恩·保罗·德尔·卡门”)?
任何建议都会受到赞赏。事先谢谢!
编辑:其他细节如下。
在卢克,我提出了以下问题:
FullName:jonn smith~
它被解析为:
FullName:jonn CreatedOn:smith~0.5
解释如下:
BooleanQuery:boost=1.0000
clauses=2, maxClauses=1024
Clause 0: SHOULD
TermQuery:boost=1.0000
Term: field='FullName' text='jonn'
Cluase 1: SHOULD
FuzzyQuery: boost=1.0000
prefixLen=0, minSimilarity=0.5000
org.apache.lucene.search.FuzzyTermEnum: diff=-1.0000
FilteredTermEnum: Exception null
“createdon”是索引中的另一个字段。我试着在“jonn smith”这个词周围加引号,但它把它当作短语查询来处理。我确信问题是我做的事情不正确,但我对这一切都很冷淡,我不确定这到底是什么。