Lucene - точное совпадение
От: Iron_droid Россия  
Дата: 07.12.12 16:00
Оценка:
Помогите, если кто хорошо разбирается в Lucene — поиском не нашлось...

Итак, есть люсиновский индекс, построенный не мной (следовательно, менять список анализаторов я не могу). В индексе содержатся документы, состоящие из наборов полей, содержащих короткие текстовые значения. По этому индексу нужно вести поиск по нескольким полям в различных комбинациях.

Со всем этим я разобрался, но осталась одна мелочь. Дело в том, что когда я ищу в поле X значение "Hello", то в результаты должны попадать документы, содержащие в поле X только одно "Hello" и ничего больше. Записи с "Hello world" или "Hello delirium tremens" должны отбрасываться. По факту же, в результат попадает любой документ, у которого в поле Х есть по меньшей мере одно слово "Hello".

Запрос строю, заключая каждое значение в двойные кавычки, в качестве логических операторов использую слова AND и OR. Версия Люсины, если это важно, 3.6.1.
Re: Lucene - точное совпадение
От: xonixx  
Дата: 07.12.12 23:50
Оценка:
Здравствуйте, Iron_droid, Вы писали:

I_>Со всем этим я разобрался, но осталась одна мелочь. Дело в том, что когда я ищу в поле X значение "Hello", то в результаты должны попадать документы, содержащие в поле X только одно "Hello" и ничего больше. Записи с "Hello world" или "Hello delirium tremens" должны отбрасываться.


Думаю, так просто это не выйдет. В смысле, чтоб весь текст поля индексировался одним токеном, нужно при индексировании этого поля использовать Field.Index.NOT_ANALYZED. У Вас же на этом поле скорее всего стоит Field.Index.ANALYZED, и значит при попадании в индекс текст сперва разбивается на токены, что и приводит к описываемом Вами и ожидаемому поведению.
Re[2]: Lucene - точное совпадение
От: dimgel Россия https://github.com/dimgel
Дата: 07.12.12 23:56
Оценка:
Здравствуйте, xonixx, Вы писали:

X>Думаю, так просто это не выйдет. В смысле, чтоб весь текст поля индексировался одним токеном, нужно при индексировании этого поля использовать Field.Index.NOT_ANALYZED. У Вас же на этом поле скорее всего стоит Field.Index.ANALYZED, и значит при попадании в индекс текст сперва разбивается на токены, что и приводит к описываемом Вами и ожидаемому поведению.


Оно конечно от задачи зависит, но подумалось: а зачем Lucene при поиске по точному совпадению? Нельзя тупо повесить индекс на столбец и делать sql where?
Re[3]: Lucene - точное совпадение
От: Iron_droid Россия  
Дата: 08.12.12 07:00
Оценка:
Здравствуйте, dimgel, Вы писали:

D>Оно конечно от задачи зависит, но подумалось: а зачем Lucene при поиске по точному совпадению? Нельзя тупо повесить индекс на столбец и делать sql where?


Увы, не выйдет, работа именно с данным конкретным индексом — в требованиях.
Re[2]: Lucene - точное совпадение
От: Iron_droid Россия  
Дата: 08.12.12 07:03
Оценка:
Здравствуйте, xonixx, Вы писали:

X>Думаю, так просто это не выйдет. В смысле, чтоб весь текст поля индексировался одним токеном, нужно при индексировании этого поля использовать Field.Index.NOT_ANALYZED. У Вас же на этом поле скорее всего стоит Field.Index.ANALYZED, и значит при попадании в индекс текст сперва разбивается на токены, что и приводит к описываемом Вами и ожидаемому поведению.


Не вдаваясь в подробности, скажу только что задача точно имеет решение — третьестороний код каким-то образом получает именно точное соответствие. Возможно, правда, что результаты фильтруются уже после их получения из индекса...
Re[3]: Lucene - точное совпадение
От: StanislavK Великобритания  
Дата: 09.12.12 14:45
Оценка:
Здравствуйте, Iron_droid, Вы писали:

I_>Не вдаваясь в подробности, скажу только что задача точно имеет решение — третьестороний код каким-то образом получает именно точное соответствие. Возможно, правда, что результаты фильтруются уже после их получения из индекса...


А class файлы есть? Того его, декомпилируйте, да посмотрите. При определенном навыке даже обфускация не помеха.
Re: Lucene - точное совпадение
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 15.12.12 03:51
Оценка:
Надо писать свою реализацию поиска. Первое, что приходит на ум — для каждого документа проверять, что есть только те термы, которые указаны в запросе.
http://jvmmemory.com — простой способ настройки JVM
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.