Elasticsearch返回一行,其中包含“不能存在”查询的现有字段

iezvtpos  于 2023-01-29  发布在  ElasticSearch
关注(0)|答案(2)|浏览(170)

我有一个带有可选日期/时间字段lastChackoutDate的索引。尝试按rangeterm筛选行查询返回0行,但我知道有些文档中存在此字段的值。
Map查询返回预期的答案,其中包含:

... ,
"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未阐明“exists”响应详细信息:* 常量分数(+到父数据块联接查询(嵌套路径.id:某个唯一id)-常量分数(字段名称:最后 checkout 日期)),乘积:*
那么有什么方法可以确定为什么字段对于查询不可见呢?
这对于每次创建和删除的测试数据库都很有效,但现有存储总是给我任何有效(从我的POV)查询0命中。OFC我为现有数据库做了一个迁移操作(至少不知何故,Map信息出现了一个新字段)。
弹性文档显示了“exists”查询可能失败的一些示例:

  • 源JSON中的字段为空或[]
  • 该字段具有“索引”:Map中的假集
  • 字段值的长度超过了Map中的ignore_above设置
  • 字段值格式错误,Map中定义了ignore_malformed
    但我不确定我的情况是否适合。
amrnrhlw

amrnrhlw1#

新文档在迁移发生之前被添加。因此AFAIK Elastic不会重新索引现有文档,直到它们在索引中被更新。
这就是为什么在测试数据库中没有问题。

oalqel3c

oalqel3c2#

试试这个

GET /index_name/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "exists": {
            "field": "fieldname"
          }
        }
      ]
    }
  }
}

相关问题