Es索引中时间字段是字符串Range查询的正确姿势

这篇具有很好参考价值的文章主要介绍了Es索引中时间字段是字符串Range查询的正确姿势。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 问题

    由于之前搞了一个使用flink-cdc将mysql表中的数据同步到es的索引中,例子中数据库中的orders表中的order_date的字段类型是datetime类型,flink-sql建表orders、enriched_orders中的order_date 字段是TIMESTAMP(0)类型,同步到es的enriched_orders索引中的order_date的类型是:

查询索引的mapping结构语句:
GET enriched_orders/_mapping
enriched_orders索引的order_date字段类型如下:
"order_date" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
 }

    数据被同步到enriched_orders索引的时候不需要我们创建索引,该索引会自动创建,自动创建的也是可以使用的,如果业务的数据模型有特殊格式要求,可以自己重新设计下数据模型,然后自己先把索引创建好,然后使用cdc同步数据到索引中,需要注意的就是三边的字段的类型的对应,如果字段类型不对应估计是会报错的,这种方式我还没有试过的,哪哈具体的业务上在试下看看,然后就写了下面一个语句根据这个order_date字段查询一个时间范围的数据,DSL语句如下:

GET enriched_orders/_search
{
  "query": {
    "range": {
      "order_date": {
        "gte": "2020-07-30 10:00:00",
        "lte": "2020-07-31 10:38:11"
      }
    }
  }
}

    这种方式居然查不到数据,这也是有点奇葩的,这个问题是分词的问题。

2. Es索引的mapping模式

Elasticsearch 索引映射类型及mapping属性详解

https://www.knowledgedict.com/tutorial/elasticsearch-index-mapping.html

2.1 dynamic动态宽松模式(动态映射)

    Es默认索引的mapping是 dynamic:动态宽松模式,也就是随便写,数据自动冗余,es会根据你写入索引的字段数据进行自动推断该是什么类型,这种方式会导致:字段爆炸(字段膨胀)这种操作在有的时候是很危险的,也就是可以在mapping里面随意加字段,一个不小心随意加了字段可能就导致业务代码报错了,这种方式默认大小为:

index.mapping.total_fields.limit:1000  # dynamic 这种方式最多加到1000字段的限制,想超过1000可以修改这个参数

    可以加上dynamic:"false"的限制,dynamic 设置为 false 后,新来的非 mapping 预设字段数据可以写入,但是:不能被检索,仅支持 Get 获取文档的方式通过 _source 查看详情内容。

2.2 strict严格模式(静态映射)

    也就是当你在写入数据的时候,写入数据格式中的字段不是mapping中定义限定好的,那么将会写入失败,这个就不可以随随便便写入数据了,数据更严谨,一般还是推荐这种方式,先设计数据模型及使用了恰当的类型又使用了更低的存储更切合业务的需求,所以这个还是有必要设计一下的。

3. text类型和keyword类型的区别

3.1 text类型

  1. 会分词,然后进行索引
  2. 支持模糊、精确查询
  3. 不支持聚合
  4. 分词器默认standard ,对于中文来说就是按字分词
  5. 支持fields属性,可以在fields中添加keyword子类型,以实现精确检索

3.2 keyword类型

  1. 不进行分词,直接索引
  2. 支持模糊、精确查询
  3. 支持聚合
  4. 支持按字数建立索引,以便节约索引空间

4.正确姿势

GET enriched_orders/_search
{
  "query": {
    "range": {
      "order_date.keyword": {
        "gte": "2020-07-30 10:00:00",
        "lte": "2020-07-31 10:38:11"
      }
    }
  }
}

GET enriched_orders/_search
{
  "query": {
    "range": {
      "order_date.keyword": {
        "from": "2020-07-30 10:00:00",
        "to": "2020-07-31 10:38:11"
      }
    }
  }
}

    以上的查询语句都是在kibban可视化里执行的:

Es索引中时间字段是字符串Range查询的正确姿势

5. 总结

    到此我的分享就已经结束了,希望能给你带来帮助,请一键三连,么么哒!文章来源地址https://www.toymoban.com/news/detail-510125.html

到了这里,关于Es索引中时间字段是字符串Range查询的正确姿势的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 超大字符串mysql存储字段选择

    如果一个字符串超过了MySQL VARCHAR的最大长度限制,可以考虑使用以下数据类型: MySQL TEXT :TEXT类型可以存储最大长度为65,535个字符(约64KB)的文本。与VARCHAR不同的是,TEXT类型不需要预留存储空间,并且在存储时会自动进行压缩。 MySQL MEDIUMTEXT :MEDIUMTEXT类型可以存储最大长

    2024年02月11日
    浏览(39)
  • Python字符串索引

    Python中的字符串有两种索引方式,从左往右以0开始,从右往左以-1开始。 str = \\\'Runoob\\\' print (str)          # 输出字符串 print (str[0:-1])    # 输出第一个到倒数第二个的所有字符 print (str[0])       # 输出字符串第一个字符 print (str[2:5])     # 输出从第三个开始到第五个的字符 pr

    2024年02月16日
    浏览(29)
  • ES查询索引字段的分词结果

    一、_termvectors  1、查看文档中某一个字段的分词结果 GET /{index}/{type}/{_id}/_termvectors?fields=[field] 2、样例: text的值为:https://www.b4d99.com/html/202204/45672.html 得到的结果: 二、_analyze 1、语法 2、样例: text的值为:https://www.b4d99.com/html/202204/45672.html 得到的结果:

    2024年02月11日
    浏览(49)
  • ES新增字段后,查询索引中不显示这个字段

    修改ES结构,新增字段 注:为避免修改后该文件结构损坏,修改前先备份 1.复制文档 2.新增字段(text类型) 3.查询字段是否添加成功 诶?!这个时候发现没有添加成功? 然后我通过es的head插件可以看到这个字段 这个时候,我们只需要对字段进行初始化,给一个默认值就解决了

    2024年02月15日
    浏览(33)
  • ES:字符串排序,字符串按照数字排序

    对一个字符串类型的字段进行排序通常不准确,因为已经被分词成多个词条了 字段虽然是字符串,但是其实值是整数, 排序按照字符串转成整数排序 解决方式:对字段索引两次,一次索引分词(用于搜索),一次索引不分词(用于排序) 期望按照字符串排序, 不分词 期望按照

    2024年02月11日
    浏览(27)
  • 【Elasticsearch】ES精确查询和范围查询,ES时间字段排序实例,ES倒排索引介绍

    termQuery matchQuery 模糊查询 multiMatchQuery 多个字段模糊查询 如果时间字段写入时用的类型是Text,可以用“时间字段.keyword”来处理 #查询前传入分页参数 #分页后拿到总记录数 把文档D对应到的映射转换为到文档ID的映射,每个都对应着一系列的文档,这些文

    2024年02月15日
    浏览(97)
  • MySQL 中的字段截取与字符串截取方法详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 在 MySQL 数据库中,有时我们需要截取字段或字符串的一部分进行查询、展示或处理。本文将介绍 MySQL 中常用的字

    2024年02月12日
    浏览(40)
  • MySQL实战解析底层---怎么给字符串字段加索引

    目录 所谓前缀索引 前缀索引对覆盖索引的影响 其他方式 所谓前缀索引 现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是今天要讨论的问题 假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的 由于要使用邮箱登录,所以业务

    2023年04月09日
    浏览(56)
  • mysql中的实现字段或字符串拼接的三种方式

    concat函数是将多个字段或字符串拼接为一个字符串;但是字符串之间没有任何分隔。 concat函数官方介绍 执行结果如下: 执行结果如下: 如果拼接的字段中有一个为null,则结果为null。 执行结果如下: concat_ws函数将多个字段或字符串拼接为一个字符串,且字符串直接可以指定

    2024年02月22日
    浏览(64)
  • 字符串查询--Python

    str1 = \\\'hello python\\\'  index 需求:查找p所在的索引位置  格式: 字符串.index(self(不用传值), sub(子字符串), start(起始位置), end(结束位置)) print(str1.index(\\\'p\\\'))  # 6 如果字符串中含有多个子字符串,则会返回指定范围内的从左至右的第一个查找到的子字符串位置索引 print(str1.index(\\\'o\\\'))  #

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包