当字段不存在vs字段存在但为null{}时,是否有一种方法可以区分Elasticsearch

问题描述

我有2种文件

"doc1":{
    "dummy_attribute":"HI",...
    "important_attribute":{}
}
"doc2":{
    "dummy_attribute":"HI",...
}

如果我这样搜索

GET myindex/_search
{
  "query": {
    "bool": {
      "must_not": [{
        "exists": {
          "field": "important_attribute"
        }
      }]
    }
  }
}

它给我两个文件。 有没有一种方法可以只搜索文档中实际上不存在“ important_attribute”的文档?

解决方法

不幸的是,由于ES treats a non-existent value the same way as an empty-ish valuenull""[]{}),这是不可能的。

您可以使用脚本字段快速检查文档是否包含空字典,但是在过滤时无法使用此上下文:

GET myindex/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "important_attribute"
          }
        }
      ]
    }
  },"script_fields": {
    "has_empty_dict": {
      "script": {
        "source": "params._source.containsKey('important_attribute') && params._source.important_attribute.size() == 0"
      }
    }
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...