爲了根據不同的條件在不同的領域進行搜索,需要首先搜索特定的條件,因此它與發出多個查詢差不多。
這就是說,如果有必要做它作爲一個一次性的查詢(例如,用於外的現成排序/分組/其他solr的特徵),則nested queries可以使用。
定義兩個不同的條件(如在原來的問題,但它可以很容易地與更OR子句擴展),則q
參數可以接收以下值:
_query_:"{!edismax fq=$fq1 qf=$qf1 v=$condQuery}"
OR
_query_:"{!edismax fq=$fq2 qf=$qf2 v=$condQuery}"
該查詢使用Parameter Dereferencing,所以有在將參數傳遞給solr之前,不需要手動轉義任何特殊字符。
- FQ1 - 第一特殊條件
- QF1 - 字段列表來搜索在第一個特殊條件(FQ1)
- FQ2 - 第二個特殊條件
- QF2 - 用於搜索第一特殊情況的字段列表(fq2)
- condQuery - 實際的搜索項/查詢
的FQ1可能是爲了定義一個基線空(在此特定情況下 - 在product
在text
和title
搜索,但不是)。
原始參數本身看起來方式如下:
fq1=&qf1=text^0.5 title^10.0&fq2=author:"Tom"&qf2=text^0.5 title^10.0 Product&condQuery=5
,最終查詢將是這樣的:
http://localhost:8983/solr/collection1/select?q=_query_%3A%22%7B!edismax+fq%3D%24fq1+qf%3D%24qf1+v%3D%24condQuery%7D%22+OR+_query_%3A%22%7B!edismax+fq%3D%24fq2+qf%3D%24qf2+v%3D%24condQuery%7D%22&fl=*%2Cscore&wt=xml&indent=true&fq1=&qf1=text^0.5%20title^10.0&fq2=author:%22Tom%22&qf2=text^0.5%20title^10.0%20Product&condQuery=5
..或相同的查詢由Solr的Solr中響應返回(僅用於以結構化方式顯示):
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">1</int>
<lst name="params">
<str name="q">_query_:"{!edismax fq=$fq1 qf=$qf1 v=$condQuery}" OR _query_:"{!edismax fq=$fq2 qf=$qf2 v=$condQuery}"</str>
<str name="condQuery">5</str>
<str name="indent">true</str>
<str name="fl">*,score</str>
<str name="fq1"/>
<str name="qf1">text^0.5 title^10.0</str>
<str name="fq2">author:"Tom"</str>
<str name="qf2">text^0.5 title^10.0 Product</str>
<str name="wt">xml</str>
</lst>
</lst>
<result name="response" numFound="..." start="..." maxScore="...">
...
</result>
</response>
即使它起作用,我建議考慮它對查詢時間的影響(因爲每個條件都會有一個單獨的內部搜索查詢)並測量它如何影響您的特定情況。
謝謝,我一直在想如何實現這個! – Vince 2015-09-22 21:17:59