2009-10-23 90 views
0

我最近刚刚开始使用Lucene(特别是Lucene.Net),并成功创建了几个标记,并且没有任何问题。以前曾与Endeca合作过,我发现Lucene轻巧,功能强大,学习曲线低得多(主要由于API简洁)。Lucene索引和查询设计问题 - 搜索人

但是,我有一个具体的索引/查询情况,我有问题缠绕我的头。我拥有的是个人目录。人们可以在这个应用程序中搜索,目标是返回精确匹配和近似匹配。现在,在索引中,我将“FirstName”和“LastName”连接成一个名为“FullName”的字段,在两者之间添加一个空格。所以名字:乔恩与姓氏:史密斯产量全名:乔恩史密斯。我确实预计中间名和后缀的可能性,但目前并不重要。

我想对名称进行模糊搜索,所以有人搜索“John Smith”仍会找回“Jon Smith”。我曾经想过一个多重广告,但是如果他的名字实际上是“Jon Del Carmen”或者“Jon Paul Del Carmen”,那么这会变得更加复杂。我不知道用户输入什么内容来描述名字或姓氏片断。

我唯一的想法是我可以用一个不会被丢弃的字符替换连接值中的空格。如果我在为索引构建文档时以及在解析查询时做到了这一点,我可以将其视为一个较大的单词,对吗?有没有另外一种方法可以用于简单名称(“Jon Smith”)以及更复杂的名称(“Jon Paul Del Carmen”)?

任何意见将真正被赞赏。提前致谢!

编辑:其他细节如下。

在卢克,我把下面的查询:

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

我有点困惑。这似乎是一个非常简单的查询。如果名称有2个或10个,这有什么关系?使用模糊和/或跨度查询,如果它们接近它将在结果中返回的名称。 – Gandalf 2009-10-23 16:54:21

+0

当使用Luke或从代码运行时,像FullName:John Smith〜是出于某种原因,仅使用“John”并丢弃空格后的所有内容。我会在消息中包含解释,以便您可以查看是否有任何明显缺失的情况。 – 2009-10-23 17:17:14

+0

是我的问题,我应该做这样的查询:FullName:john \ smith〜?看起来逃离空间正在导致它正确纠正。 – 2009-10-23 17:28:15

回答

0

我的问题是我如何构建索引。我最终做的是确保它不标记FullName,并且查询开始返回正确的结果。上面的解释结果是由于我的ID10T错误,现在正确返回。