Нечеткие индексы в Hibernate Search - PullRequest
0 голосов
/ 03 августа 2011

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

Есть ли способ сделать это с помощью Hibernate Search, предпочтительно с помощью аннотаций?

Ответы [ 2 ]

0 голосов
/ 05 августа 2011

Я бы попробовал следующие варианты, по порядку:

  1. Вы просто пытаетесь исправить орфографические ошибки в пользовательских запросах? Возможно, вам следует использовать для этого проверку правописания / автозаполнение, а не медленные нечеткие запросы с трудно настраиваемой релевантностью.
  2. Действительно ли это не полнотекстовый поиск, а какой-то тип процедуры «сопоставления»? В этом случае альтернативой может быть индексирование n-граммов символов, например, с ngram TokenFilters от lucene, так что вы выполняете логический запрос к полю вместо медленного нечеткого запроса. На самом деле, так или иначе работает программа проверки правописания Люсена!
  3. Если вышеприведенное не применимо, и вы действительно решаете, что вам нужен нечеткий поиск, и альтернативы нет, вы можете вместо этого попробовать использовать ночную сборку ствола Люцен. При этом используется совершенно другой алгоритм, поэтому эти запросы выполняются намного быстрее [1]. Но я не думаю, что вы сможете легко интегрировать невыпущенный ствол люцена в спящий режим.

    [1]: http://blog.mikemccandless.com/2011/03/lucenes-fuzzyquery-is-100-times-faster.html Блог о нечетких улучшениях.

0 голосов
/ 04 августа 2011

Я не совсем уверен, что вы хотите сделать здесь. Вы хотите во время индексации вставить в индекс слова с заданным расстоянием Левенштейна? Похоже на поиск по синонимам, когда вы вставляете токены синонимов в индекс? Если это так, вы можете просто написать свой фильтр токенов (и фабрику фильтров), а затем использовать инфраструктуру @ AnalyzerDef для создания собственного анализатора. Посмотрите на исходный код, чтобы увидеть, как это делается. Имейте в виду, я вижу несколько проблем с этим подходом. Индексирование становится дорогим, и размер индекса становится очень большим. Конечно, я не знаю больше о вашем случае использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...