Elasticsearch使用系列-ES增刪查改基本操作+ik分詞
Elasticsearch使用系列-基本查詢和聚合查詢+sql插件
Elasticsearch使用系列-.NET6對接Elasticsearch
Elasticsearch使用系列-Docker搭建Elasticsearch集群
一、基本查詢
1.And查詢must
GET user2/_search { "query": { "bool":{ "must": [ { "match": { "name": "張三" } }, { "match": { "hobby": "釣魚" } } ] } }, "_source": ["name","age","hobby"], "sort": [ { "age": {"order": "desc"}}, { "name2": {"order": "asc"}} ], "from": 0, "size": 20 }
- bool :And查詢屬於bool查詢,must里面帶And的查詢條件。
- _source:要查詢的字段
- sort:對查詢結果排序
- from:分頁查詢,跳過多少條
- size:分頁查詢,一頁查多少條
2.or查詢should
GET user2/_search { "query": { "bool":{ "should": [ { "match": { "name": "張三" } }, { "match": { "hobby": "釣魚" } } ] } } }
- bool:or查詢屬於bool查詢
- should:里面放or的查詢條件
3.排除查詢 must_not
#查詢名字不等於張三 GET user2/_search { "query": { "bool":{ "must_not": [ { "match": { "name": "張三" } } ] } } }
4.過濾查詢filter
#查詢名字等於張三,年齡大於等於10小於等於20 GET user2/_search { "query": { "bool":{ "must": [ { "match": { "name": "張三" } } ], "filter": [ {"range": { "age": { "gte": 10, "lte": 20 } }} ] } } }
- filter:過濾條件,先過濾數據再查詢結果
- range:范圍查詢,和term,match是同類的查詢。
- gte:大於等於
- gt:大於
- lte:小於等於
- lt:小於
5.同字段多值查詢
GET user2/_search { "query": { "terms": { "name2": ["張三","李四"] } } }
#text類型的多值查詢,空格隔開 GET user2/_search { "query": { "match": { "name": "張三 李四" } } }
6.高亮查詢highlight
高亮查詢,就是平時搜索東西時,搜索結果會把你的關鍵詞匹配到的顯示顏色,像下圖一樣。
高亮展示的數據,本身就是文檔中的一個field,單獨將field以highlight的形式返回給你。
ES提供了一個highlight屬性,和query同級別的。
- pre_tag:指定前綴標簽,如
<font color="red">
- post_tags:指定后綴標簽,如
</font>
- fields:指定那個字段為高亮字段
查出來后,顯示hobby字段的地方,就直接用高亮的hobby展示就行了。
二、聚合查詢
bucket:分組后統計,類似於Mysql中的group by
metric:對分組統計的結果,計算最大值,最小值,平均值等,類似於Mysql中的max(),min(),avg()函數的值。
1.准備數據
創建索引
PUT employee { "mappings": { "properties": { "id": { "type": "integer" }, "name": { "type": "keyword" }, "job": { "type": "keyword" }, "age": { "type": "integer" }, "gender": { "type": "keyword" } } } }
批量插入數據
PUT employee/_bulk {"index": {"_id": 1}} {"id": 1, "name": "Bob", "job": "java", "age": 21, "sal": 8000, "gender": "male"} {"index": {"_id": 2}} {"id": 2, "name": "Rod", "job": "html", "age": 31, "sal": 18000, "gender": "female"} {"index": {"_id": 3}} {"id": 3, "name": "Gaving", "job": "java", "age": 24, "sal": 12000, "gender": "male"} {"index": {"_id": 4}} {"id": 4, "name": "King", "job": "dba", "age": 26, "sal": 15000, "gender": "female"} {"index": {"_id": 5}} {"id": 5, "name": "Jonhson", "job": "dba", "age": 29, "sal": 16000, "gender": "male"} {"index": {"_id": 6}} {"id": 6, "name": "Douge", "job": "java", "age": 41, "sal": 20000, "gender": "female"} {"index": {"_id": 7}} {"id": 7, "name": "cutting", "job": "dba", "age": 27, "sal": 7000, "gender": "male"} {"index": {"_id": 8}} {"id": 8, "name": "Bona", "job": "html", "age": 22, "sal": 14000, "gender": "female"} {"index": {"_id": 9}} {"id": 9, "name": "Shyon", "job": "dba", "age": 20, "sal": 19000, "gender": "female"} {"index": {"_id": 10}} {"id": 10, "name": "James", "job": "html", "age": 18, "sal": 22000, "gender": "male"} {"index": {"_id": 11}} {"id": 11, "name": "Golsling", "job": "java", "age": 32, "sal": 23000, "gender": "female"} {"index": {"_id": 12}} {"id": 12, "name": "Lily", "job": "java", "age": 24, "sal": 2000, "gender": "male"} {"index": {"_id": 13}} {"id": 13, "name": "Jack", "job": "html", "age": 23, "sal": 3000, "gender": "female"} {"index": {"_id": 14}} {"id": 14, "name": "Rose", "job": "java", "age": 36, "sal": 6000, "gender": "female"} {"index": {"_id": 15}} {"id": 15, "name": "Will", "job": "dba", "age": 38, "sal": 4500, "gender": "male"} {"index": {"_id": 16}} {"id": 16, "name": "smith", "job": "java", "age": 32, "sal": 23000, "gender": "male"}
2.分組統計
查詢員工各種語言數量,相當於group by
#查詢員工各種語言數量 GET employee/_search { "size": 0, "aggs": { "languge_count": { "terms": { "field": "job" } } } }
- size:0表示只要統計后的結果,原始數據不展現,如果是大於0,則會返回多少條原始數據
- aggs:固定語法
- languge_count:自定義的分組名稱,可以隨便寫
- terms:按什么字段進行分組
- field:具體的字段名稱
3.平均值,最大值,最小值,求和統計
GET employee/_search { "size": 0, "aggs": { "language_count": { "terms": { "field": "job" }, "aggs":{ "age_avg":{ "avg":{ "field": "age" } } } } } }
- aggs:固定寫法
- age_avg:自定義統計名稱,隨便寫
- avg:平均值,其他有 max:最大值,min:最小值,sum:求和
- fileld:要計算的字段
4.分段統計
#按年齡區間分段統計 GET employee/_search { "size": 0, "aggs": { "language_count": { "histogram": { "field": "age", "interval": 10 }, "aggs":{ "age_avg":{ "sum":{ "field": "age" } } } } } }
- histogram:分段統計
- interval:分段間隔
5.日期分段統計
#按月份統計生日人數 GET employee/_search { "size": 0, "aggs": { "language_count": { "date_histogram": { "field": "borthday", "interval": "month", "format": "yyyy-MM-dd", "min_doc_count": 0, "extended_bounds": { "min": "1970-10-01", "max": "2022-12-31" } } } } }
- date_histogram:日期分段統計函數
- field:聚合分組的字段,類型需要為date
- interval:按什么時間聚合,interval字段支持多種關鍵字:year, quarter(季度), month, week, day, hour, minute, second,
- format:返回值格式化
- min_doc_count:0分組后沒數據的也顯示,最小有多少條才顯示
- extended_bounds:強制規定最小值和最大值界限,ES默認把有數據的最小值開始做開始界限
6.同時統計多個集合
#分別統計年齡和性別 GET employee/_search { "size": 0, "aggs": { "language_count": { "histogram": { "field": "age", "interval": 10 }, "aggs":{ "age_avg":{ "sum":{ "field": "age" } } } }, "gender_count":{ "terms": { "field": "gender" } } } }
三、sql插件
1.插件安裝
上面的查詢語句為DSL查詢,sql插件可以編寫sql語句,然后自動解析為DSL語句查詢
sql插件github地址:https://github.com/NLPchina/elasticsearch-sql
下載的對應es的版本。
解壓后放到 plugins 文件夾並改名為sql,然后重啟es
2.sql語句查詢
2.1普通查詢
GET /_sql?format=txt { "query": "select * from employee where job='java'" }
2.2其他查詢寫法
#普通查詢 SELECT * FROM bank WHERE age >30 AND gender = 'm'
#聚合查詢(分組統計) select COUNT(*),SUM(age),MIN(age) as m, MAX(age),AVG(age) FROM bank GROUP BY gender ORDER BY SUM(age), m DESC
#刪除 DELETE FROM bank WHERE age >30 AND gender = 'm'
更多的查詢看sql插件的github地址最下面的說明