當前位置:編程學習大全網 - 編程語言 - Elasticsearch解決問題之道——請亮出妳的DSL

Elasticsearch解決問題之道——請亮出妳的DSL

0、引言

在業務開發中,我們往往會陷入開發的細枝末節之中,而忽略了事物的本源。

經常有同學問到:

等等等等…..

以上的看似復雜的問題,如果轉換成DSL,清楚的寫出來,梳理清楚問題的來龍去脈,問題就自然解決了壹大半。

所以,請亮出妳的dsl,不論什麽語言的檢索,轉換到es查詢都是sql查詢,在es中對應dsl語法,es再拆解比如:分詞match_phrase拆解成各term組合,最終傳給lucene處理。

亮出妳的dsl,確保編程裏的實現和妳的kibana或者head插件壹致是非常重要、很容易被忽視的工作。

如果對dsl拆解不理解,那就再 加上 profile:true或者explain:true拆解結果壹目了然。

維基百科定義:領域特定語言(英語:domain-specific language、DSL)指的是專註於某個應用程序領域的計算機語言。又譯作領域專用語言。

Elasticsearch提供基於JSON的完整查詢DSL來定義查詢。 將Query DSL視為查詢的AST(抽象語法樹),由兩種類型的子句組成:

1、葉子查詢子句

葉查詢子句查找特定字段中的特定值,例如匹配,術語或範圍查詢。 這些查詢可以單獨使用。

2、復合查詢子句

復合查詢子句可以組合其他葉子或復合查詢,用於以邏輯方式組合多個查詢(例如bool或dis_max查詢),或更改其行為(例如constant_score查詢)。

給個例子,壹看就明白。

看到這裏,可能會有人著急了:“我X,這不是官網定義嗎?再寫壹遍有意思嗎?”

引用壹句雞湯話,“再顯而易見的道理,在中國,至少有壹億人不知道”。同樣的,再顯而易見的問題,在Elasticsearch技術社區也會有N多人提問。

基礎認知不怕重復,可怕的是對基礎的專研、打磨、夯實。

Elasticsearch相關的核心操作,廣義上可做如下解讀,不壹定涵蓋全,僅拋磚引玉,說明DSL的重要性。

從大到小。

集群的管理,壹般我們會使用Kibana或者第三方工具Head插件、cerebro工具、elastic-hq工具。

基本上硬件的(磁盤、cpu、內存)使用率、集群的 健康 狀態都能壹目了然。

但基礎的DSL會更便捷,便於細粒度分析問題。

如:集群狀態查詢:

如:節點熱點線程查看:

如:集群分片分配情況查看:

索引生命周期是壹直強調的概念,主要指索引的“生、老、病、死”的全過程鏈條的管理。

創建索引我們優先使用較單純index更靈活的template模板。

創建索引類似Mysql的創建表的操作,提前設計好表結構對應ES是提前設計好M app ing非常重要。

兩個維度:

舉例:

如:索引清理緩存。

如:某原因導致分片重新分配,_recovery查看分片分配狀態。

高版本的索引生命周期管理推薦使用:ILM功能。

這個是大家再熟悉不過的了。

舉例:

刪除數據包括:指定id刪除 delete和批量刪除delete_by_query(滿足給定條件)。

更新操作。包括:指定id的update/upsert或者批量更新update_by_query。

這是ES的重頭戲。包含但不限於:

1、支持精確匹配查詢的:term、range、exists、wildcard、prefix、fuzzy等。

2、支持全文檢索的:match、match_phrase、query_string、multi_match等

1、Bucketing分桶聚合

舉例:最常用的terms就類似Mysql group by功能。2、Metric計算聚合

舉例:類比Mysql中的: MIN, MAX, SUM 操作。3、Pipeline針對聚合結果聚合

舉例:bucket_script實現類似Mysql的group by 後having的操作。

留給大家 結合 業務場景思考添加。

這裏把開頭提到的幾個問題逐壹解答壹下。

實際Mysql業務中,我們壹般是先驗證sql沒有問題,再寫業務代碼。

實際ES業務中,也壹樣,先DSL確認沒有問題,再寫業務代碼。

寫完java或者python後,打印DSL,核對是否完全壹致。

不壹致的地方基本就是結果和預期不壹致的原因所在。

第壹步:借助analyzer API分析查詢語句和待查詢document分詞結果。

這個API的重要性,再怎麽強調都不為過。

第二步:可以借助profile:true查看細節。第三步:核對match_phrase詞序的原理。

6.3版本後已經支持sql,如果不會寫,可以借助translate 如下API翻譯壹下。

不夠精確,但足夠參考用了,需要根據業務細節微調。

當然,還是 建議 ,從業務出發,自己寫DSL。

從大往小,逐步細化排解

END

公眾號 ( zhisheng )裏回復 面經、ES、Flink、 Spring、Java、Kafka、監控 等關鍵字可以查看更多關鍵字對應的文章

1、《從0到1學習Flink》—— Apache Flink 介紹

2、《從0到1學習Flink》—— Mac 上搭建 Flink 1.6.0 環境並構建運行簡單程序入門

3、《從0到1學習Flink》—— Flink 配置文件詳解

4、《從0到1學習Flink》—— Data Source 介紹

5、《從0到1學習Flink》—— 如何自定義 Data Source ?

6、《從0到1學習Flink》—— Data Sink 介紹

7、《從0到1學習Flink》—— 如何自定義 Data Sink ?

8、《從0到1學習Flink》—— Flink Data transformation(轉換)

9、《從0到1學習Flink》—— 介紹 Flink 中的 Stream Windows

10、《從0到1學習Flink》—— Flink 中的幾種 Time 詳解

11、《從0到1學習Flink》—— Flink 讀取 Kafka 數據寫入到 ElasticSearch

12、《從0到1學習Flink》—— Flink 項目如何運行?

13、《從0到1學習Flink》—— Flink 讀取 Kafka 數據寫入到 Kafka

14、《從0到1學習Flink》—— Flink JobManager 高可用性配置

15、《從0到1學習Flink》—— Flink parallelism 和 Slot 介紹

16、《從0到1學習Flink》—— Flink 讀取 Kafka 數據批量寫入到 MySQL

17、《從0到1學習Flink》—— Flink 讀取 Kafka 數據寫入到 RabbitMQ

18、《從0到1學習Flink》—— 妳上傳的 jar 包藏到哪裏去了

19、大數據“重磅炸彈”——實時計算框架 Flink

20、《Flink 源碼解析》—— 源碼編譯運行

21、為什麽說流處理即未來?

22、OPPO數據中臺之基石:基於Flink SQL構建實數據倉庫

23、流計算框架 Flink 與 Storm 的性能對比

24、Flink狀態管理和容錯機制介紹

25、原理解析 | Apache Flink 結合 Kafka 構建端到端的 Exactly-Once 處理

26、Apache Flink 是如何管理好內存的?

27、《從0到1學習Flink》——Flink 中這樣管理配置,妳知道?

28、《從0到1學習Flink》——Flink 不可以連續 Split(分流)?

29、Flink 從0到1學習—— 分享四本 Flink 的書和二十多篇 Paper 論文

30 、360深度實踐:Flink與Storm協議級對比

31、Apache Flink 1.9 重大特性提前解讀

32、如何基於Flink+TensorFlow打造實時智能異常檢測平臺?只看這壹篇就夠了

33、美團點評基於 Flink 的實時數倉建設實踐

34、Flink 靈魂兩百問,這誰頂得住?

35、壹文搞懂 Flink 的 Exactly Once 和 At Least Once

36、妳公司到底需不需要引入實時計算引擎?

  • 上一篇:在QML語言中怎麽定義signal並怎麽正確使用它
  • 下一篇:dnfpkc規則
  • copyright 2024編程學習大全網