I've been struggling with this issue for a while and I hope that someone 
can help pointing me to a solution.

My setup is ES 1.0 on Linux with two ES nodes with 8GB memory allocated for 
ES on each.

Here is how to recreate the issue:

curl -XPOST http://localhost:9200/my_index -d '{
    "settings": {
        "number_of_shards": 5
    },
    "mappings": {
        "type1": {
            "properties": {
                "keys": {"type": "integer"}
            }
        },
        "type2": {
            "properties": {
                "key": {"type": "string"},
                "values": {"type": "integer"}
            }
        }
    }
}'

curl -XPOST http://localhost:9200/my_index/_bulk -d '
{"index": {"_type": "type1", "_id": "a"}}
{"keys": [11,12,13]}
{"index": {"_type": "type2", "_id": "b"}}
{"key": "11", "values": [21,22]}
{"index": {"_type": "type2", "_id": "c"}}
{"key": "12", "values": [23,24]}
{"index": {"_type": "type2", "_id": "d"}}
{"key": "13", "values": [25,26]}
{"index": {"_type": "type2", "_id": "e"}}
{"key": "13", "values": [27,28]}
{"index": {"_type": "type2", "_id": "f"}}
{"key": "13", "values": [29,30]}
{"index": {"_type": "type2", "_id": "g"}}
{"key": "13", "values": [31,32]}
'

Note that I had to index more items than I actually search for. The error 
doesn't show up otherwise.

Now, the following query reports an error in my environment:

curl -XGET http://localhost:9200/my_index/type2/_search?pretty=true -d '
{
   "fields": [],
   "query": {
      "filtered": {
         "filter": {
            "terms": {
                "key": {
                    "path": "keys",
                    "type": "type1",
                    "id": "a"
                }
            }
         },
         "query": {
            "filtered": {
               "filter": {
                  "script": {
                     "params": {
                        "v": 22
                     },
                     "script": "foreach(val : doc[\"values\"].values) if 
(val == v) return true; return false;"
                  }
               }
            }
         }
      }
   }
}'

As you can see, a query is defined with a script filter and in turn that 
query is filtered with a terms-lookup filter.
The results I'm getting show the following error:

{
  "took" : 7,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 4,
    "failed" : 1,
    "failures" : [ {
      "index" : "my_index",
      "shard" : 0,
      "status" : 500,
      "reason" : "QueryPhaseExecutionException[[my_index][0]: 
query[filtered(filtered(ConstantScore(ScriptFilter(foreach(val : 
_source.values) if (val == v) return true; return false;)))->cache(key:11 
key:12 key:13))->cache(_type:type2)],from[0],size[10]: Query Failed [Failed 
to execute main query]]; nested: NullPointerException; "
    } ]
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "my_index",
      "_type" : "type2",
      "_id" : "b",
      "_score" : 1.0
    } ]
  }
}



The actual application that I'm working on with real data, but with similar 
query reports either a NullPointerException or 
"PropertyAccessException[[Error: could not access: <field>; in class: 
org.elasticsearch.search.lookup.SourceLookup]" and the expected result set 
is not returned.


The query above works if I change the script filter into a term filter. 

curl -XGET http://localhost:9200/my_index/type2/_search?pretty=true -d '
{
   "fields": [],
   "query": {
      "filtered": {
         "filter": {
            "terms": {
                "key": {
                    "path": "keys",
                    "type": "type1",
                    "id": "a"
                }
            }
         },
         "query": {
            "filtered": {
               "filter": {
                  "term": {"values": 22}
               }
            }
         }
      }
   }
}'

Unfortunately, I cannot replace the script filter with something simpler in 
the real application.

One could argue, that the two filter sections could be combined to 
something like this:

curl -XGET http://localhost:9200/my_index/type2/_search?pretty=true -d '
{
   "fields": [],
   "query": {
      "filtered": {
         "filter": {
            "bool": {
                "must": [
                    {"terms": {
                        "key": {
                            "path": "keys",
                            "type": "type1",
                            "id": "a"
                        }
                    }},
                    {"script": {
                        "params": {
                            "v": 22
                        },
                        "script": "foreach(val : doc[\"values\"].values) if 
(val == v) return true; return false;"
                    }}
                ]
            }
         }
      }
   }
}'

That appears to be working, and it may be the workaround for now, even 
though I have to make some changes to the code that generates these 
filters.  
However, I still would like to understand what's happening here and whether 
I stepped on a defect that should be addressed.

I created another post a while ago 
(here<https://groups.google.com/forum/#!topic/elasticsearch/9tBf-IKnDkY>) 
that looks very similar and that may point to the same root cause.

Thanks for you help!




-- 
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/45b9841d-7363-4479-8a8e-e6b11836fca4%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to