Elasticsearch中keyword和numeric对性能的影响分析

初学者认为这两个关键字的没啥关系,一个是用于字符串的精确匹配查询,一个是数字类型的字段用在计数的场景,比如说博客的点赞数,订单金额等。

但是有些场景似乎两个关键字都可以用,比如电商场景下的订单状态,一般我们也是用数字表示不同的状态,比如1表示待支付,2表示支付成功。第一反应是用Byte(属于numeric),没有问题。但是用keyword是否可以呢?

numeric除了支持等值精确查询,还可以范围查询。但是大部分情况下我们业务场景对于订单状态的使用都是精确查询的,不会有大于某个状态或者小于某个状态这样的情况。

所以刚才说的订单状态的场景,用keyword和numeric肯定都可以满足。域名交易但是那种方案好呢?答案是keyword。对于keyword类型的term query,ES使用的是倒排索引。但是numeric类型为了能有效的支持范围查询,它的存储结构并不是倒排索引。

我们知道倒排索引在内存里维护了词典 (Term Dictionary)和文档列表(Postings List)的映射关系,倒排索引本身对于精确匹配查询是非常快的,直接从字典表找到term,然后就直接找到了posting list。

numeric类型从lucene6.0开始,使用了一种名为block KD tree的存储结构。

kd-tree(k-dimensional树的简称),是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。这种存储结构类似于mysql里的B+数,我们知道B+数这种数据结构对于范围查找的支持是非常好的。不同于mysql, Block KD tree的叶子节点存储的是一组值的集合(block),大概是512~1024个值一组。这也是为什么叫block kd tree。

Block KD tree对于范围查询,邻近搜索支持的非常好,尤其是多维空间的情况下。

每个节点有三个元素,所以这里K=3,不同于简单二叉树每个节点都是一个元素(如下面这个图)。这样就可以方便的在一个三维的空间进行范围的比较。

标准的二叉树

对于上图中的kd-tree,搜索的过程是这样的:首先和根节点比较第一项,小于往左,大于往右,第二层比较第二项,依次类推。每层参与比较的数据是不一样的。

具体的ES内部(其实是Lucene),目前的版本是基于所谓的PointValues,比如整型在Lucene内部是IntPoint类表示,还有DoublePoint等,完整的对应关系是:

Java type  Lucene classint         IntPointlong        LongPointfloat       FloatPointdouble      DoublePointbyte[]      BinaryPoint

而这些PointValues是基于kd-tree存储的,根据官方文档的介绍,lucene把叶子节点在磁盘是顺序存储的,这样搜索的效率就会非常高。

为啥numeric对于term精确匹配的查询性能没有keyword好

前面我们提到了IntPoint类,这个类有三个查询方法:

//构造精确查询,内部还是调用newRangeQueryQuery newExactQuery(String field, int value)

//构造一维查询,内部是调用多维查询的方法Query newRangeQuery(String field, int lowerValue, int upperValue)

//构造多维查询Query newRangeQuery(String field, int[] lowerValue, int[] upperValue)

IntPoint.java

比如我们有这样一个索引:

PUT blogs {  "mappings": {    "properties": {       "title":    { "type": "keyword"  },       "content":    { "type": "text"  },       "status":     { "type": "integer"  }    }  }}

如果我们基于status查询,

{  "query": {    "term": {      "title": {        "status": 2      }    }  }}

在lucene内部其实还是进行了一个2~2的范围查询。即便kd-tree的性能也很高,但是对于这种精确查询还是要到树上走一遭,而倒排索引相当于是直接在内存里就定位到了结果集的文档id。如果是bool组合查询的话,term还可以利用跳表,这点numeric字段也是做不到的。

(0)

相关推荐

  • nanoflann库

    点云处理过程中可能会遇到寻找最临近点的问题,常用的解决方案就是用空间换效率.例如建立kd-tree等树状结构来代替遍历. 这里向大家介绍一个nanoflann工程,nanoflann 算法对fasta ...

  • PCL中Kd树理论

    k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 01   Kd简介 K-D树是二进制空间分割树的特殊的 ...

  • 树与树算法

    树的概念树(英文:tree)是一种抽象数据类型(ADT)或者实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合.它是由n(n>=1)个有限节点组成一个具有层次关系的集合.把它叫做 ...

  • 絮凝剂在机砂中的残留量对混凝土性能的影响

    0 前言 近几年,随着建筑业蓬勃发展,砂石紧张,且质量越来越差,含泥含粉高的各类山砂.机砂也不得已使用.由于环保部门的严厉监管,明确要求砂石生产企业废水不得外排,故大量砂石生产企业在污水处理工艺中采用 ...

  • 单塔双循环脱硫运行方式对性能的影响分析

    本文阐述了单塔双循环工艺的技术特点,并结合330MW燃煤锅炉脱硫系统的实际运行方式,通过对分区功能化的实现.系统安全性.吸收剂耗量和副产物品质的分析,梳理了单塔双循环工艺的控制要点,提出了选择运行方式 ...

  • 典型零部件变形对电机整机性能的影响分析

    简单地讲,我们可以把电机的性能归结为机械和电气两部分,机械性能的符合性,主要取决于加工零部件的精度和配合关系,同时零部件的配合关系,还直接或间接地对电机的电气性能造成影响,对于该问题,我们从零部件的变 ...

  • 中低温焊接容器板SA612M性能分析

    SA612M是一种中低温焊接压力容器用镇静C-Mn-Si钢板 其主要技术条件如下 一.适用范围 本技术协议适用于最大厚度25mm的中低温焊接压力容器用镇静C-Mn-Si钢板的生产及检验. 二.SA61 ...

  • 【e汽车】中大型SUV不可谈性能?福特新锐界ST就是要秀给你看!

    在国内合资7座SUV领域,锐界应该是唯一与汉兰达匹敌的中大型SUV,经过几年的市场沉浸,锐界已经拥有了不少的用户和不错的口碑,但同时,锐界也到了中期改款的时候了. 说曹操,曹操就到.这次的上海车展上, ...

  • 美标中、低温容器板SA516Gr55性能

    美标中、低温容器板SA516Gr55性能

  • 中温容器板15CrMoR性能分析,15CrMoR化学成分

    一.15CrMoR钢板是压力容器用钢,属于一种中温抗氢钢.二.15CrMoR热处理常采用:正火加回火,在550℃以下时,具有较高的持久强度."15"是碳含量成分0.15%" ...

  • 干货!机器学习中,如何优化数据性能

    得益于覆盖各种需求的第三方库,Python在今天已经成为了研究机器学习的主流工具.不过由于其解释型语言的特性,在运行速度上往往和传统编译型语言有较大差距.特别是当训练数据集非常庞大时,很多时候处理数据 ...

  • 联发科王者归来!推出廉价新5G中端神U:性能直追骁龙865

    [11月23日讯]相信大家都知道,在国产手机阵营中,唯独国产手机老大哥华为拥有自研麒麟芯片,而对于其他手机厂商而言,一直都依赖于高通骁龙旗舰芯片产品,所以华为手机也被视为"国货之光" ...