2014-09-29 169 views
0

是否可以根據特定條件在Solr中定義查詢字段?對於例如我有三個字段的文字,標題和產物。Solr的配置定義:Solr條件查詢字段(qf)

<str name="qf">text^0.5 title^10.0 Product</str> 

我正在尋找在這裏是有「產品」,因爲只有當某些條件得到滿足,對於例如搜索領域如果作者:「湯姆」,然後搜索產品。

有沒有辦法在查詢時使用edismax做到這一點?

我使用的替代方法是在索引期間將產品信息添加到文檔或文檔的標題(其中author = Tom),以便可搜索。但是,如果可能的話,我試圖避免這種情況。

任何指針將不勝感激。

-Thanks

回答

5

爲了根據不同的條件在不同的領域進行搜索,需要首先搜索特定的條件,因此它與發出多個查詢差不多。


這就是說,如果有必要做它作爲一個一次性的查詢(例如,用於外的現成排序/分組/其他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可能是爲了定義一個基線空(在此特定情況下 - 在producttexttitle搜索,但不是)。

原始參數本身看起來方式如下:

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> 

即使它起作用,我建議考慮它對查詢時間的影響(因爲每個條件都會有一個單獨的內部搜索查詢)並測量它如何影響您的特定情況。

+0

謝謝,我一直在想如何實現這個! – Vince 2015-09-22 21:17:59

0

Shamik,

我不認爲是可以實現的是有辦法在Solr中做到這一點很簡單。有一點需要考慮的是加班時間管理這些規則,這對大型系統來說是一場噩夢。

如果你真的想這樣做,也許你可以發出兩個調用Solr來獲得結果集。