2016-05-10 36 views
0

我們已經在我們的schema.xml以下設置:Solr的升壓查詢和內部最新日期

<field name="last_modified" type="date" indexed="true" stored="true" multiValued="false" omitTermFreqAndPositions="true"/> 
... 

<field name="prefix" type="string" indexed="true" stored="true" omitTermFreqAndPositions="true"/> 

我們的目標是通過

  1. PREFIX = 9999與最新的文檔進行排序文檔(最後修改)第一
  2. 前綴= 1004或前綴= 1005與最新文檔(最後修改)第一

我們代碼:

{!boost b=recip(ms(NOW,last_modified),3.16e11,1,1)}prefix:9999^1000000 OR {!boost b=recip(ms(NOW,last_modified),3.16e-11,1,1)}prefix:1004^600000 OR {!boost b=recip(ms(NOW,last_modified),3.16e-11,1,1)}prefix:1005^600000 

結果: 上面的查詢不能按預期工作!

我們認爲omitTermFreqAndPositions = true會強制阻止ITF並且評分應該起作用。但它似乎並不如此! 請幫助我們:-)

回答

1

所以我們找到了解決方案!

  1. 創建自己的相似性(一個簡單的Java類) 爲了更好的和更簡單的描述方法,請閱讀How to compile a custom similarity class for SOLR/Lucene using Eclipse

我們使用

package com.luxactive; 
import org.apache.lucene.index.FieldInvertState; 
import org.apache.lucene.search.similarities.DefaultSimilarity; 

public class MyNewSimilarityClass extends DefaultSimilarity { 

@Override 
public float coord(int overlap, int maxOverlap) { 
    return 1.0f; 
} 

@Override 
public float idf(long docFreq, long numDocs) { 
    return 1.0f; 
} 

@Override 
public float lengthNorm(FieldInvertState arg0) { 
    return 1.0f; 
} 

@Override 
public float tf(float freq) { 
    return 1.0f; 
} 

} 
  • 用相似度創建一個簡單的罐子
  • 將罐子複製到您的solr服務器的任何文件夾,我們使用: 個SOLRFOLDER/solr-4.8.0/example/solr/dih
  • 接下來的步驟需要完成,以每收集你!

  • 編輯solrconfig.xml中於:SOLRFOLDER/solr-4.8.0/example/solr/collection/conf/solrconfig.xml
    添加<lib dir="../dih" regex=".*\.jar" />導入自定義罐子
  • 編輯schema.xml中在同一文件夾
  • 添加以下

    <!-- DEFAULT Factory for custom com.luxactive.MyNewSimilarityClass --> 
    <similarity class="solr.SchemaSimilarityFactory"/> 
    
    <!-- TYPE String --> 
    <fieldType name="no_term_frequency_string" class="solr.StrField" sortMissingLast="true" > 
        <similarity class="com.luxactive.MyNewSimilarityClass"/> 
    </fieldType> 
    
    <!-- TYPE Date --> 
    <fieldType name="no_term_frequency_date" class="solr.TrieDateField" sortMissingLast="true" > 
        <similarity class="com.luxactive.MyNewSimilarityClass"/> 
    </fieldType> 
    
    <!-- TYPE Int--> 
    <fieldType name="no_term_frequency_int" class="solr.TrieIntField" sortMissingLast="true" > 
        <similarity class="com.luxactive.MyNewSimilarityClass"/> 
    </fieldType> 
    

    在這裏,你定義自己的字段類型(int,字符串和日期)使用新的相似度類將返回一個提升值LIK e在MyNewSimilarityClass中定義。

    1. 現在,通過將您的自定義類型設置爲您創建的類型來編輯要使用自定義類似的字段。
      來源:<field name="last_modified" type="date" indexed="true" stored="true" multiValued="false" />
      爲:<field name="last_modified" type="no_term_frequency_date" indexed="true" stored="true" multiValued="false" />
    2. 重新啓動Solr的服務器,並享受您的提升:)