Есть запрос:
SELECT * FROM shop_items WHERE (shop_category IS NULL) AND (title NOT LIKE '%Ночник%') AND ((title LIKE '%мышь%') OR (title LIKE '%клавиат%')) AND (description LIKE '%беспровод%') ORDER BY is_top
Ищу по 3 полям: shop_category, title, description
Как построить аналогичный запрос на Elasticsearch?
Если значения полей title и description в индексе разбиты на правильные токены, то можно использовать term. И запрос будет выглядеть примерно так:
{
"sort" : {
"is_top" : {"order" : "asc"}
},
"query": {
"bool" : {
"must" : {
{ "term" : { "description" : "беспровод" } },
{
"bool" : {
"should" : [
{ "term" : { "title" : "мышь" } },
{ "term" : { "title" : "клавиат" } }
]
}
}
},
"must_not" : {
{ "exists" : { "field" : "shop_category" } },
{ "term" : { "title" : "Ночник" } }
}
}
}
}
В противном случае нужно использовать regexp.
Нельзя однозначно составить аналог сложного SQL запроса на Query DSL. Очень разные парадигмы. Elasticsearch не предназначен для LIKE-запросов.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей