Elastic search(構建於Lucene之上)在一個容易管理的包中提供了高性能的全文搜索功能,支持開箱即用地集羣化擴展。能夠經過標準的REST API或從特定於編程語言的客戶端庫與Elasticsearch進行交互。數據庫
一、首先了解一下es的主要構成:編程
①索引(index)我的能夠理解爲關係型數據庫的庫app
②類型(type)我的能夠理解爲關係型數據庫的表編程語言
③文檔(document)我的能夠理解爲關係型的惟一主鍵性能
二、es一些關鍵詞code
query下面能夠加xml
②bool 布爾值索引
③must 至關因而關係型數據庫的andci
④filter 和bool的做用差很少,可是filter的查詢效率更高文檔
⑤term 指定的要查詢的某個字段
agg 下面能夠加
①term 指定的字段
②agg 至關因而關係型數據庫的groupby
③cardinality 去重至關因而關係型的distinct
④sum max min
等等
三、去重例子,在kibana執行以下
GET antifraud_enriched_prod-2017.06.17/_search { "size": 0 , "aggs": { "res_distinct": { "cardinality": { "field": "unstruct_event_com.cid" , "precision_threshold": 40000 } } } , "query": { "bool": { "must": [ { "range": { "derived_tstamp": { "gte": "2017-06-17T10:49:46.685Z", "lte": "2017-06-17T10:51:46.685Z" } } } ] } } }
執行以下:
field表明是存放在es的字段,這個字段我在mapping的時候沒有分詞,若是分詞的話要在field後面加上.raw
右邊total表明的是返回值,res_distinct表明的是根據cid去重後的結果
es的distinct自己是存在問題的,precision_threshold:指定的去重範圍,若是查出來的數據超出了你指定的這個範圍,查出來的數據就是有點不許確了,默認好像是100
四、指定字段查詢
①一種查法:bool
GET antifraud_enriched_prod-2017.06.18/_search { "size": 0, "query": { "bool": { "must": [ { "term": { "event_name": { "value": "login" } } } ] } } }
執行結果:
②另外一種查法:filter
GET antifraud_enriched_prod-2017.06.18/_search { "size": 0, "query": { "filtered": { "query": { "match_all": {} }, "filter": { "term": { "event_name": "login" } } } } }
執行結果
五、agg的例子
GET antifraud_enrich-2017.06a/_search { "size": 0, "aggs": { "mobile_city": { "terms": { "field": "unstruct_event_com_xhqb.mobileCity" , "size": 5 } , "aggs": { "avg": { "sum": { "field": "unstruct_event_com_xhqb.loanAmount" } } } } } , "query": { "bool": { "must": [ { "range": { "derived_tstamp": { "gte": "2017-06-01T10:25:23.947Z", "lte": "2017-06-01T10:28:23.947Z" } } } ] } } }
執行結果:
其中結果:sum_other_doc_count 表明是groupby mobilcity字段的結果,key是sum_other_doc_count 的前提後groupby loanmount字段的結果
注意通常使用agg的話不要指定size=0,若是這樣的話,數據會所有刷出kibana,數據量過大的話,kibana直接掛掉,曾經出現過這些問題
五、地理位置查詢
GET antifraud_enrich-2017.06a/_search { "size": 0, "query": { "bool": { "must": [ { "term": { "event_name": { "value": "app_apply" } } },{ "range": { "collector_tstamp": { "gte": "2017-06-17T09:02:26.548", "lte": "2017-06-17T09:22:26.548" } } },{ "geo_distance" : { "unstruct_event_com_xhqb_app_apply_1.geolocation" : [ 121.499754782832099, 31.267086143900748 ], "distance" : "1.0km" } } ] } } }
查詢結果
其中geolocation是地理位置字段, distance是1km的範圍內,也就是說這個點的一千米範圍裏查出來有幾個,這個字段比較特殊必定要是geo_point類型的,看例子
今天先寫到這裏