【问题标题】:Best way to check if a field exist in an Elasticsearch document检查 Elasticsearch 文档中是否存在字段的最佳方法
【发布时间】:2016-01-02 03:39:05
【问题描述】:

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

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

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

我能做什么?

【问题讨论】:

    标签: elasticsearch exists


    【解决方案1】:

    您可以将exists filterbool/must filter 结合使用,如下所示:

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

    已弃用(自 ES5 起)您还可以将 missing filterbool/must_not filter 结合使用:

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

    【讨论】:

    • 但是exists不像SQL的IS NULL?如果不检查“字段”,它会检查字段的值。也许我误解了文档。 @Val
    • 如果你的文档没有price字段,那么它也不能有price值,所以没有price字段的文档将不会被匹配。
    • @EkaitzHernandezTroyas 你试过这个吗?运气好吗?
    • Val 是的,我可以做到,这是我的数据有问题,而且我也误解了文档。它正在工作。谢谢@Val。
    • @Dexter missing 已被弃用,但 exists
    【解决方案2】:
    GET /_search
    {
        "query": {
            "exists" : { "field" : "price" }
        }
    }
    

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

    【讨论】:

      【解决方案3】:

      你可以直接做

      {
          "query": {
              "exists": {
                  "field": "fieldName"
              }
          }
      }
      

      如果你也想添加一些匹配,那么你可以去

      {
          "query": {
              "bool": {
                  "must": [{
                      "match": {
                          "fieldName": "value"
                      }
                  },
                  {
                      "exists": {
                          "field": "fieldName"
                      }
                  }]
              }
          }
      }
      

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

      【讨论】:

        【解决方案4】:

        exists 过滤器已被 ES 2.1 中的exists query 取代,尽管它的工作原理是相同的。此外,删除了缺失的过滤器并弃用了缺失的查询。

        要获取具有特定字段的所有文档,

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

        要获取所有没有特定字段的文档,请将其与 must_not 一起使用

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

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

        【讨论】:

          【解决方案5】:

          您可以使用存在过滤器:

          {
            "query": {
              "filtered": {
                "filter": {
                  "exists": {
                    "field": "status"
                  }
                },
                "query": {
                  "match_all": {}
                }
              }
            }
          }
          

          问候, 阿兰

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-03-04
            • 1970-01-01
            • 2019-08-06
            • 1970-01-01
            • 2023-03-07
            • 1970-01-01
            • 2010-09-18
            相关资源
            最近更新 更多