2009-10-29 85 views
4

我有一組包含我想要索引的評分項目的文檔。我們的數據結構如下:增強多值字段

Document 
    ID 
    Text 
    List<RelatedScore> 

RelatedScore 
    ID 
    Score 

我首先想到的是給每個RelatedScore添加爲使用現場的升壓屬性搜索時修改特定分數值的多值字段。

foreach (var relatedScore in document.RelatedScores) { 
    var field = new Field("RelatedScore", relatedScore.ID, 
         Field.Store.YES, Field.Index.UN_TOKENIZED); 
    field.SetBoost(relatedScore.Score); 
    luceneDoc.Add(field); 
} 

然而,似乎所有的計算「規範」適用於整個多場 - 所有的文檔RelatedScore」的價值觀最終將不得不以同樣的比分

有沒有。機制在Lucene中允許這個功能嗎?我寧願不創建另一個索引來解釋這一點 - 感覺應該有一種使用單一索引的方法如果沒有辦法來實現這一點,我們必須補償的是:

  1. 插入多值字段i按降序排列的順序。然後以某種方式添加位置感知分析,以將更高的提升/分數分配給該字段中的第一項。
  2. 多次向該字段添加高分值。因此,Score Score爲1的RelatedScore可能會添加三次,而Score Score.3的Score只會添加一次。

這些都會導致搜索保真度在這些領域的損失,是的,但他們可能已經足夠好了。對此有何想法?

回答

3

這似乎是有效載荷的用例。我不確定這是否可用於Lucene.NET,因爲我只使用Java版本。

如果分數的絕對值並不重要,那麼這種做法的另一種方法是將它們離散化(根據值將它們放入桶中)併爲每個桶創建一個字段。因此,如果您的分數介於1到100之間,請創建10個存儲桶,稱爲RelatedScore0_10,RelatedScore10_20等,對於該存儲桶中具有RelatedScore的任何文檔,請在該字段中添加一個「true」值。那麼對於每一個被執行一樣的OR查詢粘性搜索:

(RelatedScore0_10:true^1 RelatedScore10_20:true^2 ...) 

關於這樣做的好處是,你可以調整在飛行的桶中的每一個升壓值。否則,您需要重新索引以更改每個字段的字段標準(增強)值。

+0

我能夠使用Payload存儲分數並通過自定義相似性對象使用它。一旦我開始尋找這個方向,我發現Grant Ingersoll最近在這裏發佈了一篇關於這個話題的文章:http://www.lucidimagination.com/blog/2009/08/05/getting-started-with-payloads/ –

+0

Nowadays正確的鏈接是http://lucidworks.com/blog/refresh-getting-started-with-payloads/ – user3159253

0

如果你使用Lucene.Net,你可能還沒有有效載荷功能。你可以做的是將0-100相關度分數轉換爲1-10(整數除以10)的桶,然後多次添加每個索引值(但只存儲一次)。然後,如果您搜索該字段,lucene內置評分將考慮索引字段的頻率(根據相關性將其索引1-10次)。因此結果可以通過變量相關性進行排序。

foreach (var relatedScore in document.RelatedScores) { 
    // get bucket for relevance... 
    int bucket=relatedScore.Score/10; 

    var field = new Field("RelatedScore", relatedScore.ID, 
         Field.Store.YES, Field.Index.UN_TOKENIZED); 
    luceneDoc.Add(field); 
    // add more instances of field but only store the first one above... 
    for(int i=0;i<bucket;i++) 
    { 
    luceneDoc.Add(new Field("RelatedScore", relatedScore.ID, 
         Field.Store.NO, Field.Index.UN_TOKENIZED)); 
    } 
}