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?2 réponses
semblable à ce que Chris a suggéré comme commentaire, le remplacement analogue pour IN
est le terms
filtre (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é).
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:[]
}
}
}