elasticSearch/elasticSearch-sql初探
来源:互联网 发布:网络答题 搜题软件 编辑:程序博客网 时间:2024/05/22 16:52
刚刚接触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为自定义的SqlElasticSearchRequestBuilderSqlElasticSearchRequestBuilder 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());}}
- elasticSearch/elasticSearch-sql初探
- elasticsearch 初探
- 初探Elasticsearch
- Elasticsearch-SQL
- elasticsearch-sql
- elasticsearch+logstash+kibana 初探
- ElasticSearch初探(一)
- ElasticSearch
- Elasticsearch
- Elasticsearch
- ElasticSearch
- elasticSearch
- elasticsearch
- Elasticsearch
- ELasticsearch
- Elasticsearch
- ElasticSearch
- elasticsearch
- H264 JM8.6 注释版代码
- UVa Box 1587
- hive关系运算详解
- Hibernate5
- Spark在线广告点击预测
- elasticSearch/elasticSearch-sql初探
- Java实现堆排序
- 《高性能mysql 第一章》刷书笔记
- Android开源库SlideMenu如何实现沉浸式效果
- UIModalPresentationStyle即viewcontroller的显示方式
- Loader异步装载CursorLoader的案例
- MyEclipse----从数据库反向生成实体类之JPA方式
- win7搭建React Native开发环境
- MediaCodec 从Surface编码及android锁屏录像和后台录像实现