Подтвердить что ты не робот

ElasticSearch: эквивалентный оператор в ElasticSearch

Я пытаюсь найти запрос ElasticSearch, эквивалентный IN\NOT в SQL.

Я знаю, что мы можем использовать QueryString запрос с несколькими OR, чтобы получить тот же ответ, но это заканчивается множеством OR.

Может ли кто-нибудь поделиться примером?

4b9b3361

Ответ 1

Подобно тому, что Крис предложил в качестве комментария, аналогичной заменой для IN является terms filter (запросы подразумевают подсчет очков, что может улучшить возвращенный заказ).

SELECT * FROM table WHERE id IN (1, 2, 3);

Эквивалентным фильтром Elasticsearch 1.x будет:

{
  "query" : {
    "filtered" : {
      "filter" : {
        "terms" : {
          "id" : [1, 2, 3]
        }
      }
    }
  }
}

Эквивалентным фильтром Elasticsearch 2.x + будет:

{
  "query" : {
    "bool" : {
      "filter" : {
        "terms" : {
          "id" : [1, 2, 3]
        }
      }
    }
  }
}

Важным выводом является то, что фильтр terms (и запрос на этот счет) работает с точными совпадениями. Это неявно операция or, аналогичная IN.

Если вы хотите инвертировать его, вы можете использовать фильтр not, но я бы предложил использовать немного более подробный bool/must_not фильтр (чтобы привыкнуть также использовать bool/must и bool).

{
  "query" : {
    "bool" : {
      "must_not" : {
        "terms" : {
          "id" : [1, 2, 3]
        }
      }
    }
  }
}

В целом синтаксис bool составного запроса один из самых важных фильтров в Elasticsearch, равно как и term (единственное) и terms (множественное число, как показано).