Steve Rukuts
Steve Rukuts

Reputation: 9367

ElasticSearch doesn't seem to support array lookups

I currently have a fairly simple document stored in ElasticSearch that I generated with an integration test:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "unit-test_project600",
      "_type" : "recordDefinition505",
      "_id" : "400",
      "_score" : 1.0, "_source" : {
  "field900": "test string",
  "field901": "500",
  "field902": "2050-01-01T00:00:00",
  "field903": [
    "Open"
  ]
}
    } ]
  }
}

I would like to filter for specifically field903 and a value of "Open", so I perform the following query:

{
    query: {
        filtered: {
            filter: {
                term: {
                    field903: "Open",
                }
            }
        }
    }
}

This returns no results. However, I can use this with other fields and it will return the record:

{
    query: {
        filtered: {
            filter: {
                term: {
                    field901: "500",
                }
            }
        }
    }
}

It would appear that I'm unable to search in arrays with ElasticSearch. I have read a few instances of people with a similar problem, but none of them appear to have solved it. Surely this isn't a limitation of ElasticSearch?

I thought that it might be a mapping problem. Here's my mapping:

{
  "unit-test_project600" : {
    "recordDefinition505" : {
      "properties" : {
        "field900" : {
          "type" : "string"
        },
        "field901" : {
          "type" : "string"
        },
        "field902" : {
          "type" : "date",
          "format" : "dateOptionalTime"
        },
        "field903" : {
          "type" : "string"
        }
      }
    }
  }
}

However, the ElasticSearch docs indicate that there is no difference between a string or an array mapping, so I don't think I need to make any changes here.

Upvotes: 2

Views: 1169

Answers (1)

Scott Rice
Scott Rice

Reputation: 2450

Try searching for "open" rather than "Open." By default, Elasticsearch uses a standard analyzer when indexing fields. The standard analyzer uses a lowercase filter, as described in the example here. From my experience, Elasticsearch does search arrays.

Upvotes: 5

Related Questions