0

我很难编写将返回所有这些可能的字符串值的查询。为了使情况更加困难,可以有超过 1 套 |###>###| 一个字符串中的块,因此在这些之间使用 OR 根本行不通。

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

这就是我在脑海中描绘的样子:

item_s:schema3|(a OR atext OR "")>(a 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|
4

1 回答 1

0

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

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

item_s:somestuff

将在字段名称中搜索“somestuff” item_s。如果您将整个内容用引号括起来,那应该会为您解决这个问题。

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

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

(澄清一下OR,Lucene 语法中并不真正需要 s,它是默认操作,我更喜欢Lucene 的+/-语法and/or/not)。

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

+"items_s:schema3" +(a atext)

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

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

于 2013-01-19T00:28:10.857 回答