Я пытаюсь решить проблему поиска ближайшего соседа. Вот мой код:Lucene scoring: получить подобие косинуса как оценки
// Indexing
val analyzer = new StandardAnalyzer()
val directory = new RAMDirectory()
val config = new IndexWriterConfig(analyzer)
val iwriter = new IndexWriter(directory, config)
val queryField = "fieldname"
stringData.foreach { str =>
val doc = new Document()
doc.add(new TextField(queryField, str, Field.Store.YES))
iwriter.addDocument(doc)
}
iwriter.close()
// Searching
val ireader = DirectoryReader.open(directory)
val isearcher = new IndexSearcher(ireader)
val parser = new QueryParser(queryField, analyzer)
val query = parser.parse("Some text for testing")
val hits = isearcher.search(query, 10).scoreDocs
Когда я смотрю на хитах значения я вижу оценки более 1.
Насколько я знаю, Lucene скоринг формула:
score(q,d) = coord-factor(q,d) · query-boost(q) · cosSim(q,d) · doc-len-norm(d) · doc-boost(d)
Но Я хочу получить только сходство с косинусом в диапазоне [0,1] между запросом и документом вместо координатного фактора, doc-len-norm и так далее. Каков возможный способ его достижения?
Замечание: эта формула подобия больше не является значением по умолчанию. Начиная с версии 6.0, Lucene по умолчанию использует реализацию [BM25] (https://en.wikipedia.org/wiki/Okapi_BM25). Старое умолчание по-прежнему доступно, см. [Классическое сопоставление] (http://lucene.apache.org/core/6_2_1/core/org/apache/lucene/search/similarities/ClassicSimilarity.html) – femtoRgon