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 个术语也足够了。
为简单起见,考虑具有以下字段和值的两个文档:
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 个术语也足够了。