Я хочу создать верхний поисковый запрос, используя 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 ] ], ....