Elasticsearch中范围查询的奇怪行为

费岑

我的问题很简单。我有一个ES索引,其中包含updated作为UNIX时间戳的字段我的索引中只有测试记录(文档),这些记录都是今天创建的

我有以下查询,它运行良好,并且(严格地)在执行时不返回任何结果:

GET /test_index/_search
{
  "size": 1,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "updated": {
              "lt": "159525360"
            }
          }
        }
      ]
    }
  },
  "sort": [
    {
      "updated": {
        "order": "desc",
        "mode": "avg"
      }
    }
  ]
}

这样就可以了。但是,当我将查询中的时间戳更改为较小的数字时,会得到多个结果!这些结果在updated字段中都包含5000大得多的值更令人困惑,我得到的结果与updated在的范围仅是设置19719999所以数字很喜欢150010000表现得很正常,我看不到任何结果。下面是行为奇怪的查询。

GET /test_index/_search
{
  "size": 100,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "updated": {
              "lt": "5000"
            }
          }
        }
      ]
    }
  },
  "sort": [
    {
      "updated": {
        "order": "desc",
        "mode": "avg"
      }
    }
  ]
}

顺便说一句,这就是我存储在该索引中的典型文档的样子:

{
    "_index" : "test_index",
    "_type" : "_doc",
    "_id" : "V6LDyHMBAUKhWZ7lxRtb",
    "_score" : null,
    "_source" : {
      "councilId" : 111,
      "chargerId" : "15",
      "unitId" : "a",
      "connectorId" : "2",
      "status" : 10,
      "latitude" : 77.7,
      "longitude" : 77.7,
      "lastStatusChange" : 1596718920,
      "updated" : 1596720720,
      "dataType" : "recorded"
    },
    "sort" : [
      1596720720
    ]
}

这是该索引的映射:

PUT /test_index/_mapping
{
    "properties": {
        "chargerId":  { "type": "text"},
        "unitId":  { "type": "text"},
        "connectorId":  { "type": "text"},
        "councilId": { "type": "integer"},
        "status": {"type": "integer"},
        "longitude" : {"type": "double"},
        "latitude" : {"type": "double"},
        "lastStatusChange" : {"type": "date"},
        "updated": {"type": "date"}
    }
}

有什么解释吗?

乔·索罗辛

ES中日期字段的默认格式为strict_date_optional_time||epoch_millis由于您未指定epoch_second,因此您的日期被错误地解析(自时代以来被视为毫秒)。通过运行以下脚本可以验证:

GET test_index/_search
{
  "script_fields": {
    "updated_pretty": {
      "script": {
        "lang": "painless",
        "source": """
          LocalDateTime.ofInstant(
             Instant.ofEpochMilli(doc['updated'].value.millis),
             ZoneId.of('Europe/Vienna')
          ).format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"))
          """
      }
    }
  }
}

快速修复:如下更新映射:

{
  ...
  "updated":{
    "type":"date",
    "format":"epoch_second"
  }
}

并重新编制索引。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Elasticsearch插入后查询的奇怪行为

来自分类Dev

奇怪的范围行为

来自分类Dev

领域查询的奇怪行为

来自分类Dev

Elasticsearch在范围查询中找不到值

来自分类Dev

$in 内部查询,MongoDB 中没有结果,奇怪的行为

来自分类Dev

TOP 在带有 Order By 的子查询中的奇怪行为

来自分类Dev

Elasticsearch 地理搜索奇怪的行为

来自分类Dev

SQL查询:奇怪的SUM行为

来自分类Dev

SQL Server查询,奇怪的行为

来自分类Dev

查询Solr时的奇怪行为

来自分类Dev

GHCi中的奇怪行为

来自分类Dev

PHP中的奇怪行为

来自分类Dev

NSViewController中的奇怪行为

来自分类Dev

PHP中的奇怪行为

来自分类Dev

$ scope中的奇怪行为。

来自分类Dev

Laravel 中的奇怪行为

来自分类Dev

日期范围查询Elasticsearch

来自分类Dev

Golang范围表达式的奇怪行为

来自分类Dev

tr使用范围的奇怪行为

来自分类Dev

Groovy半独有范围的奇怪行为

来自分类Dev

如果是perl,则代码引用中的变量范围需要解释奇怪的行为

来自分类Dev

在Elasticsearch中在多个日期上具有多个范围的查询

来自分类Dev

Elasticsearch查询中的条件和范围过滤器

来自分类Dev

如何在我的Elasticsearch查询中附加时间戳范围?

来自分类Dev

如何在范围查询 Elasticsearch 中给出时间戳

来自分类Dev

递归函数中的奇怪/奇怪行为

来自分类Dev

SQL:奇怪的查询性能行为

来自分类Dev

奇怪的SQLite行为。结果不同;相同的查询

来自分类Dev

SQL:奇怪的查询性能行为