Поведение разбора запроса Lucene - объединение частей запроса с помощью AND - PullRequest
4 голосов
/ 18 мая 2011

Допустим, у нас есть индекс Lucene с несколькими документами, индексированными с использованием StopAnalyzer.ENGLISH_STOP_WORDS_SET.Пользователь выдает два запроса:

  • foo:bar
  • baz:"there is"

Предположим, что первый запрос дает некоторые результаты, поскольку есть документысоответствующий этому запросу.

Второй запрос дает 0 результатов.Причина этого заключается в том, что когда baz:"there is" анализируется, он заканчивается как пустой запрос, поскольку оба там и равны являются стоп-словами (технически говоря, это преобразуется в пустой *)1019 * без оговорок).Пока все хорошо.

Однако любой из следующих комбинированных запросов

  • +foo:bar +baz:"there is"
  • foo:bar AND baz:"there is"

ведет себяточно так же, как запрос +foo:bar, то есть возвращает некоторые результаты - все, несмотря на вторую AND часть, которая не дает результатов.

Можно утверждать, что при ANDing должны выполняться оба условия, но это не так.

Это кажется противоречивым, поскольку элементарный элемент запроса по-разному влияет на общий запрос в зависимости от контекста.Есть ли логическое объяснение этому?Можно ли это как-то решить, желательно без написания собственного QueryAnalyzer?Может ли это быть классифицировано как ошибка Lucene?

Если это что-то меняет, наблюдаемое поведение происходит в Lucene v3.0.2.

Этот вопрос был также размещен в Списке рассылки пользователей Lucene Java, пока ответов не было.

Ответы [ 3 ]

0 голосов
/ 20 мая 2011

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

E: Вы можете думать об этом так, чтобы дополнительные ключевые слова уточняли набор результатов.Это наиболее целесообразно, если принять во внимание поиск по префиксам.Чем короче ваш префикс, тем больше совпадений.Наиболее крайним случаем будет пустой запрос, соответствующий всей коллекции документов

0 голосов
/ 24 мая 2011

Эрик Эрикссон из списка рассылки Lucene ответил одна часть этого вопроса:

Но представьте себе, что вы запрашиваете.Если удалить все стоп-слова, ни один запрос не будет соответствовать вашему.Что было бы очень нелогичным ИМО.Ваши пользователи не имеют ни малейшего представления о том, что вы удалили стоп-слова, поэтому они будут сидеть и говорить: «Смотри, я ЗНАЮ, что« бар »был в foo, и я ЗНАЮ, что« есть », был в базе, почему, черт возьми, это не так?Проклятая система найти мой документ?

Так что, похоже, единственный разумный способ - прекратить использование стоп-слов или уменьшить набор стоп-слов.

0 голосов
/ 18 мая 2011

Я бы посоветовал не использовать StopAnalyzer, если вы хотите иметь возможность искать фразы типа "есть".StopAnalyzer - это, по сути, метод оптимизации с потерями, и если вы не индексируете большие текстовые документы, это, вероятно, не стоит.

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