Функция Elasticsearch «Вы имели в виду»

Я внедряю решение 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. Вы должны обновить sql. проверьте эту ссылку stackoverflow.com/a/14908166/4459647, вы должны указать % в конце искомого элемента.

MRustamzade 05.02.2019 16:13

В вопросе нет упоминания SQL - это чисто Elasticsearch.

cherrysoft 05.02.2019 16:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
1 098
1

Ответы 1

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

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

kinger198 05.02.2019 16:28

Без проблем. Самым простым и, безусловно, наименее «дорогим» было бы вернуть список — вы можете ограничиться двумя или тремя лучшими предложениями. Если вы запустите PHP-функции Similar_text или levenshtein в своих примерах, вы увидите, что food и fold более похожи. Другой альтернативой было бы использование библиотеки НЛП и установка некоторых правил, определяющих, что вы будете извлекать из массива. Там немного работы, и вы не всегда можете получить ожидаемый результат.

cherrysoft 05.02.2019 16:40

Другие вопросы по теме