Как написать глобальный запрос в elasticsearch?

Я хочу создать верхний поисковый запрос, используя elasticsearch.

Я хочу сопоставить category_name , brand_name и title из таблицы elasticsearch. Матч должен быть фразой и с условием.

Мой запрос:

 $query = [ "bool" => [ "must" => [ ["match" => ["is_published" => 1]], [ "multi_match" => [ "query" => $searchKey, "fields" => ["category_name", "brand_name", "title"] ] ], [ 'nested' => [ 'path' => 'category_with_in_title.parent_cat', 'query' => [ 'bool' => [ 'must' => [ ['match' => [ 'category_with_in_title.parent_cat.status' => 1, ]], ], ], ], ], ], [ 'nested' => [ 'path' => 'brand', 'query' => [ 'bool' => [ 'must' => [ 'match' => [ 'brand.approved_status' => 1, ], ], ], ], ], ], [ 'nested' => [ 'path' => 'default_product_low_price_with_seller.seller_detail', 'query' => [ 'bool' => [ 'must' => [ 'match' => [ 'default_product_low_price_with_seller.seller_detail.approve_status' => 1, ], ], ], ], ], ], [ 'nested' => [ 'path' => 'default_product_low_price_with_seller', 'query' => [ 'bool' => [ 'must' => [ 'match' => [ 'default_product_low_price_with_seller.status' => 1, ], ], ], ], ], ], ], ], ]; 

Я использую multi_match для этого, но как использовать pharse в этом запросе? Я должен написать целые слова для поиска.

Например :

Я хочу найти запись, в которой category_name = Tops

Я хочу результат, если я пишу «tops» или «top» или «to». Но сейчас я должен написать точное слово «Топы».

Заранее спасибо…

Вы можете использовать match_phrase_prefix , что совпадает с match_phrase , за исключением того, что он позволяет использовать префиксные совпадения в последнем члене в тексте .

Все, что вам нужно сделать, это добавить "type": "phrase_prefix" к вашему запросу multi_match , например:

 "multi_match" => [ "query" => $searchKey, "type": "phrase_prefix", "fields" => ["category_name", "brand_name", "title"] ] 

Сообщите мне, если это то, что вы ищете.

В идеале вы должны использовать multi_match с типом cross_fields , который будет обрабатывать все поля как одно большое поле и запускать ваш запрос на нем. Однако, из-за нечеткости, отключенной на них, будет отображаться только точное совпадение.

См. Revelant Github Issue https://github.com/elastic/elasticsearch/issues/6866

Следовательно, моя рекомендация заключается в замене multi_match на fuzzy_like_this ( elasticsearch version 1.x ) или more_like_this ( версия elasticsearch 2.x ).

 $query = [ "bool" => [ "must" => [ ["match" => ["is_published" => 1]], [ "fuzzy_like_this" => [ "fields" => ["category_name", "brand_name", "title"], "like_text" => $searchKey ] ], ....