Я внедряю решение Elasticsearch для системы электронной коммерции, в которой я использую термин «предложить», чтобы попытаться создать функцию «Вы имели в виду…».
Для опечаток это работает очень хорошо
Например, если я ищу hampster, он возвращает правильное написание hamster, что мне и нужно.
Проблема возникает, когда я ищу что-то вроде food, он возвращает предложение fold, чего я не хочу.
Я пытаюсь выяснить, есть ли что-то встроенное в Elasticsearch, что позволяет мне видеть, что food является допустимым термином, который не нуждается в предложении.
Не уверен, что это полезно, но вот мой запрос и ответ (PHP)
Array
(
[suggest] => Array
(
[spell_check] => Array
(
[text] => food
[term] => Array
(
[field] => name
)
)
)
)
Array
(
[took] => 1
[timed_out] =>
[_shards] => Array
(
[total] => 5
[successful] => 5
[skipped] => 0
[failed] => 0
)
[hits] => Array
(
[total] => 0
[max_score] => 0
[hits] => Array
(
)
)
[suggest] => Array
(
[spell_check] => Array
(
[0] => Array
(
[text] => food
[offset] => 0
[length] => 4
[options] => Array
(
[0] => Array
(
[text] => fold
[score] => 0.75
[freq] => 1
)
[1] => Array
(
[text] => feed
[score] => 0.5
[freq] => 4
)
[2] => Array
(
[text] => four
[score] => 0.5
[freq] => 1
)
)
)
)
)
)
В вопросе нет упоминания SQL - это чисто Elasticsearch.






На самом деле это предполагаемое поведение, поскольку оно учитывает возможные орфографические ошибки. Существует оценка, связанная с возвращаемым предлагаемым значением, и возвращается более одного элемента. В вашем случае запрос о еде, если в вашей базе данных есть данные о еде, вернет результаты. Я не уверен, что вы также возвращаете результаты в случае (или просто используете ES в качестве своего рода службы предложений) хита, но ваша логика может, например, сделать предложение только в случае отсутствия результатов. Вы также можете видеть, что «канал» возвращается, но имеет более низкий балл, потому что, как я предполагаю, также применяется расстояние Левенштейна для расчета окончательного балла.
Я также использую Elasticsearch для выполнения фактического поиска, но проблема в том, что мой основной поиск использует «нечеткость», поэтому даже неправильное написание все равно будет возвращать результаты, поэтому я не могу использовать это, чтобы определить, является ли он недействительным или нет. Думаю, я мог бы запустить отдельный нечеткий поиск только по 1 полю, который должен быть хорошим и быстрым, и использовать его, чтобы определить, показывать предложения или нет. Мне придется поэкспериментировать. Спасибо за ответ
Без проблем. Самым простым и, безусловно, наименее «дорогим» было бы вернуть список — вы можете ограничиться двумя или тремя лучшими предложениями. Если вы запустите PHP-функции Similar_text или levenshtein в своих примерах, вы увидите, что food и fold более похожи. Другой альтернативой было бы использование библиотеки НЛП и установка некоторых правил, определяющих, что вы будете извлекать из массива. Там немного работы, и вы не всегда можете получить ожидаемый результат.
информации недостаточно, вы должны показать код. Но я думаю, что проблема в вашем sql. Вы должны обновить sql. проверьте эту ссылку stackoverflow.com/a/14908166/4459647, вы должны указать % в конце искомого элемента.