关于Solr评分修改

经常有朋友在群里问,Solr 要修改打分机制怎么改?

大多数回答:Similarity 是个不错的方案。但是具体怎么弄很少有明确的描述,官方 wiki 也只是说可以自定义,具体如何做,没有例子。

Solr 4.0 内置的评分方法

首先,Solr 4.0 本身提供了多种评分方法:

  • org.apache.solr.search.similarities.BM25SimilarityFactory
  • org.apache.solr.search.similarities.DefaultSimilarityFactory
  • org.apache.solr.search.similarities.DFRSimilarityFactory
  • org.apache.solr.search.similarities.IBSimilarityFactory
  • org.apache.solr.search.similarities.LMDirichletSimilarityFactory
  • org.apache.solr.search.similarities.LMJelinekMercerSimilarityFactory
  • org.apache.solr.search.similarities.SchemaSimilarityFactory

每一个有什么不同不在今天讨论范围内,说下怎么配置。

配置示例

在 schema.xml 中配置:

1
2
3
4
5
6
7
8
<field name="bm25_test" type="text_bm25" indexed="true" stored="true" required="false" multiValued="true"/>

<fieldType name="text_bm25" class="solr.TextField">
<similarity class="solr.BM25SimilarityFactory">
</similarity>
</fieldType>

<similarity class="solr.SchemaSimilarityFactory"/>

bm25_test 字段就会按照 BM25SimilarityFactory 机制评分。

自定义评分

那么如何进一步自定义呢,不废话看代码:

1
2
3
4
5
6
7
8
9
10
package org.nlp.lucene.search.similarities;

import org.apache.lucene.search.similarities.Similarity;
import org.apache.solr.schema.SimilarityFactory;

public class NlpSimilarityFactory extends SimilarityFactory {
public Similarity getSimilarity() {
return new NlpSimilarity();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package org.nlp.lucene.search.similarities;

import org.apache.lucene.search.similarities.DefaultSimilarity;

public class NlpSimilarity extends DefaultSimilarity {

@Override
// idf 值全部为 1.0f
public float idf(long docFreq, long numDocs) {
return 1.0F;
}

@Override
// tf 值全部为 1.0f
public float tf(float freq) {
return 1.0F;
}

@Override
public String toString() {
return "nlpSimilarity";
}
}

SimilarityFactory 照葫芦画瓢就是,NlpSimilarity 可以重写哪些方法看一下 DefaultSimilarity 就好,当然 BM25SimilarityFactory 这些都是可以搞的,自己看着办吧,哥只能帮你到这里了。

如何验证评分修改

什么,怎么确定评分的修改是否生效?

查询的时候加上参数 debug=true 就好。

© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero