elasticsearch flattened 不支持 numeric range 却又支持 range查询?

问题描述

在这里插入图片描述

最近开始玩 elasticsearch,刚玩到 flattened 时,发现它文档里面有这么一句话 :

Only basic queries are allowed, with no support for numeric range queries or highlighting.

此类型只提供基本查询,不提供numeric的range查询以及高亮。

可是,当我往下翻阅文档的时候,发现它支持的类型中出现了range?Supported Operations

  • term, terms, and terms_set
  • prefix
  • range
  • match and multi_match
  • query_string and simple_query_string
  • exists

这是怎么回事呢?好奇使我成长~

分析

继续查阅文档,不经意间我们看到了这么一句话。

it treats all values as keywords。

flattened 会将所有的值都以 keywords 进行存储 (所以数字的存储也会是keyword,时间类型也并不会自动转成timestamp进行存储)

在这里插入图片描述

那么博主猜测,是不是因为它将所有的值都转成了keyword,所以才不支持 numeric range的?毕竟keyword时可以进行对比的,但是它是按照 ascii 码逐一进行对比,那么数字转成 keyword后,确实对比的值会不正确?ascii码表

那么我们来验证这一猜测。

首先创建一个带有 flattened 的mapping

PUT flattened_range
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "labels": {
        "type": "flattened"
      }
    }
  }
}

再添加几条数据!!

POST flattened_range/_doc/1
{
  "title": "flattened range 1.",
  "labels": {
    "number": 20,
    "time": "2022-02-12 11:35:09"
  }
}

POST flattened_range/_doc/2
{
  "title": "flattened range 2.",
  "labels": {
    "number": 80,
    "time": "2022-02-12 11:36:09"
  }
}

POST flattened_range/_doc/3
{
  "title": "flattened range 3.",
  "labels": {
    "number": 100,
    "time": "2022-02-12 11:37:09"
  }
}

POST flattened_range/_doc/4
{
  "title": "flattened range 4.",
  "labels": {
    "number": 130,
    "time": "2022-02-12 11:38:09"
  }
}

那么,接下来我们进行数据查询:

GET flattened_range/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "labels.number": {
              "gte": 10,
              "lt": 90
            }
          }
        }
      ]
    }
  }
}

查询结果是 20 80 100 130 都被查询出来了,这是因为字符串中的ascii码逐一对比,这些结果的首字母都大于等于1,小于等于9。

再查一次:

GET flattened_range/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "labels.number": {
              "gte": 10,
              "lt": 15
            }
          }
        }
       
      ]
    }
  }
}

查询结果是 100 130 符合猜测预期!!!

在这里插入图片描述

结论

flattend 的 range 查询是针对keyword进行查询,逐个对比ascii码进行过滤,在数字转成 keyword的情况下,结果会不准确。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值