Search code examples
elasticsearchelasticsearch-dsl

ElasticSearch "A" or "empty"


I have the following index index

{
  "docs": {
    "mappings": {
      "text": {
        "properties": {
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
          "code": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }
        }
      }
    }
  }
}

"code" can have values: ["a"], ["b"],["a","b"], or []

I need a query to relieve values with code: "a" or []. Can anyone help with this query, here is what I have tried so far w/out success (this appears to say "a" AND "[]"; I want "a" OR "[]").

"bool": {
  "should": [
    {
      "match": {
        "code": "a"
      }
    }
  ],
  "must_not": [
    {
      "exists": {
        "field": "code"
      }
    }
  ]
}
  

Solution

  • OR can be achieved with bool/should, but the bool/must constraint must be inside the bool/should.

    You should try with this query:

    {
      "query": {
        "bool": {
          "minimum_should_match": 1,
          "should": [
            {
              "match": {
                "code": "a"
              }
            },
            {
              "bool": {
                "must_not": [
                  {
                    "exists": {
                      "field": "code"
                    }
                  }
                ]
              }
            }
          ]
        }
      }
    }