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

Вы ранее написали:

теперь вы пишите

Я что-то не очень понимаю.

Если 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"
      }
    }
  ]
}