I am trying to figure out how missing/exists works with nested objects, and 
what I am seeing is very strange.   Here is a gist to demonstrate: 
 https://gist.github.com/nathanmoon/8344115

I have a nested object, ratings, with a mapping like:

            "ratings" : {
                "type" : "nested",
                "properties" : {
                    "rater_username" : {
                        "type" : "string",
                        "index" : "not_analyzed"
                    },
                    "rating" : {
                        "type" : "integer",
                        "index" : "not_analyzed"
                    }
                }
            }


My data looks like this:

curl -XPOST "http://localhost:9200/nestedfilters/item/"; -d '
{
    "description" : "Rated by user1",
    "ratings" : [{
        "rater_username" : "user1",
        "rating" : 10
    }]
}
'

curl -XPOST "http://localhost:9200/nestedfilters/item/"; -d '
{
    "description" : "Rated but missing username",
    "ratings" : [{
        "rating" : 10
    }]
}
'

curl -XPOST "http://localhost:9200/nestedfilters/item/"; -d '
{
    "description" : "Rated by empty set",
    "ratings" : []
}
'

curl -XPOST "http://localhost:9200/nestedfilters/item/"; -d '
{
    "description" : "Rated by nobody",
}
'


Here is what I'm getting with various filters (sorry for the formatting):

-------------------------------------------------------------

FILTER:

    "filter" : {
        "missing" : {
            "field" : "ratings"
        }
    }

WHAT I WOULD EXPECT:

"Rated by empty set"
"Rated by nobody"

IT RETURNS:

"Rated by user1"
"Rated but missing username"
"Rated by empty set"


---------------------------------------------------------------


FILTER:

    "filter" : {
        "nested" : {
            "path" : "ratings",
            "filter" : {
                "missing" : {
                    "field" : "ratings.rating"
                }
            }
        }
    }

WHAT I WOULD EXPECT:

"Rated by empty set"
"Rated by nobody"

IT RETURNS:

[empty set]

-------------------------------------------------------------

FILTER:

    "filter" : {
        "not" : {
            "nested" : {
                "path" : "ratings",
                "filter" : {
                    "exists" : {
                        "field" : "ratings.rating"
                    }
                }
            }
        }
    }

WHAT I WOULD EXPECT:

"Rated by empty set"
"Rated by nobody"

IT RETURNS:

"Rated by empty set"

-------------------------------------------------------------

FILTER:

    "filter" : {
        "not" : {
            "nested" : {
                "path" : "ratings",
                "filter" : {
                    "exists" : {
                        "field" : "ratings.rater_username"
                    }
                }
            }
        }
    }

WHAT I WOULD EXPECT:

"Rated but missing username"
"Rated by empty set"
"Rated by nobody"

IT RETURNS:

"Rated but missing username"
"Rated by empty set"

-------------------------------------------------------------


Can anyone explain what I am seeing, and what is the best way to index and 
query for 'missing' nested fields?  Thank you!

Nathan

-- 
You received this message because you are subscribed to the Google Groups 
"elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elasticsearch/eee98195-312f-4722-81ae-4c8c39e1f029%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to