Lucene Query嵌套OR

时间:2013-01-18 21:53:43

标签: regex solr lucene

我在编写将返回所有这些可能的字符串值的查询时遇到困难。 为了使情况更加困难,可以有多组| ###> ### |一个字符串中的块,所以在它们之间使用OR根本不起作用。

我可能正在使用OR运算符进行不正确的分组,因为我使用的每次尝试最终都要求我在“schema3”开始匹配。

这就是我在脑海中描绘的方式:

item_s:schema3 |(OR atext OR“”)>(或OR atext OR“”)|

item_s:schema3|a>|
item_s:schema3|>a|
item_s:schema3|atext>|
item_s:schema3|>atext|
item_s:schema3|atext>a|
item_s:schema3|a>atext|

1 个答案:

答案 0 :(得分:0)

我假设您正在使用StandardAnalyzer进行查询和索引,在这种情况下,您列出的查询会遇到一些问题。

您正在尝试创建一个词组查询,此处有效。 Lucene正在解释冒号,这就是为什么你只能尝试从“schema3”开始的搜索。查询:

item_s:somestuff

将在字段名称item_s中搜索“somestuff”。如果你把整个东西都用引号括起来,那应该为你解决这个问题。

其次,您不能在短语查询中包含逻辑或通配符。为了精确匹配您指定的术语,您必须枚举所有6种(或9种)可能性,例如:

"item_s:schema3|a>|" "item_s:schema3|>a|" "item_s:schema3|a>atext|" etc.

(为了澄清,Lucene语法中并不真正需要OR,这是默认操作,我更喜欢+/-语法到Lucene的and/or/not

如果您不太关心术语的精确正确排序,并且愿意依赖Lucene的评分算法,那么您可以让生活更轻松,并且查询更像:

+"items_s:schema3" +(a atext)

这需要匹配前缀“items_s:schema3”,以及“a”和“atext”中的任何一个(或两者)。

需要注意的是,如果保持相同的精确格式(包括标点符号)至关重要,那么您需要使用关键字或空白分析器进行索引,以保持标点符号(当然,您可能已经这样做了)。