2017-02-28 97 views
0

假設我有一個由許多子句組成的複雜查詢。如何準確找到每個solr匹配匹配的查詢子句?

查詢子句可以分爲「嚴格」子句和「一般搜索」,不太重要的子句。

我想知道,在不依賴於相關性分數的情況下,哪些文檔與嚴格部分完全匹配,即哪個文檔符合所有確切要求,哪些文檔因爲一般搜索而被認爲是命中。

一個例子「嚴」查詢的一部分 -

+((+field1.subf1:val1 ConstantScore(field1.subf2.subf3.subf4:"[* TO *]" field1.subf2.subf5:true))^10.0) ((title:"Lorem ipsum dolor sit amet")^0.05) (#((+field1.subf1:val1 ConstantScore(field1.subf2.subf3.subf4:"[* TO *]" field1.subf2.subf5:true))~100^10.0)) 

在Elasticsearch,named queries讓我來標記嚴格的條款,然後驗證針對條款遭到了每一擊。

我該如何在Solr中完成這項工作?

非常感謝, 羅恩

{附: - 我使用Solr的5.3.1和solrj}

+1

我寫了一個解釋Solr查詢的Chrome瀏覽器插件https://chrome.google.com/webstore/detail/solr-query-debugger/gmpkeiamnmccifccnbfljffkcnacmmdl – freedev

回答

0

最好的選擇:

  1. 添加& debugQuery =忠於你
  2. 得到響應的debug.explain元素
  3. 和解析它

這是Solr中的一個已知的問題,如果你看看周圍,你會發現,已經做到這一點解析(儘管可能不適合你的語言等)工具:

編輯:讓我提出了一個完全不同的方法,你可以嘗試:

不要使用debugQuery,以及您需要處理的少數頂級文檔,請執行以下操作:

  1. 爲您的stric創建單獨的Lucene查詢牛逼的條款,保留在內存中
  2. 得到文檔,並創建一個MemoryIndex出它的所有查詢的文檔
  3. 運行,你會發現,如果文檔匹配所有嚴格的查詢或不

也許這是比使用debugQuery快...

+0

聽起來很不錯,謝謝! 你知道這適合生產嗎?有什麼想法會是什麼開銷? – selotape

+0

開銷應該取決於行參數,所以如果你得到一個小數字不應該是一個大問題,如果你得到另一方面的成千上萬的結果... – Persimmonium

+0

經過一些測試,即使是最小的行(10) ,debugQuery標誌導致延遲時間增加5倍,所以不適合我的用例:( – selotape

0

羅恩,

使用Solr的管理控制檯。你會找到查詢窗口。提供您的查詢字符串並檢查調試查詢。在回覆中,您將找到匹配的文檔以及最佳匹配的最高分數。您需要查看最高分數的解釋,這將告訴您查詢匹配的哪一部分。嚴格或正常!

enter image description here

2

我目前的解決方案(在得到的希望反饋和理智覈對)

要確定每個命中,如果它是「嚴」,我做到以下幾點:

  1. 按原樣執行完整查詢

  2. 並行執行相同的q uery與含有嚴格條款(FQ = $ {strict_cluases})中,僅檢索該文檔ID添加的過濾器字段(FL = 「ID」

  3. 對於每個打ID從查詢1,如果它出現在查詢2點的ID,我標誌着命中爲「嚴格」

運行兩個不同的查詢,比較它們引入了兩個結果集太不相交(從而使比較沒有實際意義)的風險,但我相信它是通過它們具有相同的分數減輕,開始&行參數。