我最近刚开始与Lucene(特别是Lucene.Net)合作并成功创建了几个指标,并且没有任何问题。在与Endeca合作之前,我发现Lucene重量轻,功能强大,学习曲线要低得多(主要是因为简洁的API)。
但是,我有一个特定的索引/查询情况,我遇到了问题。我所拥有的是个人目录。可以在此应用程序中搜索人员,目标是返回精确匹配和近似匹配。现在,在索引中我将“FirstName”和“LastName”连接成一个名为“FullName”的字段,在两者之间添加一个空格。所以FirstName:Jon with LastName:Smith yield FullName:Jon Smith。我确实预见到中间名和可能后缀的可能性,但目前这并不重要。
我想在名称上做相当于模糊的搜索,所以搜索“John Smith”的人仍然会回到“Jon Smith”。我曾考虑过一个多元游戏,然而,如果他的名字实际上是“Jon Del Carmen”或“Jon Paul Del Carmen”,这就变得更加复杂。用户输入的内容中没有任何内容可以描述名字或姓氏。
我唯一想到的是我可以用不会被丢弃的字符替换连接值中的空格。如果我在为索引构建文档时也这样做,并且当我解析查询时,我可以将它视为一个更大的单词,对吧?还有另一种方法可以用于简单的名字(“Jon Smith”)和更复杂的名字(“Jon Paul Del Carmen”)吗?
任何建议都会得到真正的赞赏。提前谢谢!
编辑:其他详细信息如下。
在Luke中,我提出了以下问题:
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”这个术语周围加上引号,但它却把它当作一个短语查询来代替。我确信问题在于我只是没有做正确的事情,但在这一切都是如此的绿色,我不确定那是什么东西。
答案 0 :(得分:0)
我的问题在于我如何构建索引。我最终做的是确保它没有标记FullName,并且查询开始返回正确的结果。上面的解释结果是由于我的ID10T错误,现在正确返回。