Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inner hits not working with nested filter?

I've just upgraded to Elastic Search 1.5.0 and so far I can't make inner_hits work with a nested filter, although it works fine with a nested query.

Let's say I want to retrieve the inner nested object actors within a movie object.

When I run the following nested query :

Syntax 1

GET my_index/movie/_search
{
  "query": {
    "filtered": {
      "query": {"match_all": {}},
      "filter": {
        "nested": {
          "path": "actors",
          "query": {
            "match": {
              "actors.id": 12345
            }
          }, 
          "inner_hits" : {}
        }
      }
    }
  }
}

=> I get the inner_hits as documented here, which is just fine.

But when I try doing the equivalent query with a nested filter :

Syntax 2

GET my_index/movie/_search
{
  "query": {
    "filtered": {
      "query": {"match_all": {}},
      "filter": {
        "nested": {
          "path": "actors",
          "filter": {
            "term": {
              "actors.id": 12345
            }
          }, 
          "inner_hits" : {}
        }
      }
    }
  }
}

=> I get the following parse error

QueryParsingException[[my_index] [nested] requires either 'query' or 'filter' field]

(and this last query works fine when I remove inner_hits - except of course that I don't get the inner hits ...)

Is there something wrong in the syntax I use or is the inner_hits not implemented yet with nested filter ?

Thanks in advance

Edit 3-30-2015

It works with the syntax provided below by @mdewit (thanks!)

Syntax 3

GET my_index/movie/_search
{
    "query": {
        "nested": {
            "path": "actors",
            "query": {
                "filtered": {
                    "filter": {
                        "term": {"actors.id": 12345}
                    }
                }
            },
            "inner_hits" : {}
        }
    }
}

even though this syntax does not match the Nested Filter doc

=> I still do not understand what is wrong with Syntax 2. It seems like an ES bug to me.

Edit 04-22-2015 : bug fixed in ES 1.5.1, see my comment below

like image 801
benoit Avatar asked Mar 25 '15 09:03

benoit


2 Answers

The following seems to work:

GET my_index/movie/_search
{
    "query": {
        "nested": {
            "path": "actors",
            "query": {
                "filtered": {
                    "filter": {
                        "term": {"actors.id": 12345}
                    }
                }
            },
            "inner_hits" : {}
        }
    }
}'
like image 169
mdewit Avatar answered Oct 08 '22 06:10

mdewit


Bug fixed in ElasticSearch 1.5.1 as stated here

So this syntax works (and works fine)

GET my_index/movie/_search
{
  "query": {
    "filtered": {
      "query": {"match_all": {}},
      "filter": {
        "nested": {
          "path": "actors",
          "filter": {
            "term": {
              "actors.id": 12345
            }
          }, 
          "inner_hits" : {}
        }
      }
    }
  }
}

Thanks guys!

like image 23
benoit Avatar answered Oct 08 '22 04:10

benoit