前言图:Elasticsearch在DB-Engine权威热度综合排名中排名第8。在大学的编程课程中,老师首先会介绍编程思想和编程语言,重点是面向过程编程和面向对象编程,然后扩展到编程语言,如C、Java等。目前,从个人认知来看,我们正处在面向数据编程的阶段,社会分工越来越细,编程思想和编程方法都发生了很大的变化。毕业参加工作后,在经历了众多业务项目系统之后,可能越来越多的人已经意识到越来越应该重视数据产品,应用系统的核心支撑越来越依赖于数据库产品,而上层-级编程语言只是一个交互界面;底层数据产品所提供的能力,在一定程度上决定了业务系统、交互形式乃至编程方式和编程语言的支撑能力。Elasticsearch是数据产品领域无可替代的全能选手,业务应用广泛。其核心能力是丰富的查询方式和出色的查询性能。下面我们从ES查询方式的形式展开,看看它提供了哪些查询方式能够适应当前的业务痛点场景。注:本文内容基于ES7.15.x版本编写,其他版本可能存在差异。图解:部分业务系统需要同时集成多种数据产品和多种编程语言1.Querystring查询Querystringquery(简称代号:QS),英文直译“querystring”是基于字符串表达式的查询语法,从现在的ES版本来看,虽然比较原始,但是也很有意义,有应用意义。图解:querystring和simplequerystring查询示例,来自ESQS官方查询语法简单直接,表达能力遵循人脑最直接的思维方式,有点类似于我们语言对话的表达方式,就是容易掌握,一点点适合初学者编程经验也会很快上手。从应用的角度来说,它非常适合一些查询表达自由度要求比较高的业务场景,而且使用这些业务系统的人不是非计算机专业人士。例如,一些物流公司内部系统或电商内部业务系统,数据关联字段数量庞大,成百上千,业务经营者需要结合任意条件进行查询。这些业务人员不是专业的计算机工程师。快速学习一些高级查询语言是不可能的,比如SQL,那么QS就很适合了。其内部简单的组合条件查询表达式,稍有数理逻辑的人基本都能学会。有些IT工程师可能会说,在系统设计中加入一些固定的查询条件就好了。事实上,并非如此。当业务系统的数据字段超过一定数量后,系统设计开发仍然采用固定的查询方式,这本身就是一种罪过。最后,IT工程师会觉得业务需求多,开发进度跟不上,业务运营商会要求业务系统设计非常死板,跟不上业务发展需求。有的工程师可能会好奇,为什么不用关系型数据库来解决问题呢?SQL也更适合这种场景下的查询。当然,这是另一个话题。需要深入RDB和ES的底层特性,这里不展开。具体可以参考笔者之前写的文章,已经有充分的论证。如下图所示,某物流公司内部查询系统,查询条件很多,但仍然不能满足查询需求。图解:某物流系统内部查询模块,比较简单。百度图片QS的查询方式虽然直白简洁,表达方式很人性化,局限性也很明显,但不足以支持ES丰富的查询能力和未来的新特性,以及未来更多的应用场景。建议工程师们还是把理解把握好,收进肚子里。也许某个业务场景很适合。也许这个特性是某个业务系统的核心技术支撑,至少我是见过的。2、QueryDSLDSL全称QueryDomainSpecificLanguage,直译为“领域特定语言”。它是ES针对ES特性专门设计的一种抽象语法树(AbstractSyntaxTrees)查询语言。它具有丰富的查询表达能力,也是目前ES使用的首选,也是任何时候使用ES的首选。ES支持多种查询。入门ES的工程师可能深有体会。以前基于传统数据库产品很难解决的查询问题,在ES中变得非常容易,不仅在性能上,在丰富的查询上也是如此。其实这也得益于ES设计的DSL。图解:DSL查询语言示例,来自官方的DSL,支持ES内部几乎所有的查询表达能力,其中全文查询(fulltextquery)和termlevelquery(词级查询)几乎是最常用的场景;还有一些高级查询功能。在进入ES之前,看到很多工程师在代码中使用正则表达式或者特别复杂的逻辑判断来代替。真的很丑,代码丑,性能也丑。DSL在带来丰富的查询表达能力的同时,也带来了一定的复杂性,这在其他一些数据产品领域,尤其是SQL领域的工程师也饱受诟病。我认为这是一种错误的认识。相反,我认为任何数据库产品都有其独特性。其独特的内部实现和应用场景决定了其能力。DSL由于其丰富的查询表达能力,需要稍加系统学习,但带来了比SQL更好的查询体验;在数据产品领域,有很多自己产品的DSL,比如数据产品Arrangodb、Cassandra等,形式上由于其产品的独特性,对其表达方式进行了改变。经验证不能完全被SQL替代。图解:Arangodb查询语言AQL,来自官方的建议,千万不要因为SQL和DSL之争而错过Elasticsearch。谁用过它,谁就知道它给你带来的便利。3、SQLSQL的全称是StructuredQueryLanguage,直译为“结构化查询语言”。毋庸置疑,工程师在开始编程时必须学习的查询语法以前主要用于传统的关系数据库。NOSQL越来越流行,NOSQL也开始逐渐融入这个特性。因为庞大的群体基础,业内有“大数据BI工程师就是SQL工程师”的说法,他们的日常工作就是写SQL。Elasticsearch从6.5.x版本开始正式集成了自己的SQL查询方式。在此之前,一般会使用NLPChina来提供插件。全称是Elasticsearch-sql,带来了一定的便利,但其实质是将SQL表达式直接转换为DSL。对于表达式查询,只是多了一次转换,没有革命性的变化。但不可否认的是,其业务应用对IT工程师的需求。曾经在一家物流公司遇到过一个业务部门的系统架构师,他将SQL复杂的表达能力发挥到了极致,解决了数据和用户权限的通用表达语言。我见过最强大最复杂的权限系统,也觉得设计的很好;从事过业务系统的工程师可能会有同样的感受。传统的业务系统需要一个权限系统来隔离用户和数据的访问权限。需要精确到数据行、数据字段等,还需要支持很多自定义的场景,比如指定某个人在某个时间点可以访问等;系统核心关键设计基于SQL。无论多么复杂、多么个性化的权限隔离需求,只需要转换成SQL表达式,只用一种方式执行,一招轻松解决;当然,Elasticsearch也是适用的。试想一下,如果不提供SQL支持,业务系统异常的权限隔离需求怎么设计?图:社区SQL插件查询示例,来自NLPChina的官方SQL比社区做的创新更多。其中一个是我特别推荐的。基于官方SQL执行查询,返回结果数据量是DSL查询的近一倍;官方SQL支持多种数据格式。查询结果,其中Json是最常用的,也是RESTAPI时代最受程序员欢迎的数据交互接口协议。这对于应用ES执行查询后需要返回大量数据结果的场景非常好,大大降低了网络流量IO,也是一个性能优化点。说明:官方SQL插件查询示例,来自Elastic官方官方SQL为了兼容DSL,也提供了DSL转换的API。如果您不熟悉DSL,可以使用此功能。插图:将SQL转换为DSL的示例。来自Elastic的官方SQL带来了很多优越的便利性,但也有一些局限性。它不完全支持标准SQL,兼容最新的SQL。许多查询特征仍然很明显。DSL的影子;官方SQL继续发展。从最早的6.5.x到现在的7.15.x,增加了很多SQL标准的支持,但是SQL并不能代替DSL。到目前为止,DSL仍然是ES领域最好的查询方式。这个一定要搞清楚。4、EQLEQL的全称是EventQueryLanguage,直译为“直接查询语言”。核心需要基于时序数据,需要指定时间字段和类别字段,比如日志、指标、全链接等场景。ES官方推出这种查询方式主要是针对安全分析场景。说明:官方EQL查询示例,来自Elastic的官方EQL,目前在应用系统中并没有大规模使用。我看到有工程师在用它,这可能是它定位在安全分析场景的原因。必须承认,它带来的一些查询特性,它的语法非常直观,表达方式也非常丰富。有编程基础的工程师很容易掌握。必须强调的是,这是为安全行业设计的查询语言,所以使用它的最多的应该是安全工程师。5.ES查询方式内部到目前为止,ES主要提供了以上四种查询方向,它们也是分别按照以上顺序演进的。没有谁能取代谁,它仍然保持平行和独立的发展和演变。ES执行所有查询方法,先转为DSL,构建自己的QueryBuilder,再构建自己的Query,最后提交给Lucene执行。6.体会和认知基于ES提供的查询方式,详细说说我个人的体会和认知。只有在ES领域,我们才能看到,如果对ES数据产品有深入的把握,我们的工作方式和编程方式都会发生很大的变化。我们不再需要基于编程语言构建复杂的原始查询业务场景,也不再需要编程语言来承载数据表达能力。在面向数据编程的时代,我们的编程方法和认知需要进化。掌握一门编程语言只是能够做应用项目的第一步。深入掌握一门编程语言,本质上意义不大。一个应用系统最终需要的是一个数据产品来承载它。编程语言只是一个交互式入口。我们可以在短时间内学会一门编程语言,并进行项目实战,但要掌握一个数据产品,确实需要长时间的积累和历练。.“ES玩的好,早点下班!”不仅仅是ES的口号,更期望通过“面向数据编程”的理念重新审视编程的本质。参考查询字符串查询字符串https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html简单查询字符串simple-query-stringhttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.htmlquery领域特定语言query-dslhttps://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.htmlSQL社区插件elasticsearch-sqlhttps://github.com/NLPchina/elasticsearch-sqlSQL官方插件xpack-sqlhttps://www.elastic.co/guide/en/elasticsearch/reference/current/xpack-sql.html官方EQLhttps://www.elastic.co/guide/en/elasticsearch/reference/current/eql.html作者介绍李萌,数据领域专家,ElasticStack顶级中国实战专家,中国首批21位Elastic官方认证工程师之一。2012年入行Elasticsearch,在ElasticStack技术栈开发、架构、运维、源码、算法等方面有着深入的实战经验。负责多个ElasticStack项目,包括大数据分析、机器学习预测、业务查询加速、日志分析、基础指标监控等。十余年技术实践经验,擅长混搭大数据、系统架构等多种技术栈。
