在Solr查询中使用AND,OR和NOT

时间:2010-07-22 10:49:19

标签: syntax lucene solr

我正在尝试像这样的Solr查询

+field1:* AND (field2:1 OR field2:10) NOT(field3:value1 OR field3:value2)

但是查询的field3部分没有产生任何影响。它仍会带来在field3中具有value1或value2的记录

为什么会这样?

3 个答案:

答案 0 :(得分:6)

试试这个

+field1:* +(field2:1 OR field2:10) -(field3:value1 OR field3:value2)

答案 1 :(得分:4)

我认为最后两个块之间缺少AND / OR。它会变成类似的东西:

+field1:* AND (field2:1 OR field2:10) AND NOT(field3:value1 OR field3:value2)

答案 2 :(得分:0)

您需要对Solr查询中的某些字符进行urlencode以符合 UTF8 标准,+(加号)符号就是其中之一,以及空格,方括号等。

要编码的东西是:

Space => +
+ => %2B
( => %28
) => %29

依此类推,您可以在SOLR网站上看到编码URL的示例: https://wiki.apache.org/solr/SolrQuerySyntax

尝试:

str_replace(array('+','(',')',' '), array('%2B','%28','%29','+'), '+field1:* (field2:1 field2:10) -(field3:value1 field3:value2)');

这应该给你:

%2Bfield1:*+%2B%28field2:1+field2:10%29+-%28field3:value1+field3:value2%29

如果您的默认查询解析器操作设置为OR,则字段之间的任何空格都将被解释为OR运算符。

以上结果远非干净&可读,但它是一个格式正确的 UTF8 字符串,Solr要求您传递给它。你运行它就会发现它的差异。

为什么str_replace而不是urlencode?那么你可以使用urlencode,因为它会正确地将字符串格式化为UTF8,但它可能会格式化一些不需要编码的字符串组件。