百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Elasticsearch字段类型之Range经典应用场景

toyiye 2024-06-21 11:57 7 浏览 0 评论

序言

Elasticsearch产品功能越来越强大,字段类型支持很多种,部分类型还引入了专用的算法。一个客户企业选中Elastic作为搜索中台,居然是看中了Elastic的Range字段类型,下面就围绕这个Range类型展开。

现状背景

背景需求

客户企业行业所属传统工业领域,有自己专业化的工业信息平台,多年发展积累了大量的工业产品信息,数据量在几个TB级以上,每种工业产品都有大量的标签信息,标签信息多数属于数值类型,且是属于范围那种数据,如某安防头盔尺寸是L码,配合适合范围55cm~65cm,对于此种数据查询,若标签属性较少,还可以走传统的数据库索引查询,若标签属性很多,则显然很吃力。

原有方案

企业技术负责人入行IT很早,原始的技术栈组合是Sqlserver+Clucene组合,原始工业产品信息存储在数据库中,搜索查询走Clucene,有很多问题,如下:

  • 自主包装Clucene核心库,框架与业务代码深度耦合,单次需求变更都需要发布版本,不具备稳定性
  • 索引实时更新几乎没有,属于离线更新,且更新一次周期很长
  • Clucene版本很旧,对于搜索的支持还是早期分词阶段,仅支持倒排索引
  • 对于范围搜索,采用的是分词方式实现,不能做到精确的范围搜索,这个是最核心迫切需要的功能
  • 基于Clucene开发的搜索应用 ,索引数据太大,客户花很多精力实现分布式,且效果不理想

原有技术栈体系

技术实现

相比传统关系型数据库,Elasticsearch实现的方式更加直接高效。

Range类型设置

Elasticsearch支持多种范围类型

  • 数值类型
  • 日期类型
  • IP地址类型

设置索引字段映射类型示意图

若在关系数据库中则每个标签属性需要2个字段表示范围值。

Range数据填充

填充范围数据,有多种表达式

  • 大于,gt
  • 小于,lt
  • 大于等于,gte
  • 小于等于,lte

填充字段数据示意图

Range数据查询

查询语法很简单,不过查询的关联关系有几种

  • 相交,查询条件的范围与字段数据范围有交叉,默认使用
  • 包含,查询条件的范围值,包含字段的数据范围值
  • 反包含,与包含相反,查询条件的范围值包含在字段的数据范围之内。

范围条件查询示意图

若在关系数据库中查询相交则需要2组表达式合并才可以,若多个标签属性同时查询,则更复杂。

技术原理

在跟客户企业沟通中,发现比较重要的信息是,技术负责人对于搜索领域的知识认知比较陈旧,Lucene发展早已不仅仅是倒排索引,已经支持了很多索引算法,且应用领域也早就突破分词搜索,Elastic产品版本近年更新很快,相应的Lucene也一样

为什么选择Elasticsearch替代关系型数据库做范围查询最合适呢?原因如下

产品功能

Elasticsearch核心功能发展时间

Elasticsearch从2016年引入了BKD树算法,在构建索引时会依据字段类型设置不同的算法实现,无需要人工干预,只要设计正确的类型,如下

  • 若是字符类型的,基于 Inverted Index 构建索引
  • 若是数值类型,基于 BKD-Tree 构建索引

算法介绍

BKD-Tree算法示意图

  • Bkd-Tree作为一种基于K-D-B-tree的索引结构,用来对多维度的点数据(multi-dimensional point data)集进行索引。关于构建BKD-Tree过程不在本文探讨范围内,详细可以查阅更专业的论文。
  • 从前面客户需求描述得到,客户的工业产品信息有很多范围类型的标签属性,在Elasticsearch中,仅需要构建一个索引即可满足高效查找,且默认是所有标签属性自动构造索引。
  • 想想看若基于传统关系型数据库实现,每标签属性都需要至少2个字段,且多个标签属性要任意组合查询,不能通过一个索引实现,需要创建很多索引,查询时还必须保持最左原则;
  • BKD-Tree索引查询效率比关系型数据库的BTree更胜一筹。


结语

经验总结

  • Elastic核心基于Lucene,功能发展非常成熟,普通用户没有必要基于Lucene自主开发搜索应用,只需要关注自己的业务实现。
  • 数据产品的竞争更多的是产品背后实现算法的竞争,对于我们来说需要经常更新自己的知识体系,选择最合适的技术方案响应变化。
  • DB与ES混合应用已经成为当前潮流,Elastic已经成为当前查询应用标配
  • ES用的好,下班必须早

关于我们

  • 李猛(ynuosoft),是Elastic-stack产品深度用户,通过Elastic工程师认证,2012年接触Elasticsearch,对Elastic-Stack开发、架构、运维等方面有深入体验,实践过多种Elastic项目,最暴力的大数据分析应用,最复杂的业务系统应用;业余为企业提供Elastic-stack咨询培训以及调优实施;多年IT实战经验,专注大数据,机器学习,系统架构。
  • 深圳星图智能 星图智能是Elastic官方MSP技术合作伙伴

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码