私はSOLR 5.3.1バージョンを持っています。一致する用語が多いドキュメントを最初に表示したいと思います。
この目的のために、スキーマのすべてのフィールドに omitNorms= true を適用しました。Custom Similarity クラスも実装しました。私の類似度クラスは次のようになります。
package org.apache.lucene.search.similarities;
import org.apache.lucene.index.FieldInvertState;
public class MyDefaultSimilarity extends DefaultSimilarity{
@Override
public float idf(long docFreq, long numDocs) {
return 0.5f;
}
@Override
public float lengthNorm(FieldInvertState arg0) {
return 0.5f;
}
@Override
public float tf(float freq) {
return 0.5f;
}
@Override
public float coord(int overlap, int maxOverlap) {
System.out.println("Coord:"+Math.pow(super.coord(overlap, maxOverlap),2));
return (float)Math.pow(super.coord(overlap, maxOverlap),2);
}
}
類似度クラスの schema.xml に次の変更を加えました。
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
//define custom similarity class there
<similarity class="org.apache.lucene.search.similarities.MyDefaultSimilarity"> </similarity>
</fieldType>
//define global similarity class there
<similarity class="solr.SchemaSimilarityFactory"/>
類似度クラスの solrconfig.xml に次の変更を加えました。
<lib dir="${solr.install.dir:../../../..}/dist/" regex="SimilaritySolr.*\.jar" />
クエリをデバッグしました。すべてのドキュメントのスコアが 1 に等しいことを引き続き示しています。デバッグ クエリの結果は、どのパラメータがスコアに影響を与えているかを示しています。
1.0 = *:*, product of:
1.0 = boost
1.0 = queryNorm
より多くの一致する用語を含むドキュメントのスコアを上げるために見逃したことが他にあれば教えてください。