在Elasticsearch 2.3.0中的should查询中匹配null

Ani*_*dey 3 elasticsearch

我有一个gender可以具有三个值的字段:

  • 男性
  • 女性
  • 无效的

的映射为gender

"gender": {
    "type": "string",
    "index": "not_analyzed"
}
Run Code Online (Sandbox Code Playgroud)

为了匹配null我正在关注这个

我使用此查询来获取gender文档null

{
    "query": {
        "bool": {
            "must_not": {
                "exists": {
                    "field": "gender"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想构建一个should查询,以便搜索结果可以返回具有该gender字段的任何文档:

{
  "query": {
    "bool": {
      "should": {
        "bool": {
          "should": [
            {
              "match": {
                "gender": {
                  "query": "MALE",
                  "type": "boolean"
                }
              }
            },
            {
              "match": {
                "gender": {
                  "query": "FEMALE",
                  "type": "boolean"
                }
              }
            }
          ],
          "must_not": {
            "exists": {
              "field": "gender"
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的查询给了我 0 次点击。我应该如何为此构建正确的查询?

And*_*fan 6

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "gender": {
              "query": "MALE",
              "type": "boolean"
            }
          }
        },
        {
          "match": {
            "gender": {
              "query": "FEMALE",
              "type": "boolean"
            }
          }
        },
        {
          "bool": {
            "must_not": {
              "exists": {
                "field": "gender"
              }
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或者如果我不太理解这个问题,而事实上你想区分gender 文档中完全缺失的内容存在的字段,但有null,您需要其他东西,这需要稍微更改映射:

    "gender": {
      "type": "string",
      "index": "not_analyzed",
      "null_value": "_null_"
    }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,查询是:

  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "gender": {
              "query": "MALE"
            }
          }
        },
        {
          "match": {
            "gender": {
              "query": "FEMALE"
            }
          }
        },
        {
          "term": {
            "gender": "_null_"
          }
        }
      ]
    }
  }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果您索引:

{"index":{}}
{"gender":"MALE"}
{"index":{}}
{"gender":"FEMALE"}
{"index":{}}
{"gender":null}
{"index":{}}
{"gender2":"MALE"}
{"index":{}}
{"gender":"whatever"}
Run Code Online (Sandbox Code Playgroud)

它会给你回馈:

     {
        "_score": 0.2826735,
        "_source": {
           "gender": "MALE"
        }
     },
     {
        "_score": 0.2826735,
        "_source": {
           "gender": null
        }
     },
     {
        "_score": 0.021688733,
        "_source": {
           "gender": "FEMALE"
        }
     }
Run Code Online (Sandbox Code Playgroud)