Elasticsearch返回具有现有字段的行,用于“必须不存在”查询

时间:2020-02-18 16:17:27

标签: elasticsearch

我有一个带有可选日期/时间字段的索引,名为lastChackoutDate。尝试通过rangeterm查询过滤行将返回0行,但我知道有些文档中存在该字段的值。
映射查询返回给我一个预期的答案:

... ,
"lastCheckoutDate": {
    "type": "date"
},
...

试图确定哪些查询可以返回我所等待的结果,最终导致我遇到一个表达式:

{
  "from": 0,
  "query": {
    "bool": {
      "filter": [
        {
          "bool": {
            "must_not": [
              {
                "exists": {
                  "field": "lastCheckoutDate"
                }
              }
            ],
            "must": [
              {
                "nested": {
                  "path": "nested_path",
                  "query": {
                    "term": {
                      "nested_path.id": {
                        "value": "some_unique_id"
                      }
                    }
                  }
                }
              }
            ]
          }
        }
      ]
    }
  },
  "size": 50,
  "sort": [
    {
      "displaySequence": {
        "order": "asc"
      }
    }
  ]
}

这使我返回了具有现有路径/值的单行:

hits
    [0]
        _source
            lastCheckoutDate: 2020-01-23T00:00:00
此查询的

explain并未说明“存在”响应的详细信息: ConstantScore(+ ToParentBlockJoinQuery(nested_pa​​th.id:some_unique_id)-ConstantScore(_field_names:lastCheckoutDate)),其结果是:

那么,有什么方法可以确定为什么字段对于查询不可见?
这对于每次创建和删除的测试数据库都很好,但是对于任何有效的查询(来自我的POV),现有的存储总是使我得到0次匹配。我对现有数据库进行了迁移操作(至少以某种方式为新字段显示了映射信息)。

弹性文档显示了“现有”查询可能失败的一些示例:
-源JSON中的字段为null或[]
-该字段具有“ index”:映射中设置为false
-字段值的长度超出了映射中的ignore_above设置
-字段值格式错误,并且在映射中定义了ignore_malformed

但我不确定我的情况是否适用。

1 个答案:

答案 0 :(得分:0)

在迁移发生之前添加了新文档。因此,AFAIK Elastic在索引中更新现有文档之前不会对其重新编制索引。
这就是为什么在测试数据库上我没有问题的原因。