我最近刚开始与Lucene (特别是Lucene.Net)合作,并成功地创建了几个起诉,并且对其中任何一个都没有问题。在之前使用过Endeca之后,我发现Lucene是轻量级的、功能强大的,并且学习曲线要低得多(主要是由于一个简洁的API)。
然而,我有一个特定的索引/查询情况,我有问题围绕我的头。我有一个个人目录。可以在此应用程序中搜索人员,目标是返回精确匹配和近似匹配。现在,在索引中,我将"FirstName“和"LastName”连接到一个名为"FullName“的字段中,在两者之间添加了一个空格。因此,FirstName::Smith产生FullName:Jon。我确实预料到中间名称和后缀的可能性,但这在目前来说并不重要。
我想对这个名字做一个模糊的搜索,所以搜索“约翰·史密斯”的人仍然会得到“乔恩·史密斯”。我曾想过要进行多重搜索,但是,如果他的名字实际上是"Jon“或”“,那么这个问题就会更加复杂。我在用户输入的内容中没有任何东西来描述名字或姓氏片段。
我唯一的想法是,我可以用一个不会被丢弃的字符替换连接值中的空格。如果我在为索引构建文档时,以及在解析查询时都这样做,我可以把它看作一个更大的词,对吗?还有另一种方法可以同时适用于简单名称("Jon“)和更复杂的名称(”“)吗?
任何建议都会很感激。提前感谢!
编辑:以下是其他详细信息.
在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“这个词周围加引号,但后来它把它当成了一个短语。我相信问题是我做得不对,但这一切都是绿色的,我不知道什么是真正的东西。
发布于 2009-10-23 17:52:59
我的问题是我是如何建立指数的。我最后要做的是确保它没有标记FullName,并且查询开始返回正确的结果。上面的解释结果是由于我的ID10T错误,现在返回正确。
https://stackoverflow.com/questions/1614609
复制相似问题