Lucene: сначала не отображаются точные совпадения

Я использую демонстрационные классы IndexFiles и SearchFiles для индексации и поиска, которые находятся в пакете org.apache.lucene.demo.

Моя проблема заключается в том, что когда я использую запрос, содержащий более одного слова, я не получаю результатов, которые имеют точное совпадение. Например:

Enter query:
"natural language"
Searching for: "natural language"
298 total matching documents
1. download\researchers.uq.edu.au\fields-of-research\natural-language-processing
.txt
2. download\researchers.uq.edu.au\research-project\16267.txt
3. download\researchers.uq.edu.au\research-project\16279.txt
4. download\researchers.uq.edu.au\research-project\18361.txt
5. download\www.uq.edu.au\news\%3Farticle%3D2187.txt
6. download\researchers.uq.edu.au\researcher\2115.txt
7. download\ceit.uq.edu.au\content\2013-2014-summer-research-scholarship-project
s-dr-alan-cody%3Fpage%3D1.txt
8. download\ceit.uq.edu.au\content\2013-2014-summer-research-scholarship-project
s-dr-alan-cody%3Fpage%3D2.txt
9. download\ceit.uq.edu.au\content\2013-2014-summer-research-scholarship-project
s-dr-alan-cody.txt
10. download\www.ceit.uq.edu.au\content\2013-2014-summer-research-scholarship-pr
ojects-dr-alan-cody.txt
Press (n)ext page, (q)uit or enter number to jump to a page.

не имеет таких же результатов, как:

Enter query:
natural language
Searching for: natural language
54307 total matching documents
1. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D190.txt

2. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D576.txt

3. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D46.txt
4. download\espace.library.uq.edu.au\view\UQ%3A166163.txt
5. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D108.txt

6. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D70.txt
7. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D708.txt

8. download\researchers.uq.edu.au\fields-of-research\natural-language-processing
.txt
9. download\researchers.uq.edu.au\research-project\16267.txt
10. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D117.tx
t
Press (n)ext page, (q)uit or enter number to jump to a page.

Например, первый соответствующий документ даже не содержит ключевого слова «язык».

Если я использую метод explain() в классе IndexSearcher, то я получаю этот результат для 1-го:

1. download\cyberschool.library.uq.edu.au\display_resource.phtml%3Frid%3D190.txt
0.70643383 = (MATCH) sum of:
  0.5590494 = (MATCH) weight(contents:natural in 62541) [DefaultSimilarity], result of:
    0.5590494 = score(doc=62541,freq=4.0 = termFreq=4.0
), product of:
      0.8091749 = queryWeight, product of:
        4.4216847 = idf(docFreq=13111, maxDocs=401502)
        0.18300149 = queryNorm
      0.6908882 = fieldWeight in 62541, product of:
        2.0 = tf(freq=4.0), with freq of:
          4.0 = termFreq=4.0
        4.4216847 = idf(docFreq=13111, maxDocs=401502)
        0.078125 = fieldNorm(doc=62541)
  0.1473844 = (MATCH) weight(contents:language in 62541) [DefaultSimilarity], result of:
    0.1473844 = score(doc=62541,freq=1.0 = termFreq=1.0
), product of:
      0.5875679 = queryWeight, product of:
        3.2107275 = idf(docFreq=44012, maxDocs=401502)
        0.18300149 = queryNorm
      0.25083807 = fieldWeight in 62541, product of:
        1.0 = tf(freq=1.0), with freq of:
          1.0 = termFreq=1.0
        3.2107275 = idf(docFreq=44012, maxDocs=401502)
        0.078125 = fieldNorm(doc=62541)

Если я нажму «Далее» и найду такой результат:

19. download\www.uq.edu.au\news\%3Farticle%3D2187.txt
0.47449595 = (MATCH) sum of:
  0.2795247 = (MATCH) weight(contents:natural in 35173) [DefaultSimilarity], result of:
    0.2795247 = score(doc=35173,freq=4.0 = termFreq=4.0
), product of:
      0.8091749 = queryWeight, product of:
        4.4216847 = idf(docFreq=13111, maxDocs=401502)
        0.18300149 = queryNorm
      0.3454441 = fieldWeight in 35173, product of:
        2.0 = tf(freq=4.0), with freq of:
          4.0 = termFreq=4.0
        4.4216847 = idf(docFreq=13111, maxDocs=401502)
        0.0390625 = fieldNorm(doc=35173)
  0.19497125 = (MATCH) weight(contents:language in 35173) [DefaultSimilarity], result of:
    0.19497125 = score(doc=35173,freq=7.0 = termFreq=7.0
), product of:
      0.5875679 = queryWeight, product of:
        3.2107275 = idf(docFreq=44012, maxDocs=401502)
        0.18300149 = queryNorm
      0.33182758 = fieldWeight in 35173, product of:
        2.6457512 = tf(freq=7.0), with freq of:
          7.0 = termFreq=7.0
        3.2107275 = idf(docFreq=44012, maxDocs=401502)
        0.0390625 = fieldNorm(doc=35173)

какая страница содержит точное ключевое слово «естественный язык». Итак, мои вопросы:

1) Почему Lucene сначала не показывает точные совпадения?

2) Почему Lucene показывает результат, который даже не содержит ключевого слова?

3) Где/как я могу это изменить, чтобы сначала отображались точные совпадения, а затем более релевантные?


person Sarp Kaya    schedule 07.10.2013    source источник


Ответы (1)


1 - Не предназначено. См. документацию по Lucene. синтаксис запроса. Запрос natural language состоит из двух терминов. Сама по себе Lucene не предпочитает, чтобы термины были близки друг к другу. Если вы хотите найти точные совпадения, правильным подходом будет фразовый запрос, например "natural language".

2 – Оба результата, в которые вы включили объяснение, содержат совпадения для обоих терминов, см.:

0.2795247 = (MATCH) weight(contents:natural in 35173) [DefaultSimilarity], result of:
  0.2795247 = score(doc=35173,freq=4.0 = termFreq=4.0
...
0.19497125 = (MATCH) weight(contents:language in 35173) [DefaultSimilarity], result of:
  0.19497125 = score(doc=35173,freq=7.0 = termFreq=7.0

Согласно Lucene, он нашел термин «естественный» 4 раза в этом документе и «язык» 7 раз в поле содержимого (которое, как я полагаю, является вашим полем по умолчанию).

3 - Просмотрите синтаксис анализатора запросов, чтобы увидеть, что имеет для вас наибольший смысл. Похоже, вы можете найти Близкий поиск полезен.

Если вы просто хотите просто получить совпадения фраз, за ​​которыми следуют другие, вы можете использовать что-то вроде:

"natural language" natural language
person femtoRgon    schedule 07.10.2013
comment
Спасибо, но Proximity Search на самом деле не нашел бы слов отдельно. Так что это не то, что я после - person Sarp Kaya; 08.10.2013
comment
Конечно, именно поэтому был предоставлен другой подход, объединяющий запросы отдельных терминов с запросом фразы, который должен хорошо работать. Это как-то неадекватно? - person femtoRgon; 08.10.2013
comment
Я уже думал, что на самом деле, но для более крупных запросов, скажем, даже для 4 ключевых слов, у меня было бы 3 запроса, состоящих из 2 слов, 2 запроса из 3 слов и сам запрос. Я разработал алгоритм для поиска подзапросов, который занимает O (n ^ 3) времени, поэтому не так уж хорош, если учесть запрос из 10 ключевых слов. Мне было интересно, можно ли совместить поиск близости с поиском по умолчанию? - person Sarp Kaya; 08.10.2013
comment
Это несколько другой вопрос, чем то, что вы задали здесь, и я не думаю, что оно было адекватно описано в пространстве комментария. Возможно, вы захотите задать новый вопрос, чтобы уточнить это немного больше. - person femtoRgon; 08.10.2013
comment
Почему он отличается, я думаю, он все еще относится к третьему вопросу? Если я смогу объединить поиск по близости с поиском по умолчанию, я смогу улучшить результаты поиска по близости, и это даст мне более высокие баллы, или я ошибаюсь? - person Sarp Kaya; 08.10.2013