【发布时间】:2009-10-23 16:40:33
【问题描述】:
我最近刚刚开始使用 Lucene(特别是 Lucene.Net)并成功创建了几个索引,并且没有任何问题。之前与 Endeca 合作过,我发现 Lucene 是轻量级的、功能强大的,并且学习曲线要低得多(主要是由于简洁的 API)。
但是,我遇到了一种特定的索引/查询情况,我遇到了问题。我拥有的是个人目录。可以在此应用程序中搜索人员,目的是返回精确匹配和近似匹配。现在,在索引中,我将“FirstName”和“LastName”连接到一个名为“FullName”的字段中,在两者之间添加一个空格。所以 FirstName:Jon 和 LastName:Smith 产生 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”周围加上引号,但它随后将其视为短语查询。我确信问题在于我只是没有做正确的事情,但是在所有这一切都如此绿色,我不确定那是什么。
【问题讨论】:
-
我有点困惑。这似乎是一个非常直接的查询。名称有 2 件或 10 件有什么关系?如果它们接近将在结果中返回的名称,则使用模糊和/或跨度查询。
-
当使用 Luke 或从代码运行时,诸如 FullName:John Smith~ 之类的东西,出于某种原因,仅使用“John”并丢弃空格后的所有内容。我将在我的消息中包含解释,以便您查看是否明显遗漏任何内容。
-
我的问题是我应该进行如下查询吗:FullName:john\ smith~?似乎逃避空间会导致它正确纠正。
-
忽略我之前的评论。转义空格确实表明它在 Luke 中正确解析,但仍然没有返回任何命中。
标签: indexing lucene lucene.net