【问题标题】:Lucene Index and Query Design Question - Searching PeopleLucene 索引和查询设计问题 - 搜索人物
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多