Типы запросов в Lucene - PullRequest
       6

Типы запросов в Lucene

2 голосов
/ 29 июля 2010

Lucene NOOB alert!

Я считаю себя человеком по крайней мере разумного интеллекта, однако у меня возникают огромные проблемы с умственным поиском типов запросов в Lucene.

В моем конкретном случаеМне нужно выполнить поиск в одном строковом поле в моем документе, которое имеет только длину слова (в среднем около 50 символов).

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

Пример поля: «универсальная сила бренда»

Должно совпадать с поиском: «общая сила бренда» «общая сила бренда»... "gen bran str" "bran generic str" ... и т. д.

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

В настоящее время я потерялся в мире нечетких подстановочных знаков и многозначных фраз.

Может кто-нибудь прояснить мне весь этот сценарий?(И да, я много раз искал в Интернете помощь, но не могу найти достойного ресурса).

Кстати, я использую Lucene 2.9, но я не думаю, что это действительно имеет значение.

1 Ответ

4 голосов
/ 29 июля 2010

Вам не нужно хранить каждый термин в отдельном поле.Lucene создает токены из каждого термина (если вы используете токенайзер пробелов), что обеспечивает большую гибкость поиска.

К вашему вопросу о:

Поле примера: "универсальный брендсила "

Должно совпадать с поиском:" универсальная сила бренда "" общая сила бренда "

Приведенный выше запрос вернет оба результата, последний с более низким показателем по очевидным причинам.Однако «gen bran str» «bran generic str» ... и т. Д. Сложно, так как кажется, что термины не являются стандартными «стеблями», и в этом случае вы можете использовать анализатор стемера.

Самый простой подходбудет:

  1. Разделить фразу запроса по пробелу, чтобы у вас была строка []
  2. Использовать логический запрос и создать запрос для каждого термина, добавляя подстановочный знак вend.

Что-то вроде:

string[] terms = query.split(" ");
BooleanQuery bq = new BooleanQuery();

foreach(string term in terms)
 bq.Add(new Query("FieldName", term + "*",...);

Существуют более совершенные типы запросов, такие как SpanQuery, DisMax и т. д., но, поскольку вы упомянули о предупреждении noob, подумайте, что приведенное выше является самым простым (хотя и не самый элегантный) подход.

HTH

...