web-dev-qa-db-fra.com

ElasticSearch: opérateur équivalent IN dans ElasticSearch

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?

47
Sameer Deshmukh

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é).

75
pickypg

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"
                               }
                            }
                        ]
                    }
                }
              ]
         }
    }
}
  1. existe

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"
           }
        }
     ]
}
0
niranjan harpale