就是一個發送http請求的工具
PUT /dangdang/ 建立索引 DELETE /dangdang 刪除索引 DELETE /* 刪除所有索引 GET /_cat/indices?v 檢視索引資訊 _cat 一組命令 可以查詢es一些狀態
建立型別
1.建立/dangdang索引並建立(product)型別 PUT /dangdang { "mappings": { "product": { "properties": { "title": { "type": "text" }, "name": { "type": "text" }, "age": { "type": "integer" }, "created": { "type": "date", "format": "strict_date_optional_time||epoch_millis" } } } } } 注意: 這種方式建立型別要求索引不能存在
text:字串 會被分詞
keyword:字串 不分詞
少年的魯迅 如果是text 型別 會被處理爲 少年 魯迅
如果是 keyword型別 少年的魯迅 整體是一個詞語
integer:整數
double:小數
date:日期
boolean:可用值true+false
檢視型別
GET /dangdang/_mapping/product # 語法:GET /索引名/_mapping/型別名 GET /dangdang/_mapping
新增文件
PUT /ems/emp/1 #/索引/型別/id { "name":"趙小六", "age":23, "bir":"2012-12-12", "content":"這是一個好一點的員工" }
PUT和POST都可以
POST 新增。如果不指定id,會自動生成id。 指定id就會修改這個數據,並新增版本號
PUT 可以新增可以修改。PUT必須指定id;由於PUT需要指定id,我們一般都用來做修改操作,不指定id會報錯。
{ "_index": "ems", //索引名稱 "_type": "emp", // 型別名稱 "_id": "1", // id 如果新增會採用你新增的 如果不寫會預設生成(POST會生成 PUT必須給id) "_version": 1, //版本號 "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 0, "_primary_term": 1 }
查詢文件
GET /ems/emp/1 返回結果: { "_index": "ems", "_type": "emp", "_id": "1", "_version": 1, "found": true, "_source": { // 查詢結果 "name": "趙小六", "age": 23, "bir": "2012-12-12", "content": "這是一個好一點的員工" } }
刪除文件
DELETE /ems/emp/1 { "_index": "ems", "_type": "emp", "_id": "1", "_version": 2, "result": "deleted", #刪除成功 "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 1, "_primary_term": 1 }
更新文件
1.第一種方式 更新原有的數據 POST /ems/emp/1/_update { "doc": { "name": "趙六", "age":45 } } 2.第二種方式 新增新的數據 增加一個新的欄位 POST /ems/emp/1/_update { "doc": { "name": "趙六", "age":45, "dpet":"你好部門" } } 3.第三種方式 在原來數據基礎上更新 在修改的時候通過指令碼做運算 POST /ems/emp/1/_update { "script": "ctx._source.age += 5" } ctx._source 獲取 _source 中的數據
批次操作
1. 批次索引兩個文件 PUT /ems/emp/_bulk {"index":{"_id":"1"}} {"name": "John Doe","age":23,"bir":"2012-12-12"} {"index":{"_id":"2"}} {"name": "Jane Doe","age":23,"bir":"2012-12-12"} 2. 更新文件同時刪除文件 POST /dangdang/emp/_bulk {"update":{"_id":"1"}} {"doc":{"name":"lisi"}} {"delete":{"_id":2}} {"index":{}} {"name":"xxx","age":23} 注意:批次時不會因爲一個失敗而全部失敗,而是繼續執行後續操作,批次在返回時按照執行的狀態開始返回
https://www.elastic.co/guide/en/elasticsearch/reference/6.4/search.html
1.刪除索引 DELETE /ems 2.建立索引並指定型別 PUT /ems { "mappings":{ "emp":{ "properties":{ "name":{ "type":"text" }, "age":{ "type":"integer" }, "bir":{ "type":"date" }, "content":{ "type":"text" }, "address":{ "type":"keyword" } } } } } 3.插入測試數據 PUT /ems/emp/_bulk {"index":{}} {"name":"小黑","age":23,"bir":"2012-12-12","content":"爲開發團隊選擇一款優秀的MVC框架是件難事兒,在衆多可行的方案中決擇需要很高的經驗和水平","address":"北京"} {"index":{}} {"name":"王小黑","age":24,"bir":"2012-12-12","content":"Spring 框架是一個分層架構,由 7 個定義良好的模組組成。Spring 模組構建在覈心容器之上,核心容器定義了建立、設定和管理 bean 的方式","address":"上海"} {"index":{}} {"name":"張小五","age":8,"bir":"2012-12-12","content":"Spring Cloud 作爲Java 語言的微服務架構,它依賴於Spring Boot,有快速開發、持續交付和容易部署等特點。Spring Cloud 的元件非常多,涉及微服務的方方面面,井在開源社羣Spring 和Netflix 、Pivotal 兩大公司的推動下越來越完善","address":"無錫"} {"index":{}} {"name":"win7","age":9,"bir":"2012-12-12","content":"Spring的目標是致力於全方位的簡化Java開發。 這勢必引出更多的解釋, Spring是如何簡化Java開發的?","address":"南京"} {"index":{}} {"name":"梅超風","age":43,"bir":"2012-12-12","content":"Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API","address":"杭州"} {"index":{}} {"name":"張無忌","age":59,"bir":"2012-12-12","content":"ElasticSearch是一個基於Lucene的搜尋伺服器。它提供了一個分佈式多使用者能力的全文搜尋引擎,基於RESTful web介面","address":"北京"}
ES官方提供了兩中檢索方式:一種是通過 URL 參數進行搜尋,另一種是通過 DSL(Domain Specified Language) 進行搜尋。官方更推薦使用第二種方式第二種方式是基於傳遞JSON作爲請求體(request body)格式與ES進行互動,這種方式更強大,更簡潔。
ES支援兩種基本方式檢索
一個是通過使用 REST requestURI發送搜尋參數(uri+檢索參數)
另一個是通過使用REST request body來發送它們(uri+請求體)【推薦使用】
GET /ems/emp/_search?q=*&sort=age:asc
_search 搜尋的API q=* 匹配所有文件 sort 以結果中的指定欄位排序
在 es 中,DSL 是通過 json 的方式表達請求主體
演示 查詢所有
響應結果解釋:
took Elasticsearch 執行搜尋的時間(毫秒) time_out 告訴我們搜尋是否超時 _shards 告訴我們多少個分片被搜尋了,以及統計了成功/失敗的搜尋分片 hits 搜尋結果 hits.total 搜尋結果 hits.hits 實際的搜尋結果陣列(預設爲前10的文件) sort 結果的排序key (鍵) (沒有則按 score 排序) score 和 max_score 相關性得分和最高得分(全文檢索用)
GET /ems/emp/_search { "query": {"match_all": {}}, "sort": [ { "age": { "order": "desc" } } ] }
query 定義查詢型別
sort 排序
size from 分頁
查詢所有(match_all)
match_all關鍵字: 返回索引中的全部文件
GET /ems/emp/_search { "query": { "match_all": {} } }
查詢結果中返回指定條數(size)
size 關鍵字: 指定查詢結果中返回指定條數。 預設返回值10條
GET /ems/emp/_search { "query": { "match_all": {} }, "size": 1 }
分頁查詢(from)
from 關鍵字: 用來指定起始返回位置,和size關鍵字連用可實現分頁效果
GET /ems/emp/_search { "query": {"match_all": {}}, "sort": [ { "age": { "order": "desc" } } ], "size": 2, "from": 1 }
查詢結果中返回指定欄位(_source)
_source 關鍵字: 是一個數組,在陣列中用來指定展示那些欄位
GET /ems/emp/_search { "query": { "match_all": {} }, "_source": ["account_number", "balance"] }
關鍵詞查詢(term)
term 關鍵字: 用來使用關鍵詞查詢
GET /ems/emp/_search { "query": { "term": { "address": { "value": "北京" } } } } es 預設使用分詞器是單個分詞 一個字兒是一個詞 term 查詢 搜尋關鍵詞不分詞 開發 當做一個詞兒
NOTE1: 通過使用term查詢得知ES中預設使用分詞器爲標準分詞器(StandardAnalyzer),標準分詞器對於英文單詞分詞,對於中文 單字分詞。
NOTE2: 通過使用term查詢得知,在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 這些型別不分詞,只有text型別分詞。
match 全文檢索
搜尋關鍵詞也會被分詞處理
GET /ems/emp/_search { "query": { "match": { "content": "開發公司有哪些" } } }
範圍查詢(range)
range 關鍵字: 用來指定查詢指定範圍內的文件
GET /ems/emp/_search { "query": { "range": { "age": { "gte": 8, "lte": 30 } } } }
字首查詢(prefix)
prefix 關鍵字: 用來檢索含有指定字首的關鍵詞的相關文件
GET /ems/emp/_search { "query": { "prefix": { "content": { "value": "redis" } } } }
萬用字元查詢(wildcard)
wildcard 關鍵字: 萬用字元查詢 ? 用來匹配一個任意字元 * 用來匹配多個任意字元
GET /ems/emp/_search { "query": { "wildcard": { "content": { "value": "re*" } } } }
多id查詢(ids)
ids 關鍵字 : 值爲陣列型別,用來根據一組id獲取多個對應的文件
GET /ems/emp/_search { "query": { "ids": { "values": ["lg5HwWkBxH7z6xax7W3_","lQ5HwWkBxH7z6xax7W3_"] } } }
模糊查詢(fuzzy)
fuzzy 關鍵字: 用來模糊查詢含有指定關鍵字的文件
GET /ems/emp/_search { "query": { "fuzzy": { "content":"spring" } } }
布爾查詢(bool)
bool 關鍵字: 用來組合多個條件實現複雜查詢
must: 相當於&& 同時成立 &
should: 相當於|| 成立一個就行 |
must_not: 相當於! 不能滿足任何一個
GET /ems/emp/_search { "query": { "bool": { "must": [ { "range": { "age": { "gte": 0, "lte": 30 } } } ], "must_not": [ {"wildcard": { "content": { "value": "redi?" } }} ] } }, "sort": [ { "age": { "order": "desc" } } ] }
高亮查詢(highlight)
highlight 關鍵字: 可以讓符合條件的文件中的關鍵詞高亮
GET /ems/emp/_search { "query":{ "match": { "content":"框架" } }, "highlight": { "fields": { "*":{} } } }
自定義高亮html標籤: 可以在highlight中使用
pre_tags
和post_tags
GET /ems/emp/_search { "query":{ "match": { "content":"框架" } }, "highlight": { "pre_tags": ["<span style='color:red'>"], "post_tags": ["</span>"], "fields": { "*":{} } } }
多欄位高亮 使用
require_field_match
開啓多個欄位高亮
GET /ems/emp/_search { "query":{ "term":{ "content":"框架" } }, "highlight": { "pre_tags": ["<span style='color:red'>"], "post_tags": ["</span>"], "require_field_match":false, "fields": { "*":{} } } }
多欄位查詢(multi_match)
GET /ems/emp/_search { "query": { "multi_match": { "query": "中國", "fields": ["name","content"] #這裏寫要檢索的指定欄位 } } }
過濾查詢
其實準確來說,ES中的查詢操作分爲2種: 查詢(query)和過濾(filter)。
查詢就是之前講的query查詢,它 (查詢)預設會計算每個返迴文件的得分,然後根據得分排序。
過濾(filter)只會篩選出符合的文件,並不計算得分,且它可以快取文件 。所以,單從效能考慮,過濾比查詢更快。
換句話說,過濾適合在大範圍篩選數據,而查詢則適合精確匹配數據。一般應用時, 應先使用過濾操作過濾數據, 然後使用查詢匹配數據。
在執行filter和query時,先執行filter再執行query
ElasticSearch會自動快取經常使用的過濾器,以加快效能
先使用 過濾操作 可以篩選掉一部分不需要參與計算的數據
再執行 query 操作進行查詢
常用過濾器型別:term/terms/range/exists/ids
類似於mysql的分組函數和函數(最大值 最小值 平均值)
語法結構
"aggregations" : { "<aggregation_name>" : { "<aggregation_type>" : { <aggregation_body> } [,"meta" : { [<meta_data_body>] } ]? [,"aggregations" : { [<sub_aggregation>]+ } ]? } [,"<aggregation_name_2>" : { ... } ]* }
計算年齡的平均值
GET /ems/emp/_search { "query": { "match_all": {} }, "aggs": { "ageAvg": { "avg": { "field": "age" } } }, "size": 0 }
按照年齡統計個數
terms 分組
GET /ems/emp/_search { "query": { "match_all": {} }, "aggs": { "ageAvg": { "avg": { "field": "age" } }, "ageCount":{ "terms": { "field": "age", "size": 10 } } }, "size": 0 }
按照地區分組,再分組的基礎上計算年齡最大值
GET ems/emp/_search { "query": { "match_all": {} }, "aggs": { "age_count": { "terms": { "field": "address", "size": 10 }, "aggs": { "age_max2": { "max": { "field": "age" } } } } }, "size": 0 }