Lucene中如何为搭配短语及后续词分别设置不同slop参数
问题根因
你之前的查询写法存在语法错误:Lucene经典查询解析器不支持嵌套双引号,你写的""anti terrorist"~0 operation"~1会被解析为"anti terrorist operation"~1,也就是将三个词视为同一个短语,整体允许slop=1,不会单独校验anti和terrorist必须紧密相邻,因此会匹配到不符合规则的文本。
正确实现方案
方案1:代码构造SpanQuery(最可靠,无版本兼容问题)
直接通过Span查询组合两层约束,适配所有Lucene版本,注意替换示例中的字段名为你实际查询的字段:
SpanTermQuery anti = new SpanTermQuery(new Term("你的字段名", "anti")); SpanTermQuery terrorist = new SpanTermQuery(new Term("你的字段名", "terrorist")); // 第一层约束:anti和terrorist相邻、顺序一致,slop=0 SpanNearQuery antiTerroristPhrase = new SpanNearQuery(new SpanQuery[]{anti, terrorist}, 0, true); SpanTermQuery operation = new SpanTermQuery(new Term("你的字段名", "operation")); // 第二层约束:短语在前,operation在后,两者间隔slop=1 SpanNearQuery finalQuery = new SpanNearQuery(new SpanQuery[]{antiTerroristPhrase, operation}, 1, true);
方案2:查询字符串写法(适配Lucene 8+/Solr 7+)
使用Intervals间隔查询语法,无需嵌套引号,直接明确两层约束:
intervals(你的字段名:maxgaps(1, ordered(phrase("anti terrorist"), term("operation"))))
参数说明:
phrase("anti terrorist")等价于slop=0的短语查询,保证两个词紧密相邻顺序正确ordered(...)要求短语必须出现在operation之前maxgaps(1, ...)要求两个子元素之间最多间隔1个词,满足你要求的slop=1约束
内容的提问来源于stack exchange,提问作者Even
相关产品推荐
相关产品推荐

