#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 … это покажет, как рассчитывается оценка для лучшего понимания