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

时间:2015-10-07 21:23:24

标签: solr

我一直在努力用AND和OR运算符形成一个solr字段查询。为什么solr为1和2,3和4查询返回不同的结果,即使所有查询都具有相同的逻辑 -

  1. fq =(姓名:abc AND -city:(1 3))或(姓名:abc AND -loc:(3 K D 5 7))
  2. fq =(姓名: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))
  5. 任何人都可以帮我理解solr如何在内部执行上述查询?

2 个答案:

答案 0 :(得分:5)

这种不一致是一个已知问题,并且有一张开放票证: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)))

看看事情是否正确回归。

答案 1 :(得分:1)

当我同时使用*:* AND -city:fooq时,即使fq对我来说似乎也不能正常工作 - 例如,如下所示#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)))