2015-10-07 80 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)))