我正在尝试像这样的Solr查询
+field1:* AND (field2:1 OR field2:10) NOT(field3:value1 OR field3:value2)
但是查询的field3部分没有产生任何影响。它仍会带来在field3中具有value1或value2的记录
为什么会这样?
答案 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,但它可能会格式化一些不需要编码的字符串组件。