Elasticsearch Nested query not working as expected

Viewed 30

I am bit new to elastic search. I am trying a nested query to get the result soem thing like below sql in query DSL..means I wanna restrict the search to driver last name as well as the vehicle make as well..like below use case.

select driver.last_name,driver.vehicle.make,driver.vehicle.model from drivers where driver.last_name='Hudson' and driver.vehicle.make"="Miller-Mete;

But this doesn't work in elastic search sql as well as Query DSL... --> can we do the query like this in ES...like let me clarify..

if department has List[employees] in Elasticsearch denoarmalized data.. and i want to restrict the query to department_name and emp_position..

--> is this use case even possible in elastic search?

select department_name,emp_name,emp_salary,emp_position where emp_position="Intern" and department.name="devlopment"

--> Below are mappings and search Query DSL...

PUT /drivers
{
  "mappings": {
    "properties": {
      "driver": {
        "type": "nested",
        "properties": {
          "last_name": {
            "type": "text",
             "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "vehicle": {
            "type": "nested",
            "properties": {
              "make": {
                "type": "text"
              },
              "model": {
                "type": "text"
              }
            }
          }
        }
      }
    }
  }
}

GET /drivers/_mapping

O/P:

{
  "drivers" : {
    "mappings" : {
      "properties" : {
        "driver" : {
          "type" : "nested",
          "properties" : {
            "last_name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            },
            "vehicle" : {
              "type" : "nested",
              "properties" : {
                "make" : {
                  "type" : "text"
                },
                "model" : {
                  "type" : "text"
                }
              }
            }
          }
        }
      }
    }
  }
}

--> inserting documents..

PUT /drivers/_doc/1
{
  "driver" : {
        "last_name" : "McQueen",
        "vehicle" : [
            {
                "make" : "Powell Motors",
                "model" : "Canyonero"
            },
            {
                "make" : "Miller-Meteor",
                "model" : "Ecto-1"
            }
        ]
    }

PUT /drivers/_doc/2
{
  "driver" : {
        "last_name" : "Hudson",
        "vehicle" : [
            {
                "make" : "Mifune",
                "model" : "Mach Five"
            },
            {
                "make" : "Miller-Meteor",
                "model" : "Ecto-1"
            }
        ]
    }
}

--> Below is the search query dsl..this gives 0 results. Even i replace

"term": {
 "driver.last_name.keyword": "McQueen"
 }

with "match" or "filter" still gives 0 results...

GET /drivers/_search
{
  "query": {
    "nested": {
      "path": "driver",
      "query": {
        "nested": {
          "path": "driver.vehicle",
          "query": {
            "bool": {
              "must": [
                { "match": { "driver.vehicle.make": "Powell Motors" } },
                { "match": { "driver.vehicle.model": "Canyonero" } },
                {
                  "term": {
                    "driver.last_name.keyword": "McQueen"
                  }
                }
              ]
              
            }
          }
        }
      }
    }
  }
}

==> below Query DSL gives 2 results...

GET /drivers/_search
{
  "query": {
    "nested": {
      "path": "driver",
      "query": {
        "nested": {
          "path": "driver.vehicle",
          "query": {
            "bool": {
              "must": [
                { "match": { "driver.vehicle.make": "Miller-Meteor" } }
                
              ]
            }
          }
        }
      }
    }
  }
}

O/P:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.3097506,
    "hits" : [
      {
        "_index" : "drivers",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.3097506,
        "_source" : {
          "driver" : {
            "last_name" : "McQueen",
            "vehicle" : [
              {
                "make" : "Powell Motors",
                "model" : "Canyonero"
              },
              {
                "make" : "Miller-Meteor",
                "model" : "Ecto-1"
              }
            ]
          }
        }
      },
      {
        "_index" : "drivers",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.3097506,
        "_source" : {
          "driver" : {
            "last_name" : "Hudson",
            "vehicle" : [
              {
                "make" : "Mifune",
                "model" : "Mach Five"
              },
              {
                "make" : "Miller-Meteor",
                "model" : "Ecto-1"
              }
            ]
          }
        }
      }
    ]
  }
}
  
==> this gives "parsing_exception",
        "reason" : "[bool] malformed query, expected [END_OBJECT] but found [FIELD_NAME]",
==> even replacing 1st query bool to "match" also gives this error...as below
GET /drivers/_search
{
  "query": {
    "nested": {
      "path": "driver",
      "query": {
        "bool": {
          "must": [
            {"match": {
              "driver.last_name.keyword": "Hudson"
            }}
          ]
        }, 
        "nested": {
          "path": "driver.vehicle",
          "query": {
            "bool": {
              "must": [
                {
                  "match": {
                    "driver.vehicle.make": "Miller-Meteor"
                  }
                }
              ]
            }
            
          }
        }
      }
    }
  }
0 Answers
Related