Search code examples
elasticsearchsense

Elastic Search Nested Object mapping and Query for search


I am trying to use Elastic Search and I am stuck trying to query for the nested object.

Basically my object is of the following format

{
     "name" : "Some Name",
     "field2": [
          { 
            "prop1": "val1",
            "prop2": "val2"
          },
          {
             "prop1": "val3",
             "prop2":: "val4"
          }
      ]
}

Mapping I used for the nested field is the following.

PUT /someval/posts/_mapping
{
    "posts": {
       "properties": {
           "field2": {
              "type": "nested"
           }
        }
    }
}

Say now i insert elements for /field/posts/1 and /field/posts/2 etc. I have k values for field2.prop1 and i want a query which gets the posts sorted based on most match of field2.prop1 among the K values i have. What would be the appropriate query for that. Also I tried a simple filter but even that doesnt seem to work right.

GET /someval/posts/_search
{
 "query": {
   "filtered": {
     "query": {
        "match_all": {}
     }
   },
   "filter" : {
        "nested" : {
            "path" : "field2",
            "filter" : {
                "bool" : {
                    "must" : [
                        {
                            "term" : {"field2.prop1" : "val1"}
                        }
                    ]
                }
            },
            "_cache" : true
        }
    }
  } 
 }

The above query should match atleast the first post. But it returns no match. Can anyone help to clarify whats wrong here ?


Solution

  • There was problem in your json structure, you used filtered query , but filter(object) was in different level than query.

    Find the difference.

    POST /someval/posts/_search
    {
       "query": {
          "filtered": {
             "query": {
                "match_all": {}
             },
             "filter": {
                "nested": {
                   "path": "field2",
                   "filter": {
                      "bool": {
                         "must": [
                            {
                               "term": {
                                  "field2.prop1": "val1"
                               }
                            }
                         ]
                      }
                   },
                   "_cache": true
                }
             }
          }
       }
    }