Solr字段查询(fq)使用AND和OR运算符

3

我一直在尝试使用AND和OR运算符形成一个Solr字段查询。为什么当所有查询的逻辑相同时,Solr会针对1和2、3和4个查询返回不同的结果呢?

  1. fq=(name:abc AND -city: ( 1 3 )) OR (name:abc AND -loc:(3 K D 5 7))
  2. fq=(name:abc AND (-city: ( 1 3 ) OR -loc:(3 K D 5 7)))
  3. fq=name:abc&fq=-(city:(1 3) AND loc:(3 K D 5 7))
  4. fq=name:abc&fq=(-city:(1 3) OR -loc:(3 K D 5 7))

请问有人能帮助我了解Solr如何在内部执行上述查询吗?


请参考Yonik在解析“纯负面”查询方面的回答:https://dev59.com/YXRB5IYBdhLWcg3wZmhz#642452 - Peter Dixon-Moses
谢谢回复,我从德摩根定律的角度进行了逻辑思考,根据该定律,3和4都是相同的 - "非(A和B)"与"(非A)或(非B)"是等价的。 - Rahul Sharma
我之前也曾卡在这里。不确定不一致行为的理由。 - Peter Dixon-Moses
我仍然没有从您建议的链接中得到答案。我想知道Solr如何在内部运行这些表达式。 - Rahul Sharma
2个回答

8

这种不一致性是已知的问题,有一个未解决的工单:https://issues.apache.org/jira/browse/SOLR-3744

这个帖子用简单的语言讨论了这个问题:Weird Solr/Lucene behaviors with boolean operators

你的表达式中有一些“纯负面”的嵌套查询,Lucene查询解析器期望“负面查询”与正面选择查询一起表达。换句话说,除了city:foo之外的任何内容都应正确地写成*:* AND -city:foo

尝试使用以下更改进行测试:

 1. <Same>

 2. fq=(name:abc AND (*:* AND -city:(1 3)) OR (*:* AND -loc:(3 K D 5 7)))

 3. <Same> 

 4. fq=name:abc&fq=((*:* AND -city:(1 3)) OR (*:* AND -loc:(3 K D 5 7)))

查看并确保事物正确地连接起来。


当您传递 debugQuery=true 时,您希望在所有情况下解析的查询看起来像 +name:abc -( +city:(1 3) +loc:(3 K D 5 7) ) - Peter Dixon-Moses

2

即使使用*:* AND -city:foo,当我同时使用qfq时,似乎也不能可靠地工作 - 例如,下面的第4种变体不起作用:

4b. q=name:abc AND ((*:* AND -city:(1 3)) OR (*:* AND -loc:(3 K D 5 7)))

我使用id:*代替*:*id为必填字段时更有效。现在任何变量都可以使用。
4c. q=name:abc AND ((id:* AND -city:(1 3)) OR (id:* AND -loc:(3 K D 5 7)))
4d. q=name:abc&fq=((id:* AND -city:(1 3)) OR (id:* AND -loc:(3 K D 5 7)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接