es的常用字段類型和查詢
概要
在ES中,字段的類型很關鍵,畢竟無論是es還是傳統的數據庫,都無法弱化字段的類型。
在索引的時候,如果字段第一次出現,會自動識別某個類型。
那么如果一個字段已經存在了,並且設置為某個類型。再來一條數據,字段的數據不與當前的類型相符,就會出現字段沖突的問題。如果發生了沖突,在2.x版本會自動拒絕。
如果自動映射無法滿足需求,就需要使用者自己來設置映射類型,因此,就需要使用者了解ES中的類型。
一、ES數據類型
1、分隔數據
ElasticSearch“真正用於分隔數據的結構“只有index,而沒有type,type實際上作為了一個元數據(類似SQL中的id,作為額外的標識數據)來實現邏輯划分。
2、mapping
在index中還有一個mapping,mapping管理了整個index的各個字段的屬性,也就是定義了整個index中document的結構。
GET test_alias/_mapping
3、ES數據類型
ES常用的數據類型可分為3大類:核⼼數據類型、復雜數據類型、專⽤數據類型
1)核心數據類型
(1)字符串類型: text, keyword
text類型:
a. 支持分詞,全文檢索,支持模糊、精確查詢,不支持聚合,排序操作;
b. test類型最大支持的字符長度無限制,適合大字段存儲;
使用場景:
存儲全文搜索數據, 例如: 郵箱內容、地址、代碼塊、博客文章內容等。
默認結合standard analyzer(標准解析器)對文本進行分詞、倒排索引。
默認結合標准分析器進行詞命中、詞頻相關度打分。
keyword類型:
a. 不進行分詞,直接索引,支持模糊、支持精確匹配,支持聚合、排序操作。
b. keyword類型的最大支持的長度為——32766個UTF-8類型的字符,可以通過設置ignore_above指定自持字符長度,超過給定長度后的數據將不被索引,無法通過term精確匹配檢索返回結果。
使用場景:
存儲郵箱號碼、url、name、title,手機號碼、主機名、狀態碼、郵政編碼、標簽、年齡、性別等數據。
用於篩選數據(例如: select * from x where status='open')、排序、聚合(統計)。
直接將完整的文本保存到倒排索引中。
(2)數字類型:long, integer, short, byte, double, float, half_float, scaled_float
(3)日期:date
(4)日期 納秒:date_nanos
(5)布爾型:boolean
(6)Binary:binary
(7)Range: integer_range, float_range, long_range, double_range, date_range
二、es的常用命令
1、 cat 命令:
cat 命令是監控 es 的節點,內存,索引,分片,集群狀態等一些基本信息
1 # 列出所有_cat命令 2 GET _cat/ 3 4 # 顯示左右索引並按照存儲大小排序 5 GET _cat/indices?v&s=store.size:desc 6 7 # 獲取集群狀態 8 GET _cat/health 9 10 # 當使用v參數是 會顯示列名的詳細信息 11 GET _cat/health?v 12 13 # 顯示所有的node信息 14 GET _cat/nodes?v 15 16 # 只顯示ip和load_5m這兩列 17 GET _cat/nodes?v&h=ip,load_5m 18 19 # 通過json格式顯示輸出 20 GET _cat/indices?v&format=json&pretty
2、 精確值查找
term
1 GET test_alias/_search 2 { 3 "query": { 4 "term": { 5 "target_id": { 6 "value": "15464324" 7 } 8 } 9 } 10 }
3、范圍檢索
range
范圍查詢的符號:
gte 大於或等於
gt 大於
lte 小於或等於
lt 小於
例如:數組范圍內的查詢
1 GET book_shop/_search 2 { 3 "query": { 4 "range": { 5 "price": { 6 "gte": 40, 7 "lte": 80, 8 "boost": 2.0 // 設置得分的權重值(提升值), 默認是1.0 9 } 10 } 11 } 12 }
1 GET test_alias/_search 2 { 3 "query": { 4 "bool": { 5 "filter": [ 6 { 7 "terms": { 8 "expend_type": [ 9 1, 10 13 11 ] 12 } 13 }, 14 { 15 "term": { 16 "target_id": 2402483 17 } 18 }, 19 { 20 "range": { 21 "time": { 22 "gt": 1553217005, 23 "lt": 1553218095 24 } 25 } 26 } 27 ] 28 } 29 } 30 }
4、分詞檢索
match
match_all
4) Bool查詢
Bool查詢包括四種子句:must、filter、should、must_not
must, 返回的文檔必須滿足must子句的條件,並且參與計算分值
filter, 返回的文檔必須滿足filter子句的條件。但是跟must不一樣的是,不會計算分值, 並且可以使用緩存
從上面的描述來看,如果只看查詢的結果,must和filter是一樣的。區別是場景不一樣。如果結果需要算分就使用must,否則可以考慮使用filter
5、聚合查詢
aggs
1) 給定target_id的值,查詢同一個target_id下的expend_type為1或者13下的統計值
1 GET test_alias/_search 2 { 3 "size": 0, 4 "query": { 5 "bool": { 6 "must": [ 7 { 8 "terms": { 9 "expend_type": [ 10 1, 11 13 12 ] 13 } 14 }, 15 { 16 "terms": { 17 "target_id": [ 18 13906061, 19 13817056, 20 13904373, 21 13851977, 22 13851353 23 ] 24 } 25 } 26 ] 27 } 28 }, 29 "aggs": { 30 "phone_count": { 31 "terms": { 32 "field": "target_id" 33 } 34 } 35 } 36 }
查詢結果為:
2) 給定target_id的值,查詢expend_type分別為1和13下的統計值
1 GET test_alias/_search 2 { 3 "size": 0, 4 "query": { 5 "bool": { 6 "must": [ 7 { 8 "terms": { 9 "target_id": [ 10 13906061, 11 13817056, 12 13904373 13 ] 14 } 15 }, 16 { 17 "terms": { 18 "expend_type": [ 19 1, 20 13 21 ] 22 } 23 } 24 ] 25 } 26 }, 27 "aggs": { 28 "target": { 29 "terms": { 30 "field": "target_id" 31 }, 32 "aggs": { 33 "type": { 34 "terms": { 35 "field": "expend_type" 36 } 37 } 38 } 39 } 40 } 41 }
查詢結果為:
1 { 2 "took" : 2, 3 "timed_out" : false, 4 "_shards" : { 5 "total" : 9, 6 "successful" : 9, 7 "skipped" : 0, 8 "failed" : 0 9 }, 10 "hits" : { 11 "total" : { 12 "value" : 620, 13 "relation" : "eq" 14 }, 15 "max_score" : null, 16 "hits" : [ ] 17 }, 18 "aggregations" : { 19 "target" : { 20 "doc_count_error_upper_bound" : 0, 21 "sum_other_doc_count" : 0, 22 "buckets" : [ 23 { 24 "key" : 13906061, 25 "doc_count" : 502, 26 "type" : { 27 "doc_count_error_upper_bound" : 0, 28 "sum_other_doc_count" : 0, 29 "buckets" : [ 30 { 31 "key" : 1, 32 "doc_count" : 502 33 } 34 ] 35 } 36 }, 37 { 38 "key" : 13817056, 39 "doc_count" : 62, 40 "type" : { 41 "doc_count_error_upper_bound" : 0, 42 "sum_other_doc_count" : 0, 43 "buckets" : [ 44 { 45 "key" : 1, 46 "doc_count" : 62 47 } 48 ] 49 } 50 }, 51 { 52 "key" : 13904373, 53 "doc_count" : 56, 54 "type" : { 55 "doc_count_error_upper_bound" : 0, 56 "sum_other_doc_count" : 0, 57 "buckets" : [ 58 { 59 "key" : 1, 60 "doc_count" : 56 61 } 62 ] 63 } 64 } 65 ] 66 } 67 } 68 }
參考鏈接: https://cloud.tencent.com/developer/article/1496106