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

时间:2016-03-03 07:33:42

标签: lucene lucene.net

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

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字段的不同实例上,它不应该是结果集的一部分。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

slop定义了允许匹配的短语的“操作”数。这可以是短语中的重新排序或附加条款。

所以“x y”~1可以匹配

  • “y x”
  • “x fred y”
  • 但不是“y fred x”(需要两个操作:沼泽加一个添加)

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