簡體   English   中英

Solr / Lucene得分手

[英]Solr/Lucene Scorer

我們目前正在為使用Solr的客戶進行概念驗證,並且能夠配置除評分之外的所有功能。

問題是他們想要得分使結果落在桶中:

  • 鏟斗1:類別完全匹配(得分= 4)
  • 鏟斗2:名稱完全匹配(得分= 3)
  • 第3欄:類別的部分匹配(得分= 2)
  • Bucket 4:名稱部分匹配(得分= 1)

我們做的第一件事就是開發一個自定義相似度類,它會根據字段和精確或部分匹配返回正確的分數。

現在唯一的問題是,當文檔在類別和名稱上匹配時,分數會加在一起。

示例:搜索“餐館”會返回類別餐廳中的文檔,這些文檔在其名稱中也包含“餐廳”字樣,因此得分為5(4 + 1),但它們只能得到4。

我假設為了這個工作,我們需要開發一個自定義的Scorer類,但我們不知道如何在Solr中加入它。 另一種選擇是創建一個類似於Solr中已存在的RandomSortField的自定義SortField實現。

也許甚至還有一個我們不了解的簡單解決方案。

歡迎所有建議!

記分器是通過'權重'查詢方法的lucene查詢的一部分。

簡而言之,框架調用Query.weight(..)。scorer(..)。 看一下

http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Query.html

http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Weight.html

http://lucene.apache.org/jva/2_4_0/api/org/apache/lucene/search/Scorer.html

要在Solr中使用自己的Query類,您需要實現自己的solr QueryParserPlugin,它使用您自己的QParser生成以前實現的lucene Query。 然后,您可以在此處指定的Solr中使用它:

http://wiki.apache.org/solr/SolrPlugins#QParserPlugin

這部分實現應該保持簡單,因為這只是一些粘合代碼。

享受黑客索爾!

您可以覆蓋邏輯solr得分者使用的。 Solr使用DefaultSimilarity類進行評分。

  • 創建一個擴展DefaultSimilarity的類,並根據需要覆蓋函數tf(),idf()等:

     public class CustomSimilarity extends DefaultSimilarity { public CustomSimilarity() { super(); } public float tf(int freq) { //your code return (float) 1.0; } public float idf(int docFreq, int numDocs) { //your code return (float) 1.0; } } 

  • 創建類后編譯並制作一個jar。
  • 將jar放在相應索引或核心的lib文件夾中。
  • 更改相應索引的schema.xml: <similarity class="<your package name>.CustomSimilarity"/>
  • 您可以在此處查看影響分數的各種因素

    根據您的要求,如果您的分數在特定范圍內,您可以創建存儲桶。 另請閱讀有關現場助推,文檔提升等信息。這可能對您的情況有所幫助。

    謝謝你上面的好答案。 在Solr 4.2.1中進行設置后,只需添加它們,即允許每個字段的相似性。 (在Solr 4之前,您只能改變全局所有字段的相似性。)

    假設我們希望Solr不對特定字段使用逆文檔頻率(idf) - 我們應該為此編寫自己的自定義相似度,如上所述:

    package com.mycompany.similarity;
    
    import org.apache.lucene.search.similarities.DefaultSimilarity;
    
    public class NoIDFSimilarity extends DefaultSimilarity
    {
        @Override
        public float idf(long docFreq, long numDocs)
        {
            return 1.0f;
        }
    
        @Override
        public String toString()
        {
            return "NoIDFSimilarity";
        }
    }
    

    然后在我們的schema.xml中定義一個新的fieldType,如下所示:

    <fieldType name="int_no_idf" 
               class="solr.TrieIntField" 
               precisionStep="0" 
               positionIncrementGap="0" 
               omitNorms="true">
        <similarity class="com.mycompany.similarity.NoIDFSimilarity"/>
    </fieldType>
    

    並在像這樣的字段上使用它:

    <field name="tag_id_no_idf" 
           type="int_no_idf" 
           indexed="true" 
           stored="false" 
           multiValued="true" />
    

    如果我們只做了這么多,那么你將得到以下異常:

    SEVERE: Unable to create core: SimilarList
    org.apache.solr.common.SolrException: FieldType 'int_no_idf' is configured with a similarity, but the global similarity does not support it: class org.apache.solr.search.similarities.DefaultSimilarityFactory
        at org.apache.solr.schema.IndexSchema.readSchema(IndexSchema.java:466)
        at org.apache.solr.schema.IndexSchema.<init>(IndexSchema.java:122)
        at org.apache.solr.core.CoreContainer.createFromLocal(CoreContainer.java:1018)
        at org.apache.solr.core.CoreContainer.create(CoreContainer.java:1051)
        at org.apache.solr.core.CoreContainer$3.call(CoreContainer.java:634)
        at org.apache.solr.core.CoreContainer$3.call(CoreContainer.java:629)
        at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
    Apr 25, 2013 5:02:08 PM org.apache.solr.common.SolrException log
    SEVERE: null:org.apache.solr.common.SolrException: Unable to create core: SimilarList
        at org.apache.solr.core.CoreContainer.recordAndThrow(CoreContainer.java:1672)
        at org.apache.solr.core.CoreContainer.create(CoreContainer.java:1057)
        at org.apache.solr.core.CoreContainer$3.call(CoreContainer.java:634)
        at org.apache.solr.core.CoreContainer$3.call(CoreContainer.java:629)
        at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)
    Caused by: org.apache.solr.common.SolrException: FieldType 'int_no_idf' is configured with a similarity, but the global similarity does not support it: class org.apache.solr.search.similarities.DefaultSimilarityFactory
        at org.apache.solr.schema.IndexSchema.readSchema(IndexSchema.java:466)
        at org.apache.solr.schema.IndexSchema.<init>(IndexSchema.java:122)
        at org.apache.solr.core.CoreContainer.createFromLocal(CoreContainer.java:1018)
        at org.apache.solr.core.CoreContainer.create(CoreContainer.java:1051)
        ... 10 more
    

    谷歌搜索引導您到此 ,所以只需在schema.xml中添加此行,該行將應用於其余字段:

    <similarity class="solr.SchemaSimilarityFactory"/>
    

    (從該鏈接:但請記住,coord和queryNorm(= 1.0f)現在沒有實現,因此您將獲得TF-IDF的不同分數!)

    暫無
    暫無

    聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM