Home > Enterprise >  How to formulate an and condition for a nested object in Opensearch?
How to formulate an and condition for a nested object in Opensearch?

Time:06-30

Opensearch ingests documents similar to this example (its just a minimal example):

PUT nested_test/_doc/4
{
    "log": "This is a fourth log message",
    "function": "4 test function",
    "related_objects": [
    { "type": "user", "id": "10" },
    { "type": "offer", "id": "120" }
    ]
}    
PUT nested_test/_doc/5
{
    "log": "This is a fifth log message",
    "function": "5 test function",
    "related_objects": [
    { "type": "user", "id": "120" },
    { "type": "offer", "id": "90" }
    ]
}

With many of these documents, I'd like to filter those which have a specific related object (e.g. type=user and id=120). With the example data above, this should only return the document with id 5. Using simple filters (DQL syntax) as follows does not work:

related_objects.type:user and related_objects.id:120

As this would also match a document 5, as there is a related_object with type user and a related object with id 120, although its not the related user object with id 120, its the related offer.

CodePudding user response:

If Array[object] is used, the field type is nested, The document reference

CodePudding user response:

Elasticsearch query example:

{
    "query" : {
        "nested" : {
              "path" : "related_objects",
              "query" : {
                   "bool" : {
                      "must" : [
                          {
                             "term" : {"related_objects.type" : "MYTYPE"}
                          },
                          {
                             "term" : {"related_objects.id" : "MYID"}
                          }
                      ]
                   }
              }
        }
    }
}

Basically just go into a nested query and specify all your AND conditions as MUST clauses inside a bool query.

CodePudding user response:

As soon as the field is declared as nested field, it is possible to run a simple DQL query to get the desired information:

related_objects:{type:"user" and id:120}

This requires that the field has been defined as nested before:

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "related_objects": {
        "type": "nested" 
      }
    }
  }
}
  • Related