Как определить и удалить слова из поисковой фразы, которых нет в моем индексе эластичного поиска, с помощью suggetors? - PullRequest
0 голосов
/ 31 октября 2019

ОК, пожалуйста, примите следующее для моей ситуации:

  • Я пытаюсь создать функцию «Вы имели в виду» с помощью функции ES Suggester.
  • Моя цель состоит в том, чтобыпревратить этот «банан greem dress» в это «зеленое платье», где:
    • «greem» - плохо написанное слово, которое следует исправить на слово «зеленый», так как «зеленый» присутствует в моем указателе.
    • «платье» - это правильное слово, и его следует оставить в покое и указывать в предложении, поскольку оно существует в индексе.
    • «банан» - это слово / термин, которого нет нигде в моемИндекс и т. д. должны быть полностью удалены.

Что я МОГУ СДЕЛАТЬ: * Исправить «greem» в «green» работает нормально.

Что я не могу сделать: * Определите, что "банан" вообще не существует в индексе, и поэтому решите удалить его.

Я прочитал ряд статей, таких как эта:

Подсказка фразы Elasticsearch предлагает мне предложения, которых нет в моем индексе

НоПредлагаемые решения также:

1) Не отвечайте на мое желание удалить отдельные ключевые слова, которых нет в индексе. 2) Возьмите (imo) много дополнительной обработки, которую, я считаю, легко избежать. 3) В некотором роде упускают суть вопроса, касающегося этой проблемы.

Я пытался использовать фазовый подсказчик ES с опцией сортировки, но для моего примера "банан greem dress банан" он просто говорит мне, что нет никаких результатов для всегозапрос "greem dress banana" и не приводит к тому, что я могу сгенерировать правильную поисковую фразу "green dress".

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

ОК, поэтому, когдаЯ звоню в службу поддержки со словами «greem dress banana» примерно так:

{"suggest":{"text":"greem+dress+banana","correction-1":{"term":{"field":"_docs.product_name","suggest_mode":"always"}},"correction-2":{"term":{"field":"_docs.product_copy","suggest_mode":"always"}},"correction-3":{"term":{"field":"_docs.product_reference","suggest_mode":"always"}},"correction-4":{"term":{"field":"_docs.product_description","suggest_mode":"always"}},"correction-5":{"term":{"field":"_docs.product_search_terms","suggest_mode":"always"}}}}

Примечание: у меня есть несколько полей для проверки предложений, как вы можете видеть выше.

Это возвращает что-товот так (обратите внимание, что мой код преобразует это в массив, но это то же самое, что JSON, возвращенный изES):

Aurora_API_Client_Service_Data_Json Object
(
    [json:Aurora_API_Client_Service_Data_Json:private] => Array
        (
            [took] => 8
            [timed_out] => 
            [_shards] => Array
                (
                    [total] => 1
                    [successful] => 1
                    [skipped] => 0
                    [failed] => 0
                )

            [hits] => Array
                (
                    [total] => Array
                        (
                            [value] => 0
                            [relation] => eq
                        )

                    [max_score] => 
                    [hits] => Array
                        (
                        )

                )

            [suggest] => Array
                (
                    [correction-1] => Array
                        (
                            [0] => Array
                                (
                                    [text] => greem
                                    [offset] => 0
                                    [length] => 5
                                    [options] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [text] => green
                                                    [score] => 0.8
                                                    [freq] => 3
                                                )

                                            [1] => Array
                                                (
                                                    [text] => grei
                                                    [score] => 0.5
                                                    [freq] => 1
                                                )

                                        )

                                )

                            [1] => Array
                                (
                                    [text] => dress
                                    [offset] => 6
                                    [length] => 5
                                    [options] => Array
                                        (
                                        )

                                )

                            [2] => Array
                                (
                                    [text] => banana
                                    [offset] => 12
                                    [length] => 6
                                    [options] => Array
                                        (
                                        )

                                )

                        )

                    [correction-2] => Array
                        (
                            [0] => Array
                                (
                                    [text] => greem
                                    [offset] => 0
                                    [length] => 5
                                    [options] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [text] => green
                                                    [score] => 0.8
                                                    [freq] => 2
                                                )

                                        )

                                )

                            [1] => Array
                                (
                                    [text] => dress
                                    [offset] => 6
                                    [length] => 5
                                    [options] => Array
                                        (
                                        )

                                )

                            [2] => Array
                                (
                                    [text] => banana
                                    [offset] => 12
                                    [length] => 6
                                    [options] => Array
                                        (
                                        )

                                )

                        )

                    [correction-3] => Array
                        (
                            [0] => Array
                                (
                                    [text] => greem+dress+banana
                                    [offset] => 0
                                    [length] => 18
                                    [options] => Array
                                        (
                                        )

                                )

                        )

                    [correction-4] => Array
                        (
                            [0] => Array
                                (
                                    [text] => greem
                                    [offset] => 0
                                    [length] => 5
                                    [options] => Array
                                        (
                                        )

                                )

                            [1] => Array
                                (
                                    [text] => dress
                                    [offset] => 6
                                    [length] => 5
                                    [options] => Array
                                        (
                                        )

                                )

                            [2] => Array
                                (
                                    [text] => banana
                                    [offset] => 12
                                    [length] => 6
                                    [options] => Array
                                        (
                                        )

                                )

                        )

                    [correction-5] => Array
                        (
                            [0] => Array
                                (
                                    [text] => greem
                                    [offset] => 0
                                    [length] => 5
                                    [options] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [text] => green
                                                    [score] => 0.8
                                                    [freq] => 1
                                                )

                                        )

                                )

                            [1] => Array
                                (
                                    [text] => dress
                                    [offset] => 6
                                    [length] => 5
                                    [options] => Array
                                        (
                                        )

                                )

                            [2] => Array
                                (
                                    [text] => banana
                                    [offset] => 12
                                    [length] => 6
                                    [options] => Array
                                        (
                                        )

                                )

                        )

                )

        )

)

Проблема с кей, которая у меня возникла с этими возвращаемыми данными, таким образом ...

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

                            [1] => Array
                                (
                                    [text] => dress
                                    [offset] => 6
                                    [length] => 5
                                    [options] => Array
                                        (
                                        )

                                )

                            [2] => Array
                                (
                                    [text] => banana
                                    [offset] => 12
                                    [length] => 6
                                    [options] => Array
                                        (
                                        )

                                )

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

Я что-то пропустил? Есть ли способ сообщить термину «предложивший», чтобы я знал разницу между терминами без предложений из-за того, что они не существуют, а не просто являются правильными?

...