在Elasticsearch文档中检查字段是否存在的最佳方法

54

在elasticsearch中,检查文档字段是否存在的最佳方法是什么?我在文档中找不到任何东西。

例如,如果此文档没有字段/键“price”,我不想在结果中返回它。

{
    "updated": "2015/09/17 11:27:27",
     "name": "Eye Shadow",
     "format": "1.5 g / 0.05 oz",
}

我能做什么?

5个回答

75

您可以像这样使用exists过滤器bool/must过滤器组合:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must": [
            {
              "exists": {
                "field": "price"
              }
            },
            ...     <-- your other constraints, if any
          ]
        }
      }
    }
  }
}

已废弃 (自ES5起) 您也可以使用missing过滤器bool/must_not过滤器结合使用:

{
  "query": {
    "filtered": {
      "filter": {
        "bool": {
          "must_not": [
            {
              "missing": {
                "field": "price"
              }
            }
          ]
        }
      }
    }
  }
}

但是 exists 不像 SQL 中的 IS NULL 吗? 如果不检查“字段”,它会检查字段的值。也许我误解了文档。@Val - Ekaitz Hernandez Troyas
如果您的文档没有price字段,那么它也不能有price值,因此没有price字段的文档将无法匹配。 - Val
没错,我做到了。原来是我的数据有问题,同时我也误解了文档说明。现在它可以使用了。非常感谢@Val。 - Ekaitz Hernandez Troyas
此内容已被弃用,请查看 @Devi 的答案。 - Dexter
1
@Dexter missing已经被弃用,但exists没有。 - Val

28
exists query 替换了ES 2.1中的 exists 过滤器,其工作方式相同。同时移除了missing filter,missing query已被弃用。
要获取所有具有特定字段的文档,
"bool": {
    "must": {
        "exists": {
            "field": "my_field"
        }
    }
}

要获取所有不包含特定字段的文档,可以像这样使用must_not

"bool": {
    "must_not": {
        "exists": {
            "field": "my_field"
        }
    }
}

Elastic 文档:https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-missing-query.html


24

9
您可以使用exists过滤器:
{
  "query": {
    "filtered": {
      "filter": {
        "exists": {
          "field": "status"
        }
      },
      "query": {
        "match_all": {}
      }
    }
  }
}

您好,Alain:


8
GET /_search
{
    "query": {
        "exists" : { "field" : "price" }
    }
}

来源:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-exists-query.html

存在查询可以用于查找具有指定字段的文档。该查询将匹配至少存在一个非空值的文档。

下面是一个例子:

{
    "exists": { "field": "user" }
}

这个查询会匹配那些至少包含一个非空"user"字段的文档。它还可以被嵌套在其他查询中,例如bool查询。


这是最新的7.16版本的正确内容。 - dtc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接