Добрый день!
Есть запрос SQL как правильно сделать в Elastic
Ищем слова где and ( city_id IN ( "12,34,56,76,67,") or city IN ( 'Киев', 'Харьков') )
Если сложный запрос подскажите где посмотреть.
В данный момент я уже понял как делать and and, а вот как делать and ( city_id IN ( "12,34,56,76,67,") or city IN ( 'Киев', 'Харьков') ) пока не ясно.
Вот код
{
"query": {
"bool": {
"must": [
{
"match": {
"city": "Киев"
}
},{
"match": {
"category": "1"
}
},
{
"simple_query_string" : {
"query": "Купить iPhone 6s",
"fields": ["name"]
}
}
]
}
}
}
{ "query" : { "bool" : { "filter" : { "terms" : { "id" : [1, 2, 3] } } } } }
Спасибо
Оставлю здесь может кому-то пригодись код
"query": {
"bool": {
"must": [
{
"match": {
"city": "Киев"
}
},
{
"terms":{
"category_id":[
"1","11"
]
}
},
{
"terms":{
"city_id":[
"1","11"
]
}
},
{
"simple_query_string" : {
"query": "купить iPhone 6s ",
"fields": ["name"]
}
}
]
}
}
}
Нет запрос не правильно делает выборку.
Cкажите как сделать такой запрос из SQL в elasticsearch
SELECT * FROM p
WHERE MATCH (name) AGAINST ('Купить' ) AND category IN ( 2,3,4,5,6,7,8,9,10,1) and (region = 2121 or city_id IN ( 3331,3332,3343) or city IN ( 'Бар','Бершадь','Винница','Винницкая область' ) )
Вижу запрос не очень легкий может есть что-то похоже
А что не работает, и какой mapping у полей в этом индексе?
"mappings" : {
"properties" : {
"@timestamp" : {
"type" : "date"
},
"@version" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"category_id" : {
"type" : "long"
},
"city" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"city_id" : {
"type" : "long"
},
"description" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"id" : {
"type" : "long"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"region" : {
"type" : "long"
}
}
}
Если требуется точное совпадение, то надо использовать city.keyword
. А запросы на region
, city_id
и city
должны идти под отдельные bool
с should
вместо must
.
Можно получить наглядный пример
Конечно, после того, как вы ответите на мой вопрос:
дело в том что все работает. Хотелось узнать как записать такой запрос в json для elasticsearch
{
"query": "SELECT * FROM p WHERE MATCH(name,'купить iphone 6s') AND category_id IN ( 2,3,4,5,6,7,8,9,10,1) and (region = 2121 or city_id IN ( 3331,3332,3343) or city IN ( 'Бар','Бершадь','Винница','Винницкая область' ) ) "
}
Вы ранее написали:
теперь вы пишите
Я что-то не очень понимаю.
Если SQL работает и вам надо получить именно тот запрос, который SQL использует, то можно запустить
POST /_sql/translate
{
"query": "SELECT * FROM p WHERE MATCH(name,'купить iphone 6s') AND category_id IN ( 2,3,4,5,6,7,8,9,10,1) and (region = 2121 or city_id IN ( 3331,3332,3343) or city IN ( 'Бар','Бершадь','Винница','Винницкая область' ) ) "
}
И тогда вы получите, большой запрос, который можно упростить до:
{
"query" : {
"bool" : {
"must" : [
{
"match" : {
"name" : {
"query" : "купить iphone 6s"
}
}
},
{
"terms" : {
"category_id" : [ 2, 3, 4, 5, 6, 7, 8, 9, 10, 1]
}
},
{
"bool" : {
"should" : [
{
"term" : {
"region" : {
"value" : 2121
}
}
},
{
"terms" : {
"city_id" : [ 3331, 3332, 3343 ]
}
},
{
"terms" : {
"city.keyword" : [ "Бар", "Бершадь", "Винница", "Винницкая область"]
}
}
]
}
}
]
}
},
"sort" : [
{
"_doc" : {
"order" : "asc"
}
}
]
}
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.