Перестановка запросов Lucene - PullRequest
       6

Перестановка запросов Lucene

1 голос
/ 09 февраля 2010

У меня есть вопрос относительно выполнения запроса lucene, включающего перестановку.

Скажем, у меня есть два поля: "имя" и "ключевое слово", и пользователь ищет "joes pizza restaurant". Я хочу, чтобы какая-то часть этого поиска соответствовала полному содержанию поля «имя», а какая-то часть соответствовала полному содержанию поля ключевого слова. Он должен соответствовать всем предоставленным терминам и должен соответствовать всему содержимому полей. Например, это может соответствовать:

1) название: "joes restaurant" ключевое слово: "пицца"
2) название: "joes pizza" ключевое слово: "restaurant"
3) название: "пиццерия" ключевое слово: "joes"
4) название: "пицца" ключевое слово: "ресторан джос"
5) название: "pizza joes" ключевое слово: "restaurant"

но это не будет соответствовать

6) name: "big joes restaurant" ключевое слово: "пицца" - потому что это не совпадение на полном поле
7) name: "joes pizza restaurant" ключевое слово: "nomatch" - потому что хотя бы одно из терминов должно соответствовать полю ключевого слова

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

Ответы [ 2 ]

1 голос
/ 09 февраля 2010

В документации Lucene рекомендуется использовать отдельное поле, представляющее собой конкатенацию полей 'name' и 'keyword' для запросов, охватывающих несколько полей. Сделайте поиск по этому полю.

0 голосов
/ 09 февраля 2010

Давайте разделим ваш запрос на три части:

  1. И поле 'name', и поле 'keyword' должны содержать часть запроса.
  2. Оба совпадения должны быть на полном поле.
  3. Объединение совпадений должно полностью покрывать запрос.

Я бы реализовал это так:

  1. Создать логический запрос, состоящий из токенов в исходном запросе. Сделайте это разделением терминов «ДОЛЖЕН». например в примере что-то вроде:

    (имя: joes ИЛИ имя: ресторан ИЛИ имя: пицца) И (ключевое слово: joes ИЛИ ключевое слово: ресторан ИЛИ ключевое слово: пицца) Любой документ, соответствующий этому запросу, имеет часть исходного запроса в каждом поле. (Это может быть запрос ConstantScore для экономии времени).

  2. Взять набор совпадений из первого запроса. Извлеките содержимое поля как токены и сохраните их в наборах String. Сохраняйте только те совпадения, в которых объединение множеств совпадает с набором строк из исходного запроса, а множества имеют пустое пересечение. (Это касается покрытия - пункт 3 выше). Для вашего первого примера у нас будут наборы {"joes", "restaurant"} и {"pizza"}, удовлетворяющие обоим условиям.

  3. Возьмите установленные размеры из оставшихся совпадений и сравните их с длинами поля. Для вашего первого примера мы установим размеры 2 и 1, которые должны соответствовать длинам полей 2 и 1 соответственно.

Обратите внимание, что мои пункты 2 и 3 не являются частью обычного скоринга Lucene, а скорее являются внешним кодом Java.

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