Как сделать правильно запрос

Добрый день!
Есть запрос 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.