2012-04-25 52 views
1

我正在使用solrj API查詢我的SOLR 3.6索引。我有多個文本字段,我想以不同的方式加權。從我讀過的內容中,我應該可以使用dismax或edismax查詢類型來完成此操作。我試過以下內容:使用Solrj在SOLR中增強字段

SolrQuery query = new SolrQuery(); 
query.setQuery("title:apples oranges content:apples oranges"); 
query.setQueryType("edismax"); 
query.set("qf", "title^10.0 content^1.0"); 
QueryResponse rsp = m_Server.query(query); 

但是這不起作用。我試過以下的變化來設置查詢類型,但它似乎沒有什麼區別。

query.setQueryType("dismax"); 
query.set("qt","dismax"); 
query.set("type","edismax"); 
query.set("qt","edismax"); 
query.set("type","dismax"); 

我想保留完整的Lucene查詢語法,所以我更喜歡ExtendedDisMax到DisMax。 在查詢中增加單個詞語(如下所示)確實有效,但不是有效的解決方案,因爲查詢是自動生成的並且可以任意複雜。

query.setQuery("title:apples^10.0 oranges^10.0 content:apples oranges"); 

任何幫助將不勝感激。

回答

6

最好的辦法是在你的solrconfig.xml中定義一個請求處理程序一樣 -

<requestHandler name="search" class="solr.SearchHandler" default="true"> 
<lst name="defaults"> 
    <str name="echoParams">explicit</str> 
    <str name="defType">dismax</str> 
    <str name="qf"> 
     title^1 content^0.8 
    </str> 
    <str name="q.alt">*:*</str> 
    <str name="rows">10</str> 
    <str name="fl">*,score</str> 
</lst> 
</requestHandler> 

而且利用qt參數來定義請求處理程序 -

query.set("qt","search"); 

您可以微調升壓只需更改solr config xml配置並重新加載內核即可進行配置。

+0

你也可以使用'query.setQueryType(「搜索「)'而不是'query.set(」qt「,」search「)'。 – javanna 2012-04-26 08:18:07

+0

謝謝Jayendra。我試着按照你的建議創建一個新的請求處理程序,但代碼似乎總是使用現有的請求處理程序(示例配置文件中的默認「/ select」)。通過修改現有的請求處理程序,我能夠得到這個工作。但這意味着我無法在查詢類型之間進行選擇。 – Joe 2012-04-27 21:07:15

+0

啊,終於得到了這份工作。上面的解決方案或多或少是正確的。在深入源代碼之後,我意識到我需要將requestHandler的名稱設置爲「/ search」和query.set(「qt」,「/ search」)。 QueryRequest顯式查找「/」,否則默認使用「/ select」。 – Joe 2012-04-27 23:30:25

3

你應該能夠以編程方式。

如果你有定義的處理程序:

<requestHandler name="dismax_nl" class="solr.SearchHandler"> <lst name="defaults"> <str name="defType">dismax</str> 

和下面的代碼

solrQuery.put("defType", "dismax"); 
solrQuery.put("qf", "comments_nl^20 id^1 name_nl^1 description_nl^0.2 url_nl^0.5 text^0.1"); 

保持您的查詢簡單。 qf定義(加權)字段。你應該也可以在上面的例子中設置qt = dismax_nl而不是deftype = dismax(這可能更好,但是我已經顯示的是我知道的東西)