какой анальзер хорош для моей ситуации? случай поиска в спящем режиме - PullRequest
2 голосов
/ 03 июня 2011

Мы запустили приложение для поиска книг. Реализуется поиском в спящем режиме.

Сущность книги определяется следующим образом:

@Entity
@Indexed
public class Book{
@DocumentId
private Integer UID;
@Field
private String title;

@Field
private String description;
...}

Если пользователь ищет название книги, скажем, ввод Microsoft Access 2007, книги с названием или описанием содержат Microsoft, Access или 2007 возвращены. Это то, что мы ожидали. Некоторые книги совершенно не связаны из-за ключевого слова 2007. Я ищу решение, чтобы понять важность каждого ключевого слова. В этом случае 2007 год менее важен в поиске. Но для этого поиска нет разницы для Microsoft, Access или 2007.

Второй случай: есть ли хороший анализатор, который можно использовать при индексировании и запросах для поддержки нескольких фраз? Я думал, что стандартный анализатор поиска в спящем режиме просто разбивает поисковые слова на одно слово?

Если поисковыми словами является Microsoft Access 2007, результаты имеют лучший результат, если они содержат «Microsoft Access»,

другой пример поиска: "город с соленым озером", "соединенные штаты", результаты не ожидаются, если только они соответствуют соли, городу или озеру или, по крайней мере, они должны отставать от результатов с "городом солевого озера".

Может кто-нибудь предложить мне несколько подсказок?

спасибо!

Ответы [ 2 ]

0 голосов
/ 04 июня 2011

Lucene уже должен дисконтировать условия, которые встречаются часто, и, следовательно, плохо различать документы.Если вы хотите увеличить этот эффект, у вас есть несколько вариантов:

  1. Измените функцию подобия по умолчанию и используйте новую функцию для определения веса по-разному
  2. Boost low-df(высокий idf) терминов в запросе, сначала просматривая количество документов, содержащих данный термин, и соответственно корректируя вес этого термина
  3. Напишите классификатор, который может априори решить, какие термины не будутэффективные (например, номера года) и соответственно скорректируйте их вес
  4. Используйте что-то вроде WordNet или Wikipedia в качестве источника фраз (например, лидерских навыков), которые вы индексируете как один токен.Это будет включать измененный TokenStream, настроенный вашим анализатором.
0 голосов
/ 03 июня 2011

Я не знаю, как отличить хороший 2007 год от плохого.

Одна вещь, которую вы могли бы сделать, - это использовать анализатор, который игнорирует числа для описания, но использовать обычный анализатор для заголовка.Таким образом, будут выбраны только цифры в названии.На практике это не целый анализатор, а простой фильтр, который вы можете записать и добавить в стек анализатора.

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

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

Что касается поиска по фразе, просто используйте PhraseQuery:Lucene или используйте более удобный Hibernate Search DSL,

Query luceneQuery = mythQB
   .phrase()
   .onField("history")
   .matching("Thou shalt not kill")
       .createQuery();

Весь документ для DSL запроса: здесь

...