Улучшение поискового запроса / фильтра Solr

#solr #lucene

#solr #lucene

Вопрос:

Я новичок в Solr, но хочу использовать его как часть своего сайта для индексации ингредиентов.

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

любые советы будут оценены! Я уже пробовал фильтры переноса и фильтрацию ngram, но они, похоже, не имеют никакого эффекта.

введите описание изображения здесь

Комментарии:

1. Обновить.. Я неправильно использовал токенизатор Ngram, однако это все равно не помогает

2. Ваш запрос не выполняет поиск по red onion имени, он выполняет поиск red в name и onion в поле поиска по умолчанию (что обычно и есть _text_ , но у вас может не быть правил копирования полей, которые заполняют поле). Итак, в вашем случае — вы можете просто получать хиты из-за red части вашего запроса, а не onion части. Поскольку все оценки идентичны, похоже, это так. Вы можете попытаться name:red name:onion проверить, верна ли теория. Возможно, вместо этого вы захотите использовать обработчик edismax запросов с q=red onionamp;qf=name помощью или использовать q=red onionamp;df=name для установки поля по умолчанию

Ответ №1:

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

 <field name="name" type="string" indexed="true" stored="true" docValues="true" />
  

Я проиндексировал данные, как показано ниже.

 {
"id":"1",
"name" : "red onion"
},
{
"id":"2",
"name" : "red pepper"
},
{
"id":"3",
"name" : "red cabbage"
},
{
"id":"4",
"name" : "red chilli"
}
  

когда я ищу имя: red onion, я получаю red onion сверху. Пожалуйста, обратитесь к приведенному ниже экрану запроса solr для того же.

Экран

Включен скриншот с оценкой и запросом отладки.

введите описание изображения здесь

Комментарии:

1. Проблема в том, что мне нужно нечеткое сопоставление, поэтому, если кто-то искал «красный лук», он все равно должен был бы соответствовать лучше, чем красный перец

2. В этом случае вы можете использовать 2 поля. Один с типом string, а другой с типом text_general . Поиск по обоим полям. Увеличьте значение поля со строковым типом

3. Вы можете подумать об использовании edismax здесь. Это позволит вам применять усиления к каждому полю, что означает, что количество попаданий в exact_match_name будет выше, чем в name . пример exact_match_name:game^ 10 название:game ^ 5

4. Привет, Абхиджит, спасибо за вашу помощь. Проблема в том, что поисковый запрос является динамическим, и я не знаю, каким будет поисковый запрос, поэтому я не могу увеличить разные слова. Мне нужно, чтобы пользователь, например, искал «красный лук» и «красный лук», чтобы быть в топе, а не красный перец, как сейчас

5. Я бы предложил запустить поисковый запрос с amp;debugQuery=on … это покажет, как рассчитывается оценка для лучшего понимания