J'essaie de trouver une requête ElasticSearch équivalente à IN
\NOT
en SQL.
Je sais que nous pouvons utiliser la requête QueryString avec plusieurs OR pour obtenir la même réponse, mais cela aboutit à de nombreux OU.
Quelqu'un peut-il partager l'exemple?
Semblable à ce que Chris a suggéré comme commentaire, le remplacement analogue pour IN
est le filtre terms
(les requêtes impliquent un scoring, ce qui peut améliorer la commande retournée).
SELECT * FROM table WHERE id IN (1, 2, 3);
Le filtre Elasticsearch 1.x équivalent serait:
{
"query" : {
"filtered" : {
"filter" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
Le filtre équivalent à Elasticsearch 2.x + serait:
{
"query" : {
"bool" : {
"filter" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
Ce qu'il faut retenir, c'est que le filtre terms
(et sa requête) fonctionne avec des correspondances exactes. Il s'agit implicitement d'une opération or
, similaire à IN
.
Si vous voulez l'inverser, vous pouvez utiliser le filtre "not", mais je suggérerais d'utiliser le légèrement plus verbeux bool
/must_not
filter (pour prendre l'habitude d'utiliser également bool
/must
et bool
).
{
"query" : {
"bool" : {
"must_not" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
Globalement, la syntaxe de requête composée bool
est l'un des filtres les plus importants dans Elasticsearch , tout comme les filtres term
(singulier) et terms
( pluriel, comme indiqué).
1 termes
vous pouvez utiliser termes requête dans ElasticSearch qui agira comme IN
terms query est utilisé pour vérifier si la valeur correspond à l'une des valeurs fournies par Array.
2 must_not
must_not peut être utilisé comme NOT dans ElasticSearch.
ex.
GET my_index/my_type/_search
{
"query" : {
"bool" : {
"must":[
{
"terms": {
"id" : ["1234","12345","123456"]
}
},
{
"bool" : {
"must_not" : [
{
"match":{
"id" : "123"
}
}
]
}
}
]
}
}
}
En outre, si cela vous aide, vous pouvez également utiliser la requête "existe" pour vérifier si le champ existe ou non. par exemple, vérifiez si le champ existe
"exists" : {
"field" : "mobileNumber"
}
vérifier si un champ n'existe pas
"bool":{
"must_not" : [
{
"exists" : {
"field" : "mobileNumber"
}
}
]
}