Помогите, если кто хорошо разбирается в Lucene — поиском не нашлось...
Итак, есть люсиновский индекс, построенный не мной (следовательно, менять список анализаторов я не могу). В индексе содержатся документы, состоящие из наборов полей, содержащих короткие текстовые значения. По этому индексу нужно вести поиск по нескольким полям в различных комбинациях.
Со всем этим я разобрался, но осталась одна мелочь. Дело в том, что когда я ищу в поле X значение "Hello", то в результаты должны попадать документы, содержащие в поле X только одно "Hello" и ничего больше. Записи с "Hello world" или "Hello delirium tremens" должны отбрасываться. По факту же, в результат попадает любой документ, у которого в поле Х есть по меньшей мере одно слово "Hello".
Запрос строю, заключая каждое значение в двойные кавычки, в качестве логических операторов использую слова AND и OR. Версия Люсины, если это важно, 3.6.1.
Здравствуйте, Iron_droid, Вы писали:
I_>Со всем этим я разобрался, но осталась одна мелочь. Дело в том, что когда я ищу в поле X значение "Hello", то в результаты должны попадать документы, содержащие в поле X только одно "Hello" и ничего больше. Записи с "Hello world" или "Hello delirium tremens" должны отбрасываться.
Думаю, так просто это не выйдет. В смысле, чтоб весь текст поля индексировался одним токеном, нужно при индексировании этого поля использовать Field.Index.NOT_ANALYZED. У Вас же на этом поле скорее всего стоит Field.Index.ANALYZED, и значит при попадании в индекс текст сперва разбивается на токены, что и приводит к описываемом Вами и ожидаемому поведению.
Здравствуйте, xonixx, Вы писали:
X>Думаю, так просто это не выйдет. В смысле, чтоб весь текст поля индексировался одним токеном, нужно при индексировании этого поля использовать Field.Index.NOT_ANALYZED. У Вас же на этом поле скорее всего стоит Field.Index.ANALYZED, и значит при попадании в индекс текст сперва разбивается на токены, что и приводит к описываемом Вами и ожидаемому поведению.
Оно конечно от задачи зависит, но подумалось: а зачем Lucene при поиске по точному совпадению? Нельзя тупо повесить индекс на столбец и делать sql where?
Здравствуйте, dimgel, Вы писали:
D>Оно конечно от задачи зависит, но подумалось: а зачем Lucene при поиске по точному совпадению? Нельзя тупо повесить индекс на столбец и делать sql where?
Увы, не выйдет, работа именно с данным конкретным индексом — в требованиях.
Здравствуйте, xonixx, Вы писали:
X>Думаю, так просто это не выйдет. В смысле, чтоб весь текст поля индексировался одним токеном, нужно при индексировании этого поля использовать Field.Index.NOT_ANALYZED. У Вас же на этом поле скорее всего стоит Field.Index.ANALYZED, и значит при попадании в индекс текст сперва разбивается на токены, что и приводит к описываемом Вами и ожидаемому поведению.
Не вдаваясь в подробности, скажу только что задача точно имеет решение — третьестороний код каким-то образом получает именно точное соответствие. Возможно, правда, что результаты фильтруются уже после их получения из индекса...
Здравствуйте, Iron_droid, Вы писали:
I_>Не вдаваясь в подробности, скажу только что задача точно имеет решение — третьестороний код каким-то образом получает именно точное соответствие. Возможно, правда, что результаты фильтруются уже после их получения из индекса...
А class файлы есть? Того его, декомпилируйте, да посмотрите. При определенном навыке даже обфускация не помеха.