2015-10-07 52 views
2

我一直在努力用AND和OR运算符来形成solr字段查询。为什么solr的返回不同的结果为1和2,3和4个查询甚至所有查询具有相同逻辑电带有AND和OR运算符的Solr字段查询(fq)

  1. FQ =(名称:ABC和-city:(3:1))OR(名称:ABC和-loc :(3 KD 5 7))
  2. FQ =(名称:ABC和(-city:(1 3)OR -loc:(3 KD 5 7)))
  3. FQ =名:ABC & FQ = - (城市:(1 3)和LOC:(3 KD 5 7))
  4. FQ =名:ABC & FQ =( - 城市:(1 3)OR -loc:(3 KD 5 7))

coul d任何人都请帮我理解solr内部如何执行以上查询?

+0

查看Yonik的回答w.r.t.解析“纯粹负面”查询:http://stackoverflow.com/questions/634765/using-or-and-not-in-solr-query/642452#21409106 –

+0

感谢您的回复,我从逻辑上思考Demorgan的法律和根据它3和4都是相同的 - “不(A和B)”与“(不是A)或(不是B)”相同。 –

+0

我在过去也挂断了这里。不确定不一致行为的基本原理。 –

回答

4

这种不一致是一个已知的问题,并有一个开放的票:https://issues.apache.org/jira/browse/SOLR-3744

这个线程涵盖在简单来说: Weird Solr/Lucene behaviors with boolean operators

你有一些“纯负”嵌套在表达式中的查询 Lucene查询解析器希望将“否定查询”与正面选择查询一起表达。换句话说,任何东西,但城市: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))) 

而且看东西绑回正确。

+0

当你传递* debugQuery = true *时,你希望你的解析查询看起来像'+ name:abc - (+ city:(1 3)+ loc:(3 K D 5 7))'。 –

0

即使*:* 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)))