1. 程式人生 > >elasticSearch/elasticSearch-sql初探

elasticSearch/elasticSearch-sql初探

剛剛接觸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());
		}
	}


相關推薦

elasticSearch/elasticSearch-sql初探

剛剛接觸ES,許多問題可能不是很準確,請諒解。 一、概念的東西就不囉嗦了。就說說我遇到的問題吧 1.錯誤資訊:Exception in thread "main" NoNodeAvailableException[None of theconfigured nodes a

安裝支持elasticsearch使用sql查詢插件

image img load oba tps -s 語句 jdk class 一、ElasticSearch-SQL介紹 ElasticSearch-SQL(後續簡稱es-sql)是ElasticSearch的一個插件,提供了es 的類sql查詢的相關接口。支持絕大多數的s

玩轉 ElasticsearchSQL 功能

最近釋出的 Elasticsearch 6.3 包含了大家期待已久的 SQL 特性,今天給大家介紹一下具體的使用方法。 首先看看介面的支援情況 目前支援的 SQL 只能進行資料的查詢只讀操作,不能進行資料的修改,所以我們的資料插入還是要走之前的常規索引介面。 目前 Elastics

Elasticsearch安裝sql外掛

首先需要先安裝elasticsearch,npm,前面的部落格有介紹! 進入elasticsearch的安裝目錄,執行如下命令: ./bin/elasticsearch-plugin install https://github.com/NLPchina/elastics

elasticsearch xpack sql group by 如何對時間按年月日進行分組查詢

ES從6.3開始已經支援SQL了,當然還有很多不完善的地方,比如對於巢狀查詢,連表查詢,但是對於單表而言,提供的SQL已經基本夠用了。 這裡只講一下我在實際業務中遇到的一個問題,運營那邊想要對時間進行分組查詢,可以按年或是月或是日進行分組,為了能滿足運營那邊的要求,自己研究

Elasticsearchsql化使用

Elasticsearch-sql的安裝、使用 安裝: 方法1: 進入elasticsearch目錄下執行下面命令: ./bin/elasticsearch-plugin install https://github.com/NLPchi

ElasticStack學習(七):ElasticSearch之Mapping初探

一、Mapping的概念   1、Mapping類似於資料庫中的Schema的定義,作用如下:     1)定義索引中的欄位的名稱;     2)定義欄位的資料型別,例如字串、數字、日期、布林等;     3)對每個欄位進行倒排索引的建立及相關配置;     4)Mapping會將Json文件對映成

ELK 學習筆記之 elasticsearch elasticsearch.yml配置概述

elastic 一個 負載均衡 ble min replica 負責 行數據 nbsp elasticsearch.yml配置概述: 設置集群名字 cluster.name 定義節點名稱 node.name 節點作為master,但是不負責存儲數據,只是協調。

Elasticsearch + Elasticsearch-head搭建

Elasticsearch搭建: [[email protected] elk]# tar -xvf elasticsearch-6.2.4.tar [[email protected] elk]# cd elasticsearch-6.2.4 [[email protec

Windows 下安裝 ElasticSearch & ElasticSearch head

首先配置java環境變數,這個就不說了,ES5*以上版本需要jdk1.8 一、下載 Elasticsearch 2)解壓至本地 進入bin 目錄,執行 elasticsearch.bat 3) 瀏覽器輸入 localhost:9200/ 出現一下介面

springboot+elasticsearch (elasticsearch-rest-high-level-client)

1,準備條件      es服務:127.0.0.1 2,pom.xml <dependency> <groupId>org.elasticsearch.client</groupId&g

ElasticSearch+ElasticSearch的搜房網實戰(在windows搭建的es分散式環境)

可以參考windows環境下ElasticSearch5以上版本安裝head外掛  兩個重點的連結!!!!es的elasticsearch.yml檔案的配置(在elasticsearch.yml中新增下面的如下的配置)master配置如下http.cors.enabled:

elasticsearch/elasticsearch-rtf安裝及錯誤問題處理

本地mac安裝沒出現什麼問題,直接安裝都運行了,最近在阿里雲伺服器安裝的時候各種坑不斷的踩,平時也沒有習慣寫出來的習慣,但是每次安裝都好費時間,而且還容易忘記,就自己寫一寫,留作以後備用.僅是個人安裝遇到的問題.什麼是Elasticsearch-RTFRTF是Ready To Fly的縮寫,在航模裡面,表示無

Spark SQL 初探

早在Spark Submit 2013裡就有介紹到Spark SQL,不過更多的是介紹Catalyst查詢優化框架。經過一年的開發,在今年Spark Submit 2014上,Databricks宣佈放棄Shark 的開發,而轉投Spark SQL,理由是Shark繼承了

SQL to Elasticsearch java code

elastics 不支持 sam double group index date days database 把Elasticsearch當成Database用,因為Elasticsearch不支持SQL,就需要把SQL轉換成代碼實現。 1.按某個field group

搜索引擎ElasticSearch系列(四): ElasticSearch2.4.4 sql插件安裝

china code als 插件 技術分享 -s fun nlp 4.0 一:ElasticSearch sql插件簡介   With this plugin you can query elasticsearch using familiar SQL syntax.

如何用Elasticsearch實現類似SQL中的IN查詢實例

red ast last .cn lte style sea ges logs 我想實現類似如下sql語句的效果: select * from table1 where rw_id in (‘7a482589-e52e-0887-4dd5-5821aab77eea‘,‘c

Elasticsearch聚合初探——metric篇

方式 top .... time 時也 att 求和 還需 upper 前言 ES中的聚合被分為兩大類:Metric度量和bucket桶(原諒我英語差,找不到合適的詞語.....就用單詞來說吧!)。說的通俗點,metric很像SQL中的avg、max、min等方法,而buc

2017.8.30 elasticsearch-sql的安裝與使用

elastics 一個 es2017 畫面 方法 方便 127.0.0.1 使用 font 參考來自: http://blog.csdn.net/u012307002/article/details/52837756 https://github.com/NLPchi

ElasticSearchElasticSearch-SQL插件

學習 git 數據 tails sql https tip wiki agg ElasticSearch-SQL插件 image2017-10-27_11-10-53.png (1067×738)elastic SQL_百度搜索Druid SQL 解析器的解析過程 -