Как сопоставить подмножества строки поиска в SOLR / lucene - PullRequest
2 голосов
/ 03 февраля 2011

У меня необычная ситуация.Обычно при поиске по текстовому индексу вы ищете небольшое количество ключевых слов в документах с большим количеством терминов.

Например, вы можете искать «быстрый коричневый» и ожидать совпадения с «быстрым коричневым лисом».перепрыгивает через ленивую собаку ".

У меня есть ситуация, когда у меня в хранилище документов много маленьких фраз, и я хочу сравнить их с более крупной фразой запроса.

Например, если яесть запрос:

  • "быстрая коричневая лиса перепрыгивает через ленивую собаку"

и документы

  • "быстрая коричневая"
  • "fox over"
  • "lazy dog"

Я хотел бы найти документы, в которых есть фраза, которая встречается в запросе.В этом случае «quick brown» и «lazy dog» (но не «fox over», потому что, хотя токены совпадают, это не фраза в строке поиска).

Возможен ли такой запрос с помощью SOLR / lucene

Ответы [ 3 ]

3 голосов
/ 05 февраля 2011

Звучит так, как будто вы хотите использовать ShingleFilter в своем анализе, чтобы индексировать большие слова: добавьте ShingleFilterFactory как во время запроса, так и во время индексации.

Во время индексации ваши документы затем будут проиндексированы следующим образом:

  • "quick brown" -> quick_brown
  • "fox over" -> fox_over
  • "lazy dog" -> lazy_dog

Во время запроса ваш запрос становится:

  • "быстрая коричневая лиса перепрыгивает через ленивую собаку" -> "the_quick quick_brown brown_fox fox_jumps jumps_over over_the_lazy lazy_dog"

Этовсе равно ничего хорошего, по умолчанию он сформирует запрос фразы.Так что в вашем анализаторе запросов только добавьте PositionFilterFactory после ShingleFilterFactory.Это «выравнивает» позиции в запросе, так что обработчик запросов обрабатывает выходные данные как синонимы, что приведет к булевому запросу с этими подпрограммами (все предложения SHOULD, поэтому в основном это запрос OR):

BooleanQuery:

  • the_quick ИЛИ
  • quick_brown ИЛИ
  • brown_fox ИЛИ
  • ...

это должно быть наиболее эффективным способом, как тогда это действительно просто логический запрос termqueries.

2 голосов
/ 03 февраля 2011

Звучит так, как будто вы хотите, чтобы параметр DisMax "минимальное соответствие".Некоторое время назад я написал в блоге статью о концепции: http://blog.websolr.com/post/1299174416. Также есть вики Solr по минимальному совпадению .

Концепция "минимального соответствия" применяется ко всем«необязательные» термины в вашем запросе - термины, которые не указаны явно, с использованием +/-, являются ли они «+ обязательными» или «-запрещенными».По умолчанию минимальное совпадение составляет 100%, что означает, что должны присутствовать 100% необязательных терминов.Другими словами, все ваши термины считаются обязательными.

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

Если вы уроните минимальное соответствие до 1, то только один из дополнительных терминов будет считаться обязательным.В некоторых отношениях это противоположно дефолту в 100%.Как будто ваш запрос quick brown fox… превращен в quick OR brown OR fox OR … и т. Д.

Если вы установите минимальное совпадение на 2, тогда ваша поисковая фраза будет разбита на группы по два термина.Поиск quick brown fox превращается в (quick brown) OR (brown fox) OR (quick fox) … и так далее.(Извините, мой псевдо-запрос там, я надеюсь, вы понимаете, в чем суть.)

Параметр минимального соответствия также поддерживает проценты - скажем, 20% - и некоторые даже более сложные выражения ,Так что есть немало настроек.

1 голос
/ 04 февраля 2011
Параметр

, устанавливаемый только в мм, не удовлетворит ваши потребности, так как

"Быстрая коричневая лиса перепрыгивает через ленивую собаку"

будет соответствовать всем трем документам

  • "быстрый коричневый"
  • "Лис над"
  • "Ленивый пес"

и как вы сказали:

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

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