Elastic search(构建于Lucene之上)在一个容易管理的包中提供了高性能的全文搜索功能,支持开箱即用地集群化扩展。可以通过标准的REST API或从特定于编程语言的客户端库与Elasticsearch进行交互。
1、首先了解一下es的主要构成:
①索引(index)个人可以理解为关系型数据库的库
②类型(type)个人可以理解为关系型数据库的表
③文档(document)个人可以理解为关系型的唯一主键
2、es一些关键词
query下面可以加
②bool 布尔值
③must 相当于是关系型数据库的and
④filter 和bool的作用差不多,但是filter的查询效率更高
⑤term 指定的要查询的某个字段
agg 下面可以加
①term 指定的字段
②agg 相当于是关系型数据库的groupby
③cardinality 去重相当于是关系型的distinct
④sum max min
等等
3、去重例子,在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
4、指定字段查询
①一种查法: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"
}
}
}
}
}
执行结果
5、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直接挂掉,曾经出现过这些问题
5、地理位置查询
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类型的,看例子
今天先写到这里