ElasticSearch: IN equivalente operator in ElasticSearch

Ik probeer een ElasticSearch-query te vinden die gelijk is aan IN\ NOTin SQL.

Ik weet dat we QueryString-query’s met meerdere OR’s kunnen gebruiken om hetzelfde antwoord te krijgen, maar dat levert veel OR’s op.

Kan iemand het voorbeeld delen?


Antwoord 1, autoriteit 100%

Vergelijkbaar met wat Chris suggereerde als opmerking, is de analoge vervanging voor INde termsfilter(query’s impliceren scoren, wat de geretourneerde bestelling kan verbeteren).

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

Het equivalente Elasticsearch 1.x-filter zou zijn:

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

Het equivalente Elasticsearch 2.x+-filter zou zijn:

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

Het belangrijkste is dat het filter terms(en de zoekopdracht) werkt op exacte overeenkomsten. Het is impliciet een or-bewerking, vergelijkbaar met IN.

Als je het wilt omkeren, zou je het niet-filter kunnen gebruiken, maar ik raad aan om het iets uitgebreidere bool/must_not-filter te gebruiken (om er een gewoonte van te maken om ook bool/musten boolte gebruiken).

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

Over het algemeen is de boolsamengestelde querysyntaxis een van de belangrijkste filters in Elasticsearch, evenals de filters term(enkelvoud) en terms(meervoud, als getoond).


Antwoord 2, autoriteit 3%

1 voorwaarden

u kunt termenzoektermen gebruiken in ElasticSearch die als IN werken

terms-query wordt gebruikt om te controleren of de waarde overeenkomt met een van de opgegeven waarden uit Array.

2 must_not

must_notkan worden gebruikt als NIET in ElasticSearch.

bijv.

GET my_index/my_type/_search
{
    "query" : {
         "bool" : {
              "must":[
                {
                   "terms": {
                        "id" : ["1234","12345","123456"]
                    }
                },
                {
                   "bool" : {
                        "must_not" : [
                            {
                              "match":{
                                  "id" : "123"
                               }
                            }
                        ]
                    }
                }
              ]
         }
    }
}
  1. bestaat

Als het helpt, kun je ook de “bestaat”-query gebruiken om te controleren of het veld bestaat of niet.
voor ex,
controleer of het veld bestaat

"exists" : {
      "field" : "mobileNumber"
   }

controleer of een veld niet bestaat

"bool":{
    "must_not" : [
        {
           "exists" : {
               "field" : "mobileNumber"
           }
        }
     ]
}

Antwoord 3

Ik heb gezien wat je vroeg.
En ik schreef de broncode zoals hieronder.

Ik hoop dat dit je helpt bij het oplossen van je probleem.

sql-query :

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

elastisch zoeken:

{
    query :{
        bool:{
            must:[{
              "script": {
                "script":{
                  "inline": "(doc['fieldname'].value.toString().substring(0,2).toUpperCase() in ['AA','BB']) == true"
                }
              }
            }],
            should:[],
            must_not:[]
        }
    }
}

Other episodes