2010-07-29 4 views
2

Lucene NOOB alert!Типы запросов в Lucene

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

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

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

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

Если поисковый запрос: «общая сила бренда» «бренд родовой сила» ... «отруби ул поколение» «отруби родового ул» . .. и т. Д.

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

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

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

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

ответ

4

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

На вашем вопрос о:

Пример поле: "общие бренд силы"

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

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

Самый простой подход будет заключаться в следующем:

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

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

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

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

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

HTH

+0

+1 для решения подстановочных знаков. Самый простой, хотя он может вызвать проблемы с производительностью для больших индексов. – bajafresh4life

+0

Есть ли заметная разница между использованием запроса wilcard (путем добавления звездочки) и PrefixQuery? Они кажутся мне одинаковыми. Мысли? Они в основном сводятся к одному и тому же? – berko

+0

Да, они идентичны. Javadocs описывают это так: «Запрос, который соответствует документам, содержащим термины с указанным префиксом. PrefixQuery построен QueryParser для ввода, например, приложения *». – Mikos

Смежные вопросы