【问题标题】:How to query part of a field in Lucene.NET如何在 Lucene.NET 中查询部分字段
【发布时间】:2016-10-12 09:43:51
【问题描述】:

假设我有一个包含用户集合的索引,将他们的全名存储在名称字段中。其中一些用户的格式是“Firstname Lastname”,有些是“Firstname Middlename(s) Lastname”

例如

  1. 乔博客
  2. Joe Fred 博客
  3. Joe John Paul 博客

如果我搜索“Joe Bloggs”,我需要它来返回上面列出的所有用户。

我尝试过使用 PhraseQuery ,但这只会返回“Joe Bloggs”(我推测是因为术语需要按正确的顺序排列)。

我唯一的选择是使用 WildcardQuery 吗?我不希望返回“Joe Smith”或“John Bloggs”。此外,我无法修改索引以将全名拆分为单独的字段。

我应该如何最好地形成我的查询以使事情按要求工作?

谢谢

【问题讨论】:

  • 搜索Joe *Bloggs为什么会返回“Joe Smith”?
  • @JeroenMostert 我更多地考虑 Joe* Bloggs 的思路。无论哪种方式,我都不确定 Joe *Bloggs 是否会起作用。假设您正在搜索“Joe *Bloggs”并且有人被称为“Joe Bigbloggs”,我们不希望他出现在结果中。
  • 这就是我选择Joe *Bloggs 的原因,因为Joe* Bloggs 也会找到Joey Bloggs,而且我认为姓氏带有意外前缀的可能性小于名字带有意外的后缀,如果可以将 Lucene 配置为以区分大小写的方式进行搜索(我不知道是否可以),您只会担心出现 Joe McBloggs,而不是 Joe Bigbloggs。但是你是对的,如果空格很重要,没有通配符查询可以在这里完全正常工作。 (您总是可以对“大部分正确”的结果进行一些后过滤。)
  • 或者,您可以使用BooleanQuery,其中OR 将通配符查询Joe BloggsJoe * Bloggs 一起使用。不知道效率,但它应该只找到你所追求的。

标签: c# lucene.net querying


【解决方案1】:
  1. 注意您使用的分析仪。

您可能只希望“空白”在 ws 中分词。加上“小写”以便“fred”匹配“Fred”

  1. 您的查询应该只是“name:joe AND name:bloggs”(或者如果您手动构建查询对象,则为等效项)

这表示名称字段必须包含两个单词

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多