Частичное совпадение слов Lucene - PullRequest
2 голосов
/ 09 марта 2011

Lucene не поддерживает его из коробки, поэтому мне нужна помощь в построении моего запроса.

Допустим, у меня есть документ со значением поля "Develop"

Я бы хотелэтот документ будет возвращен для поиска "Dev" и "lop".

Может быть, при создании двух запросов?

"*keyword" 

и

"keyword*" 

и

"keyword"

?

Как бы вы поступили с несколькими словами?Вы бы разбили предложение / поиск на список слов и делали предыдущий пример для каждого слова?

1 Ответ

9 голосов
/ 15 марта 2011

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

Тем не менее, вот две идеи, которые могут помочь ...

Слог-токенизация
Вернемся к вашему примеру с «Develop». Пока вы довольны тем, что позволяете пользователям искать слоги, я думаю, вы можете что-то сделать. Вам придется создать токенайзер, который разделяет слова в ваших индексированных словах в соответствии с их слогами и создает индекс базы данных по слогам. (Я не уверен, что есть встроенные токенизаторы для английского языка, которые могут это сделать, и написание одного самостоятельно может быть сложным ...)

Важное замечание:
Если вы будете индексировать полные слова И отдельные слоги, размер вашего индекса будет намного больше, чем если бы вы индексировали только одно из двух.

Однако Я бы не предлагал индексировать только слоги. Если вы также хотите, чтобы ваши пользователи могли искать полное слово «Разработка» (что, я думаю, вам нужно), это привело бы к двум запросам с логическими и между ними, а именно <'dev' AND ' обкорнать '>. Хотя Lucene поддерживает такие логические конструкции в запросах, они очень дороги. У меня лично были некоторые проблемы с использованием логических запросов в Lucene.

Морфологический
Еще один способ как-то прийти к тому, что вы пытаетесь, - это использовать жестокую форму слова «stemming» (http://en.wikipedia.org/wiki/Stemming), которая переводит слова в их первый слог. (Это позволит искать «dev», но не для « обкорнать»...)
Опять же, я не думаю, что такая особенность слова уже есть в Lucene. Написание одного для себя будет трудной задачей и потребует работы с / импорта огромных словарей.

Ссылки
Это может быть, если вы не знаете о внутренних поисковых системах:
http://en.wikipedia.org/wiki/Index_%28search_engine%29
http://en.wikipedia.org/wiki/Vector_space_model
http://en.wikipedia.org/wiki/Inverted_file
http://en.wikipedia.org/wiki/Term-document_matrix
http://en.wikipedia.org/wiki/Tf-idf

...