ОК, пожалуйста, примите следующее для моей ситуации:
- Я пытаюсь создать функцию «Вы имели в виду» с помощью функции 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 должен быть в состоянии сказатьу этого «платья» нет предложений, потому что оно правильное / найдено и почему оно не может просто обозначить это в своем ответе и избавить меня от необходимости выполнять сложную / дополнительную логику (сопоставление, дополнительные поиски для каждого отдельного слова на существование и т. д.).
Я что-то пропустил? Есть ли способ сообщить термину «предложивший», чтобы я знал разницу между терминами без предложений из-за того, что они не существуют, а не просто являются правильными?