Я использую StandardAnalyzer для индексации своего текста. Однако во время запроса я выполняю запрос термина и фразы. Для термина-запроса и фразового запроса, я считаю, что lucene не имеет проблем при вычислении termfrequency и частоты фразы. Однако это хорошо для таких моделей, как сходство Дирихле. Для моделей BM25Similarity или TFIDFS, им нужны IDF (термин) и IDF (фраза). Как lucene справляется с этой проблемой?Lucene scoring for Phrase Query
ответ
Фрагмент TFIDFS, основанный на IDF, рассчитывается как сумма IDF его составляющих терминов. То есть: idf("ab cd") = idf(ab) + idf(cd)
Это значение затем умножается на частоту фразы и обрабатывается очень как термин для целей подсчета очков.
Чтобы посмотреть всю историю, я думаю, что имеет смысл взглянуть на пример. IndexSearcher.explain
является очень полезным инструментом для понимания озвучивания:
Индекс:
- документ 0: текст аб уникальный
- документ 1: текст
- документ 2: текст AB CD текст аб
- документ 3: текст
запрос: "text ab" unique
Explain
выход первого (верхнего забил) удара (док 0):
1.3350155 = (MATCH) sum of:
0.7981777 = (MATCH) weight(content:"text ab" in 0) [DefaultSimilarity], result of:
0.7981777 = score(doc=0,freq=1.0 = phraseFreq=1.0
), product of:
0.7732263 = queryWeight, product of:
2.0645385 = idf(), sum of:
0.7768564 = idf(docFreq=4, maxDocs=4)
1.287682 = idf(docFreq=2, maxDocs=4)
0.37452745 = queryNorm
1.0322692 = fieldWeight in 0, product of:
1.0 = tf(freq=1.0), with freq of:
1.0 = phraseFreq=1.0
2.0645385 = idf(), sum of:
0.7768564 = idf(docFreq=4, maxDocs=4)
1.287682 = idf(docFreq=2, maxDocs=4)
0.5 = fieldNorm(doc=0)
0.5368378 = (MATCH) weight(content:unique in 0) [DefaultSimilarity], result of:
0.5368378 = score(doc=0,freq=1.0 = termFreq=1.0
), product of:
0.6341301 = queryWeight, product of:
1.6931472 = idf(docFreq=1, maxDocs=4)
0.37452745 = queryNorm
0.8465736 = fieldWeight in 0, product of:
1.0 = tf(freq=1.0), with freq of:
1.0 = termFreq=1.0
1.6931472 = idf(docFreq=1, maxDocs=4)
0.5 = fieldNorm(doc=0)
Обратите внимание, что в первой половине, имеем дело с забив "text ab"
часть запроса очень тот же алгоритм, как вторая половина (оценка unique
), за исключением добавленного суммирования для вычисления фразы idf.
Explain
выход второго удара (для хорошей меры) (документ 2):
0.49384725 = (MATCH) product of:
0.9876945 = (MATCH) sum of:
0.9876945 = (MATCH) weight(content:"text ab" in 2) [DefaultSimilarity], result of:
0.9876945 = score(doc=2,freq=2.0 = phraseFreq=2.0
), product of:
0.7732263 = queryWeight, product of:
2.0645385 = idf(), sum of:
0.7768564 = idf(docFreq=4, maxDocs=4)
1.287682 = idf(docFreq=2, maxDocs=4)
0.37452745 = queryNorm
1.277368 = fieldWeight in 2, product of:
1.4142135 = tf(freq=2.0), with freq of:
2.0 = phraseFreq=2.0
2.0645385 = idf(), sum of:
0.7768564 = idf(docFreq=4, maxDocs=4)
1.287682 = idf(docFreq=2, maxDocs=4)
0.4375 = fieldNorm(doc=2)
0.5 = coord(1/2)
- 1. Lucene Scoring function
- 2. Lucene Custom Scoring
- 3. lucene custom scoring
- 4. Lucene Scoring механизм
- 5. Apache Custom Lucene Scoring
- 6. lucene vs solr scoring
- 7. Lucene EdgeNGramTokenFilter scoring
- 8. Scoring документы в Lucene 6.2.0
- 9. Lucene scoring: получить подобие косинуса как оценки
- 10. Tune solr phrase query search
- 11. Lucene - Scoring effect on count count
- 12. ElasticSearch: Bool Query Scoring Issue
- 13. Lucene Scoring: TermQuery w & w/o TermVectors
- 14. Lucene scoring: в каком контексте используется queryNorm?
- 15. Seach website for phrase in R
- 16. Lucene Basic Search Phrase Не взвешенно с полным сообщением
- 17. Lucene Sample Query
- 18. Escaping for Lucene не работает
- 19. Lucene Query WITHOUT Operators
- 20. Lucene boost & proximity query
- 21. Lucene Query Parser
- 22. BlockJoin Query in lucene
- 23. Lucene term query
- 24. Elasticsearch lucene query
- 25. lucene join query
- 26. Query Expansion lucene
- 27. Lucene Query Синтаксис Поиск
- 28. Lucene запросов Query
- 29. lucene wikipedia query
- 30. Lucene «Ends with» query
Это здорово. Всего пару вопросов. 1) вы имеете в виду idf ("ab") = phraseFreq ("ab") * (idf (a) + idf (b)? Удивление, если idf ("ab") = N/min (df (a), df (b)) будет иметь смысл? Сохраняется ли это даже для SpanQuery? – user835956
1: Нет, это будет fieldWeight, являющийся продуктом tf и idf. 2: Имейте в виду, id id Lucene не просто '1/df ', это на самом деле' 1 + log (numdocs/(1 + df)) '. 3: Да, это справедливо и для SpanQueries. – femtoRgon