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

Elasticsearch 7 SQL搜索优化

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

作者:舒祝 翻译

全面升级可增强查询功能,提高集群性能并简化集群配置。



Elasticsearch最初是一个文档数据库,位于Lucene文本搜索引擎库之上。不久后,被一些相关的应用程序开始进行使用,Elasticsearch系列产品的缩写是ELK:Elasticsearch;Logstash,数据管道工具,主要用于从Elasticsearch数据库中获取数据;还有数据可视化构建工具包Kibana。


此后,ELK三人组加入了一个小的“数据托运人”实用程序:Beats产品。与Logstash相似,Beats产品将数据从外部源移动到Elasticsearch数据库中。它们在运送数据的来源方面有所不同。Filebeat旨在读取和转发日志文件的内容(例如Logstash,但没有Logstash的转换和聚合功能)。Metricbeat读取从Windows,Mac或Linux主机收集的系统指标数据。Metricbeat还可以从Microsoft SQL Server,MySQL,PostgreSQL和其他来源收集企业应用程序指标。


Beats组中有很多兄弟产品。您可以在Elastic网站上找到Beats的全系列。同样,随着Elastic Stack 7.x的推出而出现的功能和产品更新也是一个很长的话题。尽管对于Elastic Stack 7.x发行版中各个组件的所有更新都有很多话要说,但是本文将主要集中于对堆栈基础的增强和改进:Elasticsearch本身。


Elasticsearch SQL


Elasticsearch工程师不得不尝试将SQL移植到Elasticsearch上。有太多的数据库技术人员,他们每天都在使用SQL,SQL查询引擎将为RDBMS用户在Elasticsearch领域铺平道路。


需要说明的是,Elasticsearch并不支持所有特定的SQL标准(其中有几个)。大多数情况下,您可以进行搜索,这意味着您可以使用SELECT和DESCRIBE命令。后者(DESCRIBE)显示特定索引的模式。


那么,SELECT是如何工作的呢?Elasticsearch SQL在线文档是如何包含一些前所未闻的词的,比如“表”和“列”?


必要时,Elasticsearch查询在事件范围的两侧跳动,将关系数据库部分与NoSQL数据库部分分隔开来。因此,当SQL涉及到Elasticsearch时,索引变成表,字段变成列。这种重命名是必要的,这样任何熟悉SQLite中的.schema命令的人都会觉得很熟悉。而且,DESCRIBE命令的输出(一个显示列,SQL类型和相应的Elasticsearch数据类型的ASCII表)将非常容易。


当然,字段不能简单地充当列的角色。Elasticsearch允许在文档字段中嵌套对象——字段中的字段。幸运的是,索引模式的ElasticsearchSQL输出处理这个问题的方式与Elasticsearch处理底层情况的方式相同:点符号用于“拼合”嵌套字段。
如上所述,您不能插入、更新或删除。也不能执行联接、联合或嵌套选择。但是您可以使用Elasticsearch的聚合和统计运算符,并且可以检索查询得分。因此,虽然Elasticsearch的SQL乍一看似乎没什么活力,但它实际上非常健壮,特别是它让RDBMS工程师过渡到Elasticsearch变得更加容易。
最后,虽然可以通过Elasticsearch的REST API提交SQL查询,但现在可以使用ODBC和JDBC驱动程序来在Windows和Java应用程序中启用Elasticsearch SQL查询。


Elasticsearch中的副本选择


Elasticsearch7.x的一些改进就是所谓的“基础结构升级”。自适应副本选择是在Elasticsearch 6.x中进行的;它在Elasticsearch 7中已经成熟。其目的是为了解决一些问题,即在执行搜索时,对副本节点的循环选择可能落在一个正忙于执行垃圾收集或遭受其他性能下降(如磁盘I/O或网络饱和)的节点上甚至可能是所选节点是在功能较弱的硬件上运行(与其同级副本节点相比)。
从用户应用程序接收查询的节点称为“协调器”节点。协调器将查询分散到所有相关的数据节点,这些节点执行实际的数据库搜索。自适应副本选择提供协调节点“看到”的数据节点的性能状态。协调器能够使用这些状态来选择给定副本集中的最佳节点,从而最大限度地提高为特定副本集绑定的查询部分接收到尽可能快的响应的可能性。注意:分片是索引的分区,是索引元素的子集。该索引分为多个分片,以便可以在群集节点之间分布。为了容错,给定的分片将复制到多个节点上。承载给定碎片副本的节点集是一个副本集,其成员称为副本。
集群协调是另一个重要且持续变化的领域(事实上,自从第一个Elasticsearch 7.x版本发布以来,已经发生了变化)。“发现”是集群用来标识其所有成员节点以及确定哪个主节点是集群主节点的过程。发现必须快速有效。发现必须迅速而有效;不完整的节点成员可能会创建一个“分裂的大脑”,即两个集群应该是一个集群。(他们分离的时间越长,他们的内容就越分散。)快速确定集群的主节点是最重要的。主节点不仅是集群当前配置和状态的真实来源,而且主节点是唯一可以更改集群状态的节点。主节点负责对所有集群成员执行ping操作,以验证集群运行状况。
过去,Elasticsearch使用Zen发现机制,该机制支持多种形式的发现(单播,基于文件等)。随着时间的流逝,Elasticsearch工程师认识到正确配置Elasticsearch集群的发现参数非常重要。他们目睹了许多错误的配置,最终导致了不稳定。因此,Elasticsearch已迁移到单个发现实施,从而消除了不稳定的风险。集群管理员不再需要调整配置参数,并希望最新的调整不会使集群性能下降。(然而,根据给定实例的环境,可以使用“发现插件”来增强发现过程。发现插件的列表可以在Elastic网站找到。)


Elasticsearch中的跨集群搜索


在以往的版本中,如果希望搜索跨多个集群,则可以将参与群集中的特定节点选为“tribe”节点。实际上,一个tribe节点是多个集群的成员(考虑双重或多重身份)。因此,发送到一个tribe节点(将成为该查询的协调节点)的查询将扩展到该tribe节点所属的所有集群。
当tribe节点所属的两个集群具有相同名称的索引时,这种方法的一个缺点就出现了:当满足查询请求时,tribe节点只选择这两个集群中的一个。现在,跨集群搜索允许您选择特定的节点作为“网关”节点,这些节点可以接收来自集群之外的查询请求—不再具有双重身份。此外,当您想要查询远程集群的索引时,可以在索引前面加上集群名称,类似于<cluster_name>:<index>。因此,不再需要在同名索引中任意选择tribe节点。
实际上,Elasticsearch网关节点的行为就像协调节点一样。在另一个旨在将CPU和网络压力最小化(从而减少往返查询时间)的改进中,对远程查询做出响应的Elasticsearch集群首先执行自己的查询结果缩减阶段,然后将结果返回给调用者。


Elasticsearch查询改进


一些新功能扩展了Elasticsearch已经广泛的查询功能。例如,新的rank_feature和rank_features字段类型,再加上新的“ rank feature”查询,提供了相关性调整,如果没有大量的培训集和人力来梳理培训结果,这是一项很难完成的活动。这些新的字段类型似乎是普通的浮点值数据字段,但经过精心设计,可以将它们添加到文档的分数中,使您可以在特定查询中调整文档的相关性。例如,您可能想要在rank_feature字段中获取文档受欢迎程度的值,并将其合并到文档的查询相关性得分中。
此外,这些字段可以用于搜索优化,称为“top-k检索优化”,这也是Elasticsearch 7中的新功能。简而言之,这些优化允许Elasticsearch获取查询中最相关文档的请求子集(因此称为“top-k”),而无需遍历所有适用的搜索结果。
另一种受益于“top-k检索优化”的新查询类型是新的“距离特性”查询。顾名思义,这种查询类型允许您根据时间间隔中与原点的接近程度对结果进行评分。可以参与距离查询的字段类型有date、date_nanos和geo_point类型。因此,文档的空间或时间类型字段与原点之间的距离大小可能会增加(或减少)文档的查询分数。


高级REST客户端


在分类的开发方面,虽然Java高级REST客户端出现在Elasticsearch 6.0 beta版本中,但它最终在Elasticsearch 7.0版本中宣告完成。在这种情况下,意味着现在可以使用高级REST客户端来代替传输客户端(它意味着要替换传输客户端)。
Java高级别REST客户端位于Java低级别REST客户端之上,可用于通过HTTP与Elasticsearch集群进行通信。但是,低级REST客户端将请求编组和响应编组留给用户。同时,高级REST客户端将请求和响应表示为对象。这允许高级REST客户端公开特定的API,而不需要调用者与通用HTTP方法调用进行交互。

Kibana改进


最后,有必要讨论一下Kibana,因为它已经从一种数据可视化工具发展为一种Elasticsearch超级仪表板。Kibana最初是一个用于创建和显示实时数据可视化线形图、条形图、饼图等的平台,从Elasticsearch数据库实时绘制。尽管Kibana仍然是一个可视化构建器,但它现在为管理、开发、机器学习、数据探索等提供了控制台。例如:在Kibana的索引管理控制台中,可以显示字段映射(索引模式)、索引摘要指标(文档数量、消耗的磁盘存储空间等)、索引默认参数(碎片数量、嵌套字段限制)等统计信息。


原文链接:https://www.infoworld.com/article/3442739/review-elasticsearch-boosts-search-with-sql-optimizations.html

相关推荐

为何越来越多的编程语言使用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)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码