Elasticsearch 6.2.3
У меня есть пользовательская реализация простого сходства (scala), которая возвращает только TF.
/**
* Phrase frequency similarity
*/
object PFSimilarity extends Similarity {
val Name = "pf-similarity"
case class TFWeight(boost: Float) extends SimWeight
override def computeNorm(state: FieldInvertState): Long = 1L
override def computeWeight(boost: Float, collectionStats: CollectionStatistics, termStats: TermStatistics*): SimWeight =
TFWeight(boost)
override def simScorer(weight: Similarity.SimWeight, context: LeafReaderContext): Similarity.SimScorer = {
val boost = weight.asInstanceOf[TFWeight].boost
new Similarity.SimScorer() {
override def score(doc: Int, freq: Float): Float = boost * freq
override def explain(doc: Int, freq: Explanation): Explanation = {
val pfExpl = Explanation.`match`(boost * freq.getValue, "query boost * phrase freq")
Explanation.`match`(pfExpl.getValue, s"score(${PFSimilarity.getClass.getSimpleName}, doc=$doc), computed from:", pfExpl)
}
override def computeSlopFactor(distance: Int): Float = 1f
override def computePayloadFactor(doc: Int, start: Int, end: Int, payload: BytesRef): Float = 1f
}
}
}
object PfSimilarityProvider extends SimilarityProvider {
override def name(): String = PFSimilarity.Name
override def get(): Similarity = PFSimilarity
}
Когда я переключаюсь с одного сходства на другое , закрывиндекс, изменение настроек и повторное открытие , fieldLength может измениться на 1, и поэтому оценка поиска будет искажена.
Я устанавливаю «pf-Similarity» по умолчанию, затем индексирую статью, затем переключаювернуться к сходству по умолчанию (BM25).Оценка BM25 искажена, потому что fieldLength = 1, даже если текст длинный.Когда я индексирую статью, когда установлено сходство BM25, fieldLength имеет правильное значение.
Поврежденная оценка: 
Правильная оценка: 
Не понимаю, почему это произошло.Может кто-нибудь помочь мне объяснить?Мне также интересно, могу ли я исправить эти испорченные статьи.