elasticSearch/elasticSearch-sql初探

【Elasticsearch】SQL操作相关 本文主要介绍了SQL在ES上的应用,语法上基本没啥变化 阅读详情

刚刚接触ES,许多问题可能不是很准确,请谅解。

一、概念的东西就不啰嗦了。就说说我遇到的问题吧

1.错误信息:Exception in thread "main" NoNodeAvailableException[None of theconfigured nodes are available:

解决方法:增加settings设置(红色标记)。

   Settingssettings= Settings.settingsBuilder()

              .put("cluster.name","elasticSearchDemo").build();

Client client = TransportClient.builder().addPlugin(DeleteByQueryPlugin.class).settings(settings).build().addTransportAddresses(address1,address2);

2.问题2->Term查询不到数据:创建索引的时候没有说明不使用分词器(默认使用分词器),当用Term查询时,原来数据中的大写转换成小写,可以在测试分词器中测试一下。如果仍然用大写字母查询,导致查询不到数据。如{"term":{"gender":"F"}},必须写成{"term":{"gender":"f"}}

3问题3 注意各种默认值,比如ES-sql中默认limit为200,term中size默认为10.例子如下:

   SearchResponseresponse= client.prepareSearch(TEST_INDEX)

            .setSearchType(SearchType.QUERY_THEN_FETCH)

            .setQuery(queryBuilder)

   .addAggregation(AggregationBuilders.terms("ageAgg").field("age").size(100)

            .subAggregation(AggregationBuilders.stats("ageStat").field("age")))

      .execute().actionGet();

其中按照age分组统计,其中size默认为10(红色部分).不确定可以写size(0),代码自动写为maxInt。

3.问题.(脑裂)

今天集群中的健康值为yellow,查看日志报错为网络异常。错误的时间已经过去10个小时,现在网络也没有异常。刚开始的时候一直怀疑网络故障,问题一直找不到突破口,分别访问没有在集群的节点,也是没有问题的。网上搜索说是由于ping.timeout默认为3秒,如果超时就会出现多个集群的现象。联想到本系统中的网络异常,发现为两个集群。可查看每个节点的集群状态的primary属性。

修改方式:

discovery.zen.ping.timeout: 60s

discovery.zen.minimum_master_nodes:3

4. elasticSearch-sql查询语句

         4.1groupby语句其中group by之后的字段顺序重要。Limit属性为默认group by之后的第一个字段,如果没有limit默认为elasticSearch-sql自定义的200。源码在AggregationQueryAction中的explain()方法(((TermsBuilder) lastAgg).size(select.getRowCount());[大概在60L,version:2.3])

Group by 之后的字段默认为全部查询源码在源码在AggregationQueryAction中的explain()方法(((TermsBuilder) subAgg).size(0);[大概在94L,version:2.3])4. elasticSearch-sql查询语句

         4.1groupby语句其中group by之后的字段顺序重要。Limit属性为默认group by之后的第一个字段,如果没有limit默认为elasticSearch-sql自定义的200。源码在AggregationQueryAction中的explain()方法(((TermsBuilder) lastAgg).size(select.getRowCount());[大概在60L,version:2.3])

Group by 之后的字段默认为全部查询源码在源码在AggregationQueryAction中的explain()方法(((TermsBuilder) subAgg).size(0);[大概在94L,version:2.3])

5.ES-sql中的like(%)查询(包括其他特殊字符)

es中的默认百分号(%)查询,如果查询结果 的文本中有百分号,ES默认like中是没有办法查询的。原因就是源码中会替换所有的百分号。代码在org.nlpcn.es4sql.query.maker.Maker类中[大概在143L,version:2.3])源码如下:

case LIKE:
case NLIKE:
String queryStr = ((String) value);
queryStr = queryStr.replace('%', '*').replace('_', '?');
queryStr = queryStr.replace("&PERCENT","%").replace("&UNDERSCORE","_");
break;

其他的特殊字符可采用QueryParser(lucene包中的方法)的静态方法escape(String s)其实现原理是转义,转义字符为\\

注意:查询字段是不采用分词的,否则可能会过滤掉特殊字符,导致查询不到。

6.ES-sql查询字段中采用不分词,且其中有\(斜杠),采用es-sql查询时查询不到。

原因是com.alibaba.druid.sql.parser.Lexer类过滤了\(斜杠)。具体实现Lexer类中的scanAlias()方法。大概在641L。(druid版本 1.0.15)。

解决方法:1.采用JSON。2.使用like查询(?替换\)

二elasticSearch-sql 查询源码分析:

public static void test3() throws Exception {
		String sql = "select * from elasticsearch-sql_test_index";
		//其中采用的是阿里的druid框架,
		//其中ElasticLexer和ElasticSqlExprParser都是对druid中的MySql的进行了扩展
		SQLExprParser parser = new ElasticSqlExprParser(sql);
		SQLExpr expr = parser.expr();
		if (parser.getLexer().token() != Token.EOF) {
			throw new ParserException("illegal sql expr : " + sql);
		}
		SQLQueryExpr queryExpr=(SQLQueryExpr) expr;
		//通过抽象语法树,封装成自定义的Select,包含了select、from、where group、limit等
		Select select = new SqlParser().parseSelect(queryExpr);
		
		 AggregationQueryAction action;
		 DefaultQueryAction queryAction = null;
		if (select.isAgg) {
			//包含计算的的排序分组的
			//request.setSearchType(SearchType.DEFAULT);
            action= new AggregationQueryAction(client, select);
        } else {
        	//封装成自己的Select对象
        	 queryAction = new DefaultQueryAction(client, select);
        }
		// 把属性封装在SearchRequestBuilder(client.prepareSearch()获取的即ES中获取的方法)对象中
		// 然后装饰了一下SearchRequestBuilder为自定义的SqlElasticSearchRequestBuilder
		SqlElasticSearchRequestBuilder requestBuilder = queryAction.explain();
		//之后就是对ES的操作
		SearchResponse response=(SearchResponse) requestBuilder.get();
		SearchHit[] hists = response.getHits().getHits();
		System.out.println(hists.length);
		for(SearchHit hit:hists){
			System.out.println(hit.getSourceAsString());
		}
	}


ES聚合,SQL查询 【代码】ES聚合,SQL查询。 阅读详情

相关推荐

elasticsearch(ES)简介及安装-----笔记

ES是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。ES结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域。elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。kibana负责数据可视化,elasticsearch负责存储、计算、搜索数据,logstash\Beats负责数据抓取。elasticsearch底层实现是Lucene计术。

weixin_44846205的博客 2385

ES中SQL查询详解

本文主要介绍了Elasticsearch SQL的使用。如果你对DSL查询语句不熟悉,那么采用SQL查询索引数据将是一个非常简单,0门槛入门的好方法。 1、注意ES在6.3版本之后才原生支持SQL查询。 2、可以通过translate API将sql语句转为DSL语句。 3、ES的SQL查询提供对自查询的简单支持。 4、通过SHOW FUNCTIONS可以查看ES的SQL查询支持的函数。 5、ES的SQL查询可以通过游标cursor实现分页查询。

弹指天下 2万+

7.SQL语法操作Elasticsearch之Elasticsearch-SQL插件安装(2019-05-17)

Elasticsearch 的查询语言(DSL)语法很复杂,查询的功能(filter/query/match/agg/geo)各种各样,不管是通过 restful API 还是通过 java 的 API 进行操作,都非常不方便。而 Elasticsearch-SQL 插件可以使用传统 SQL 语法查询 Elasticsearch,使用起来非常不错。 Elasticsearch-SQL 项目地址:...

eighthroute的专栏 7524

Elasticsearch SQL 详解

一文了解 elasticsearch SQL 的用法!

dgl199203118的博客 5945

elasticsql:Elasticsearch 之上的数据库

ElasticSQL -- Database on top of Elasticsearch IT建设搞了不少年了,积累了大量的数据。要分析这些数据,一般的关系型数据库处理起来很困难。 Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,RESTful风格接口,多数据源,自动搜索负载等。由于他的分布特性,很适合用来做大量数据的保存和搜索,可以用Elasticsearch处理数十亿的数据。更具体的好处就不在这里多说了,看Elasticsearch官网介绍: 或者: 但是Elasticsearch使用和维护与传统的数据库有较大的差异,其RESTful形式的接口提供了很好的编程体验,对于日常数据维护比较难用。Elasticsearch的查询接口使用的是比较独特的DSL(领域专用语言),与关系型数据库SQL差异很大。 ElasticS

在VS2019里把JSBSim飞行模型集成到你的C++项目里(附完整配置流程和常见错误解决)

本文详细介绍了如何在Visual Studio 2019中将JSBSim飞行模型集成到C++项目中,包括环境准备、源码编译、项目配置和常见错误解决方案。通过实战技巧和优化建议,帮助开发者高效实现高精度飞行仿真功能,提升开发效率。

weixin_42620202的博客 413

Elasticsearch: ES使用sql语句进行查询

//format 定义返回的数据类型 适合php的推荐使用json ,除此之外还可以选择 txt,csv,yaml,cbor,smile等使用sql语句查询有一个弊端 就是开始定义某列数据的类型 后期存储时 存入了错误的数据类型 存储时成功的 但是使用sql语句查询会报错,所有最有效的ES查询方法还是使用原生的 当我们不确定有哪些SQL函数可以直接使用时 ,可以在 /_xpack/sql?format=json 接口使用query='show functions',会列举出支持的SQL函数; /*..

Daisy的博客 1万+

手把手解决AutoDock安装那些坑:从autogrid报错到.map文件生成(Win10/11环境)

本文详细解析了在Win10/11环境下安装AutoDock时遇到的常见问题,特别是autogrid报错和.map文件生成失败的情况。通过实战验证的解决方案,包括环境变量设置、Python版本管理、文件权限调整等,帮助用户顺利完成安装并提升分子对接研究效率。

weixin_42548888的博客 198

使用SQL查询ES:SpringBoot+Jdbc+Mybatis+Elasticsearch整合方案

1. 前言 ES作为一个搜索工具,寄托于Lucene之上,提供了方便的数据存储和搜索服务,一般的用它来作为网页数据索引以及存储用户画像(即用户标签)数据,可以提供复具有复杂的查询条件的服务。例如在网页索引中,通过倒排的方式索引的方式,对文档进行分词存储,可以很快的定位关键字所在的文档,从而达到毫秒级的搜索效率;而在用户画像存储中,ES既可以作为标签宽表,提供类似HIVE宽表的特性,又可以达到传统关系型数据库或者HBase的实时查询的要求,所以在一般的用户画像存储中也是不二之选。 ES是一个搜索工具,它提供的

哈哈哈哈哈哈哈 7869

AI上推荐 之 逻辑回归模型与GBDT+LR(特征工程模型化的开端)

1. 前言 随着信息技术和互联网的发展, 我们已经步入了一个信息过载的时代,这个时代,无论是信息消费者还是信息生产者都遇到了很大的挑战: 信息消费者:如何从大量的信息中找到自己感兴趣的信息? 信息生产者:如何让自己生产的信息脱颖而出, 受到广大用户的关注? 为了解决这个矛盾, 推荐系统应时而生, 并飞速前进,在用户和信息之间架起了一道桥梁,一方面帮助用户发现对自己有价值的信息, 一方面让信息能够展现在对它感兴趣的用户前面。 推荐系统近几年有了深度学习的助推发展之势迅猛, 从前深度学习的传统推荐模型(协

Miracle8070 8251

[低代码 + AI] 明道云与 Dify 的三种融合实践方式详解

融合方式技术路径优点局限或注意事项UI 嵌入iframe 表单嵌入快速集成、用户体验一致无法自定义交互逻辑明道云调用 DifyAPI 请求节点工作流自动化、逻辑灵活有 timeout 限制、需优化 promptDify 调用明道云插件或 API 调用节点可查询实际业务数据、增强 AI 智能需理解明道云 API 结构、权限设置复杂明道云与 Dify 的结合为低代码平台注入了智能动力。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1187

elasticsearch SQL:在Elasticsearch中启用和使用SQL功能

。Elasticsearch SQL是Elasticsearch的扩展功能,允许用户使用SQL语法查询Elasticsearch数据。通过SQL接口,开发者可以利用熟悉的SQL语言,编写更直观、更易懂的查询,并且避免对大量复杂的原生REST请求的编写。

码到三十五 1万+

18、AI在基础设施管理与运维中的应用及未来趋势

本文探讨了人工智能(AI)在基础设施管理和运维中的广泛应用,包括性能优化、成本节约、网络安全等多个场景。文章详细介绍了AI在不同领域的应用工具、实际案例以及面临的挑战,并展望了未来AI在基础设施管理中的发展趋势。此外,还分析了AI与Site Reliability Engineering(SRE)框架的结合优势,展示了AI如何提升运维效率和系统可靠性。

n7o8p的博客 147

Elasticsearch搜索引擎

Elasticsearch搜索引擎

m0_73922877的博客 1360

【电源专题】Type-C母座外壳直接接主板GND还是接RC呢?别再纠结了!

Type-C屏蔽壳接地这件事,没有唯一标准答案。符合规范、贴合产品、能过认证,就是最优解。希望这篇文章能帮你理清思路。

一点硬件 597

嵌入式开发工程师笔试面试指南-Linux驱动

linux驱动

weixin_43491077的博客 473

初探elasticsearch SQL

(收费的,所以这段是从网上抄的,这里建议,可以用SQL Translate Api把sql转换成DSL《这个方法只是弯道超车,不用刻意去了解es的dsl语句和各种复杂的语句,也可以不用花钱就用上es sql。elasticsearch在6.3版本中发布了一个es开发者万众期待的功能:elasticsearchsql,该功能可以让对于esdsl不熟悉的开发者,可以更加方便的去使用es,今天主要带大家一起看看这个功能~转换过的dsl,存为字符串,利用如下api,进行搜索。...

web15536243458的博客 745

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SQL4ES - Elasticsearch 的 SQL 接口指南

SQL4ES - Elasticsearch 的 SQL 接口指南 项目介绍 SQL4ES 是一个用于 Elasticsearch 的开源项目,它提供了一个简单的桥梁,允许开发者通过 SQL 查询语言来操作 Elasticsearch 数据库。这个工具极大地简化了那些习惯于 SQL 语法的开发者在 Elasticsearch 上执行数据检索、分析任务的过程,无需深入了解 Elasticsearc...

gitblog_01130的博客 464

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java查询es用sql_Elasticsearch-sql 用SQL查询Elasticsearch

Elasticsearch的查询语言(DSL)真是不好写,偏偏查询的功能千奇百怪,filter/query/match/agg/geo各种各样,不管你是通过封装JSON还是通过python/java的api进行封装,都非常不方便。最近发现了一个插件,Elasticsearch-SQL可以用sql查询Elasticsearch,感觉这个轮子造的真是好。Elasticsearch-sql的项目地址:h...

weixin_28680865的博客 3025

ElasticSearch SQL转DSL

前文 Elasticsearch在较高版本中内置SQL查询的功能,猜想本质上应该是将SQL语句转化为原生的DSL语句,再使用原生进行查询,可以让不熟悉ES的用户能通过SQL语句快速查询结果,降低使用门槛减少学习成本。另外,ES也提供Java客户端以JDBC的方式连接查询,但该方式是收费的。所以,如果用户不想购买服务建议使用官方提供的免费的restful的方式去查询,例如Java REST Client。当不熟悉ES原生的DSL语句的时候,可以先使用SQL编写查询语句,然后再使用ES自带的请求将SQL语句翻

hudeyong926的专栏 4864

【Elasticsearch系列廿一】ES7 SQL 新特性

Elasticsearch 7.x 版本在 SQL 支持方面进行了显著增强,使得用户能够更加方便地使用 SQL 语句来查询和操作 Elasticsearch 中的数据。更丰富的 SQL 支持:Elasticsearch 7.x 版本扩展了对标准 SQL 查询语句的支持,包括对 JOIN 操作的支持(尽管有限制,仅支持特定类型的 JOIN)。此外,可能还增强了对窗口函数(Window Functions)或分组后的分析函数(Analytic Functions)的支持。性能优化。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 2万+

【elasticsearch】es-sql中的一些查詢 sql 函数

ES-SQL 中可以写sql 进行数据查询 ,但是个别的查询sql 还是有一定的区别,以下记录一些实际用到的一些函数 1、模糊查询 非分词字段 类型为keyword 的字段 使用 like, 和mysql 数据库中的like 使用一样 例如 mobile like ’%keyword%‘ 分词字段 类型为text 的字段 使用 matchPhrase,对应es 中的 match_phrase 例如 name =matchPhrase(‘keyword’) 2、多值查询

qq_31286957的博客 3192

SQL4ES:让Elasticsearch支持SQL查询的开源项目

SQL4ES:让Elasticsearch支持SQL查询的开源项目 sql4es 是一个开源项目,其主要目标是提供一个 JDBC 驱动程序,使得 Elasticsearch 能够支持 SQL 查询。该项目主要使用 Java 编程语言开发。 核心功能 sql4es 的核心功能是允许用户通过 SQL 语句来查询 Elasticsearch 中的数据。它实现了 JDBC 接口的大部分功能,包括 Conn...

gitblog_00536的博客 485
上一篇: maven打包
下一篇: ES _type 的相关整理
wangyang_software
博客等级 码龄17年 24粉丝 21原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值