Ik probeer een ElasticSearch-query te vinden die gelijk is aan IN
\ NOT
in 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 IN
de terms
filter(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
/must
en bool
te gebruiken).
{
"query" : {
"bool" : {
"must_not" : {
"terms" : {
"id" : [1, 2, 3]
}
}
}
}
}
Over het algemeen is de bool
samengestelde 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"
}
}
]
}
}
]
}
}
}
- 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:[]
}
}
}