Solr Custom相似度

时间:2013-12-06 16:21:33

标签: solr similarity

我想在我的solr schema.xml中设置自己的自定义相似度,但我在理解此功能时遇到一些问题。 我想完全停用solr评分(tf,idf,coord和fieldNorm)。

我不知道从哪里开始。我知道的事情

  1. 我必须编写自己的DefaultSimilarity实现。
  2. 覆盖(tf,idf,coord和fieldNorm) - 方法。
  3. 在schem.xml中加载类
  4. 在哪里存放课程? 网络上有任何工作示例吗?我找不到一个!

    感谢

2 个答案:

答案 0 :(得分:12)

我自己想通了。我在solr中的/ dist /文件夹下存储了我自己的DefaultSimilarity实现。然后我将<lib dir="../../../dist/org/apache/lucene/search/similarities/" regex=".*\.jar"/>添加到我的solrconfig.xml中,一切正常。

package org.apache.lucene.search.similarities;
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;
}

}

要点:https://gist.github.com/FabianKoestring/7846845

答案 1 :(得分:0)

相似性changed in solr 8.0的实现。

这里是一个自solr 8起的示例。

public class CustomSimilarityFactory extends SchemaSimilarityFactory {

    @Override
    public Similarity getSimilarity() {
        return new CustomSimilarity();
    }

}

public class CustomSimilarity extends Similarity{

    private final SimScorer customSimScorer = new CustomSimScorer();

    @Override
    public long computeNorm(FieldInvertState fis) {
        return 1L;
    }

    @Override
    public SimScorer scorer(float f, CollectionStatistics cs, TermStatistics... tss) {
        return customSimScorer;
    }

}

public class CustomSimScorer extends SimScorer {

    @Override
    public float score(float f, long l) {
        return 1f;
    }

}

将您的库添加到solrconfig.xml <lib dir="/yourCustomDir/" regex=".*\.jar"/>中,并将您的自定义相似性添加到schema.xml <similarity class="com.christoph.solr.CustomSimilarityFactory"></similarity>