ElasticSearch(三)常用DSL語句解析


一、前言

  執行命令行操作es的方式有幾種,比如使用postman,或者我們前面安裝的kibana客戶端,或者JavaApi等等,這篇文章重點介紹用kibana來操作我們的索引庫。

  DSL語句:領域專用語言,由葉子查詢子句復合查詢子句兩種子句組成。

  Elasticsearch提供了基於JSON的DSL來定義查詢。

二、索引部分

索引創建

#1、創建索引庫,同時設置分詞器【有夢想的肥宅】 PUT /zh_user { "settings": { "index": { "analysis.analyzer.default.type": "ik_max_word" } } }

PS:PUT請求具有冪等性,如果重復執行同樣的語句創建索引庫會報錯

索引查詢

查看所有索引

#2、查詢所有索引【有夢想的肥宅】 GET /_cat/indices?v

查看單個索引

#3、查詢單個索引【有夢想的肥宅】 GET /zh_user

索引刪除

#4、刪除索引庫【有夢想的肥宅】 DELETE /zh_user

三、文檔部分

創建文檔

#5、創建文檔【格式:POST /索引名稱/類型(7.6.1版本默認是_doc)/id POST /zh_user/_doc/1/ { "name": "有夢想的肥宅", "sex": "男", "age": 27, "address": "廣西南寧", "remark": "有趣又上進的靈魂~" }

PS:創建文檔要用POST,如果沒有指定id的話,es會自動生成,指定了就用我們指定的id

查詢文檔

主鍵查詢

#6、根據主鍵查詢文檔(數據)【有夢想的肥宅】 GET /zh_user/_doc/1

全查詢

#7、全量查詢索引下文檔(數據)【有夢想的肥宅】 GET /zh_user/_search

修改文檔

全量修改

#8、全量修改文檔【格式:PUT /索引名稱/類型(7.6.1版本默認是_doc)/id】 PUT /zh_user/_doc/1/ { "name": "有夢想的肥宅【更新】", "sex": "男", "age": 27, "address": "廣西南寧", "remark": "有趣又上進的靈魂~" }

局部修改

#9、局部修改文檔【格式:PUT /索引名稱/類型(7.6.1版本默認是_doc)/id POST /zh_user/_update/1/ { "doc":{ "name": "有夢想的肥宅【更新】", "sex": "男【更新】", "address": "廣西南寧【更新】" } }

刪除

#10、刪除索引庫內的文檔(數據)【有夢想的肥宅】 DELETE /zh_user/_doc/1

四、查詢操作部分

條件查詢

#11、條件查詢【有夢想的肥宅】 GET /zh_user/_search { "query":{ "match":{ "sex":"男" } } }

分頁查詢

#12、分頁查詢【有夢想的肥宅】 GET /zh_user/_search { "query":{ "match":{ "sex":"男" } }, "from":0, "size":2 }

排序查詢

#13、排序查詢【有夢想的肥宅】 GET /zh_user/_search { "query":{ "match_all":{} #表示查詢全部數據 }, "sort":{ "age":{ "order":"desc" } } }

多條件查詢

#14、多條件查詢【有夢想的肥宅】 GET /zh_user/_search { "query":{ "bool":{ #表示需要進行條件過濾 "must":[{ #表示必須滿足下面的條件,並且參與計算分值,常用的子句還有should,表示“或”的意思 "match":{ "address":"廣西南寧" } },{ "match":{ "sex":"男" } }] } } }

范圍查詢

#15、范圍查詢【有夢想的肥宅】
GET /zh_user/_search
{ "query": { "bool": {
#表示需要進行條件過濾 "filter": [{ #返回的文檔必須滿足filter子句的條件。但是跟Must不一樣的是,不會計算分值,並且可以使用緩存。【不算分的場景使用這個效率會提升】 "range": { "age": { "gt": 1 #表示查詢年齡大於1歲的小伙伴~ } } }] } } }

查詢分詞結果

#16、查詢分詞結果【有夢想的肥宅】 GET /zh_user/_doc/1/_termvectors?fields=address PS:這條語句的意思是,查詢索引庫zh_user下id為1的,字段為address的數據分詞的結果

  也可以直接對一段文字進行分詞結果查詢:

POST _analyze { "text": ["廣西南寧青秀區"], "analyzer": "ik_max_word" #分詞器:standard【中文單字分詞】、ik_smart【最粗粒度拆分】、ik_max_word【最細粒度的拆分】 }

完全匹配

  為了更好理解完全匹配的概念,我們先看一個例子:

PS:match:分詞后搜索。比如分詞后有N個分詞,只要匹配上其中一個就可以返回數據了。
GET /zh_user/_search { "query":{ "match":{ "name" : "夢想哈" } } }

#17、完全匹配查詢【有夢想的肥宅】
PS:match_phrase:分詞后搜索。與match不同的是,match_phase分出來的詞必須全部在搜索結果中,且位置順序是一樣的。
PS:
這里說的完全匹配不是說必須輸入“有夢想的肥宅【更新】”才能精確匹配出來,而是分詞后順序一致就可以查詢出來 GET /zh_user/_search { "query":{ "match_phrase":{ "name" : "夢想哈" } } }

 

高亮查詢

#18、高亮查詢【有夢想的肥宅】 GET /zh_user/_search { "query": { "match_phrase": { "name": "有夢想" } }, "highlight": { "fields": { "name": {} #表示對當前字段進行高亮處理 } } }

聚合/分組查詢

#19、聚合查詢【有夢想的肥宅】 GET /zh_user/_search { "aggs":{ #表示聚合操作 "age_group":{ #分組名稱,可以隨便起 "terms":{ #表示分組操作,也可以使用avg來求平均值 "field":"age" #表示對哪一個字段進行分組 } } },
   "size":0
#表示不查詢原始數據,只查詢分組結果 }
PS:ES進行聚合查詢時,對應字段的類型只能是整形等,如果是“text”等類型是無法進行聚合分組查詢的。

五、映射關系部分

  映射關系可以理解成數據庫中的表結構,那么我們來看一下怎么玩這個內容:

#20、創建索引庫,並設置映射【有夢想的肥宅】 PUT /zh_user_new #創建索引庫 PUT /zh_user_new/_mapping { "properties": { "name":{ "type": "keyword", #關鍵字類型,不做分詞操作 "index": true #表示此字段可以被用來查詢 }, "sex":{ "type": "text", #text類型,可以分詞 "index": true }, "age":{ "type": "long", #long類型,表示數值 "index": true }, "address":{ "type": "text", "index": true }, "reamrk":{ "type": "text", "index": false #表示此字段不可以被用來查詢 } } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM