2011-09-28 57 views
0

我爲我的Solr數據庫中的每個文檔分配自定義「流行度」分數。我希望搜索結果由此自定義「分數」字段排序,而不是默認的內置相關性分數。Solr中的自定義分數排序不會一致排序

首先,我定義我的得分字段:

<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/> 
<field name="score" type="sint" stored="true" multiValued="false" /> 

然後我重建索引,將每個文檔的得分。 要運行一個查詢,我用的是這樣的:

(text:hello)+_val_:"score" 

現在我希望的文件來用「分數」外地趕回來分類的,但我得到的卻是:

<doc> 
    <int name="score">566</int> 
    <str name="text">SF - You lost me at hello...</str> 
</doc> 
<doc> 
    <int name="score">41</int> 
    <str name="text">hello</str> 
</doc> 
<doc> 
    <int name="score">77</int> 
    <str name="text"> 
    CAGE PAGE-SAY HELLO (MIKE GOLDEN's Life Is Bass Remix)-VIM 
    </str> 
</doc> 
<doc> 
    <int name="score">0</int> 
    <str name="text">Hello Hello Hello</str> 
</doc> 

請注意,分數回到了無序狀態:566,41,77,0。奇怪的是,它只是通過某種查詢來排序。我不確定該模式是什麼,但到目前爲止,只有當分數「0」返回到搜索結果中時,纔會看到排序錯誤。

我試過IntField而不是SortableIntField,而且我試過把「sort = score desc」作爲查詢參數,而沒有改變行爲。

我做錯了什麼,或者只是誤解使用val:我的查詢中的「分數」的含義?

編輯:我試圖重命名「分數」字段「流行」,並得到了相同的結果。

回答

2

評分字段由Solr內部使用,因此可能不是使用相同字段名定義字段的好習慣。
你可以嘗試定義一個不同字段名稱的字段,並且你提到的兩個選項都可以正常工作。

編輯 - 這是我和工作正常(Solr的3.3)

模式 -

字段類型 -

<fieldType name="sint" class="solr.SortableIntField" sortMissingLast="true" omitNorms="true"/> 

場 -

<field name="popularity" type="int" indexed="true" stored="true" /> 

數據 -

<add> 
    <doc> 
     <field name="id">1007WFP</field> 
     <field name="popularity">566</field> 
     <field name="text">SF - You lost me at hello...</field> 
    </doc> 
    <doc> 
     <field name="id">2007WFP</field> 
     <field name="popularity">41</field> 
     <field name="text">hello</field> 
    </doc> 
    <doc> 
     <field name="id">3007WFP</field> 
     <field name="popularity">77</field> 
     <field name="text"> 
     CAGE PAGE-SAY HELLO (MIKE GOLDEN's Life Is Bass Remix)-VIM 
     </field> 
    </doc> 
    <doc> 
     <field name="id">4007WFP</field> 
     <field name="popularity">0</field> 
     <field name="text">Hello Hello Hello</field> 
    </doc> 
</add> 

查詢 -

http://localhost:8983/solr/select?q=*:*&sort=popularity%20desc 

結果: -

<result name="response" numFound="4" start="0"> 
    <doc> 
    <str name="id">1007WFP</str> 
    <int name="popularity">566</int> 
    </doc> 

    <doc> 
    <str name="id">3007WFP</str> 
    <int name="popularity">77</int> 
    </doc> 
    <doc> 
    <str name="id">2007WFP</str> 
    <int name="popularity">41</int> 

    </doc> 
    <doc> 
    <str name="id">4007WFP</str> 
    <int name="popularity">0</int> 
    </doc> 
</result> 
+0

對不起,但我試圖重命名字段'流行',重建索引,並得到相同的結果。 – cwick

+0

此外,不要看到字段被標記爲真,這將不允許在字段上排序,並會拋出錯誤。 – Jayendra

+0

我試着用indexed =「true」和indexed =「false」,它沒有效果。我沒有收到indexed =「false」的錯誤消息。 – cwick

0

的_val_實際上黑客添加了 「人氣」 字段到Solr的正常計算出的分數。因此,如果你對文檔A的流行度= 41,對文檔B的流行度= 77,但對於關鍵詞「你好」,文檔A的得分比B好36分以上,那麼他們會先用A排序B.

使用「排序」字段(與您一樣),完全覆蓋按正常排序的分數。

另一種方法是使用過濾器查詢(參數fq而不是q),該過濾器查詢過濾匹配文檔而不計算任何分數,然後使用_val_來定義您的評分公式。由於使用篩選器查詢,所有檢索到的文檔將得分爲零,因此_val_將不受影響並按您最初的預期運行。