2015-05-07 4 views
32

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

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

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

+0

http://www.elastic.co/guide/en/elasticsearch/reference/1.5/query-dsl-terms-query.html –

ответ

42

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

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

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

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

Эквивалентная Elasticsearch 2.х + фильтр будет:

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

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

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

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

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

+1

Спасибо! Это сработало для меня! –

+0

10/10 ответ. Простой и прямой. – Watercolours