Lucene - 查询一个字段中的多个术语

Lucene - Querying multiple terms in a field

为简单起见,考虑具有以下字段和值的两个文档:

RecordId: "12345"
CreatedAt: "27/02/1992"
Event: "Manchester, Dubai, Paris"
Event: "Manchester, Rome, Madrid"
Event: "Madrid, Sidney"


RecordId: "99999"
CreatedAt: "27/02/1992"
Event: "Manchester, Barcelona, Rome"
Event: "Rome, Paris"
Event: "Milan, Barcelona"

是否可以在 "Event" 字段的单个实例中执行多个术语的搜索?

假设我想搜索 "Manchester" 和 "Paris" 出现在同一字段中。 第二条记录包含 "Manchester" 和 "Paris" 但在事件字段的不同实例上,这不应该是结果集的一部分。

理想情况下,结果集只会是第一条记录 (12345)。

如何将 Event 索引为非标记化字段,然后为其使用 KeywordAnalyzer。然后,您可以使用 Lucene 的 Regex query 来匹配曼彻斯特和巴黎的出现:

Event: "/^.*(Manchester).+(Paris).*$/"

取决于您用于该字段的分析器(它需要标记化并删除标点符号)。您可以使用斜词查询。

"manchester paris"~2 应该只找到 12345。根据每个字段中值的数量和顺序,您可能需要使用更大的斜率。

slop 定义允许匹配的词组 "operations" 的数量。这可以是短语中的重新排序或附加术语。

所以"x y"~1可以匹配

  • "y x"
  • "x fred y"
  • 但不是 "y fred x"(这需要两个操作:沼泽加上一个加法)

根据您的需要,slop 可能应该等于字段中允许的最大术语数。我还没有完成,但我认为即使您查询超过 2 个术语也足够了。