ElasticSearch: dans l'opérateur équivalent dans ElasticSearch

j'essaie de trouver la requête ElasticSearch équivalente à IN NOT en SQL.

je sais que nous pouvons utiliser la requête QueryString avec multiple ou pour obtenir la même réponse, mais cela se termine avec beaucoup de.

<!-Est-ce que quelqu'un peut partager l'exemple?

41
demandé sur pickypg 2015-05-07 23:41:32

2 réponses

semblable à ce que Chris a suggéré comme commentaire, le remplacement analogue pour IN est le termsfiltre (les requêtes impliquent la notation, ce qui peut améliorer l'ordre retourné).

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

L'équivalent Elasticsearch 1.x filtre serait:

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

L'équivalent Elasticsearch 2.x+ filtre serait:

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

l'important est que le terms filtre (et requête d'ailleurs) correspondre. Il est implicitement or opération, similaire à IN.

si vous voulez l'inverser, vous pouvez utiliser le filtre not, mais je suggère d'utiliser le légèrement plus verbeux bool/must_not filtre (pour obtenir dans l'habitude de l'aide bool/must et bool).

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

dans l'Ensemble, le bool la syntaxe de requête composée est un des filtres les plus importants dans Elasticsearch, comme le sont les term (au singulier) et terms filtres (au pluriel, comme montré).

57
répondu pickypg 2016-06-16 20:16:28

j'ai vu ce que vous avez demandé. Et j'ai écrit le code source comme ci-dessous.

j'espère que cela vous aide à résoudre votre problème.

requête sql :

select * from tablename where fieldname in ('AA','BB');

elastic search :

{
    query :{
        bool:{
            must:[{
              "script": {
                "script":{
                  "inline": "(doc['fieldname'].value.toString().substring(0,2).toUpperCase() in ['AA','BB']) == true"
                }
              }
            }],
            should:[],
            must_not:[]
        }
    }
}
0
répondu sunnier 2018-06-07 08:55:53