Solr: сопоставление по фразам, содержащимся в строке запроса - PullRequest
3 голосов
/ 28 октября 2011

Я только начал пытаться использовать Solr, и уже думаю, что я пытаюсь использовать его задом наперед.Может ли кто-нибудь дать мне знать, возможно ли то, что я пытаюсь сделать?

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

Например: предположим, что у меня есть фразы, подобные этим, хранящиеся в Solr:

1:"fish fingers" 
2:"apple pie"

Если мой поисковый запрос «Я люблю рыбные палочки», то я хочу, чтобы Solr возвратил первую запись.Если это «Я люблю рыбные палочки и яблочный пирог», то я хочу, чтобы он вернул обе записи.Но если это «Я люблю яблочные пальчики и рыбный пирог», то я хочу, чтобы он не возвращал никаких записей.

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

Спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 29 октября 2011

Я полагаю, черепица - n-граммы токенов, использованные для сопоставления - могут стать началом решения вашей проблемы.

Проверьте ShingleFilterFactory и ShingleFilter.

2 голосов
/ 31 октября 2011

Я решил прочитать документацию по каждому фильтру и токенизатору, где я встретил это описание PositionFilterFactory :

Another example is when exact matching hits 
are wanted for _any_ shingle within the query

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

1 голос
/ 28 октября 2011

Похоже, что это та же функциональность, что и при поиске по ключевым словам, предоставляемым Google Search Appliance, где оно пытается сопоставить проиндексированные термины с запросами, а не наоборот.И нам тоже пришлось реализовать собственное решение.

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

  • Создание комбинаций поисковых терминов, например, я люблю рыбные палочки -> мне нравится, как рыба, рыбные палочки, я люблю рыбу, как рыбные палочки, я люблю рыбные палочки
  • Создать дизъюнкциюМаксимальный запрос с фразой соответствует всем приведенным выше комбинациям с логическим выражением should, что приведет к совпадению с любым из совпадений фразы.
  • Однако это также не даст точного соответствия.
  • Есть еще одна оговорка: как будто сохраненные термины похожи на «красивые рыбные палочки», запрос «я люблю рыбные палочки» все равно будет соответствовать записи.Поэтому вам может потребоваться проверить (можете предоставить обходной путь, который мы использовали).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...