ES
agge 聚合
terms 条款,项
对text类型的字段进行分组,必须加上keyword,不加keyword ---->1 对该字段进行fileddata=true 2 会对该字段进行分词
GET /event-fw*/_search
{
"aggs": {
"test": {
"terms": {"field": "event_type.keyword"}
}
}
,"size": 0
}
先查询过滤再进行分组
GET /event-fw*/_search
{
"aggs":{
"test":{
"terms":{
"field":"event_type.keyword"
}
}
},
"size":0,
"query":{
"match":{
"app_name":"网页浏览(HTTP)"
}
}
}
结构化查询
bool合并子句或者复合子句 当must must_not should 里面有多个参数值,里面变成数组
GET /event-fw*/_search
{
"query": {
"bool": {
"must": { "match": { "title": "quick" }},
"must_not": { "match": { "title": "lazy" }},
"should": [
{ "match": { "title": "brown" }},
{ "match": { "title": "dog" }}
]
}
}
}
查询和过滤的本质区别
ES语法简介
term
主要用于精确匹配哪些值,比如数字,日期,布尔值或not_analyzed
的字符串(未经分析的文本数据类型):
{ "term": { "date": "2014-09-01" }}
复制代码
参考地址:es.xiaoleilu.com/054_Query_D…
es可以进行批量查询
先查找过滤再根据dst_ip 分组
- 时间在索引上过滤
GET /event-fw*/_search
{
"query": {
"bool": {
"must": { "match": { "event_name":"漏扫" }},
"must": { "match": { "src_ip":"10.2.6.30" }}
}
}
,"aggs": {
"test": {
"terms": {
"field": "dst_ip",
"size": 5
}
}
}
}
先根据ip分组,在根据关键字进行过滤
简单搜索
DSL查询
复杂的搜索 filter query 的嵌套
全文搜索 match
短语匹配 match_phrase 对内容短语不进行拆分
聚合
直接聚合
查询过滤再聚合
聚合再统计
应对故障
主分片的数量在创建缩影是已经确定,也就是说你大概有多少数据
es查询语法
根据时间过滤再分组
SearchResponse table1 = ESConfig.client().prepareSearch("event-fw-*")
.setQuery(QueryBuilders.rangeQuery("event_receive_time").from("0").to("1557471553437"))
.addAggregation(AggregationBuilders.terms("src_ip").field("src_ip")
.subAggregation(AggregationBuilders.sum("total_up").field("up_bit"))
.subAggregation(AggregationBuilders.sum("total_total").field("total_bit"))
.subAggregation(AggregationBuilders.sum("total_down").field("down_bit")))
.setSize(10)
.execute().get();
复制代码
es批量查询
MultiSearchRequestBuilder multiSearchRequestBuilder = ESConfig.client().prepareMultiSearch();
//创建查询条件
//查询tags:car
SearchRequestBuilder carSearch = ESConfig.client().prepareSearch(INDEX_FW);
carSearch.setQuery(QueryBuilders.matchQuery(FEILD_EVENT_NAME, ATTACK_FIVE));
multiSearchRequestBuilder.add(carSearch);
//查询tags:male
SearchRequestBuilder maleSearch = ESConfig.client().prepareSearch(INDEX_FW);
maleSearch.setQuery(QueryBuilders.matchQuery(FEILD_EVENT_NAME,ATTACK_ONE));
multiSearchRequestBuilder.add(maleSearch);
multiSearchRequestBuilder.execute().get();
复制代码
关于这四个query的区别
9200和9300
es启动监听两个端口,9300和9200 9300端口是使用tcp客户端连接使用的端口; 9200端口是通过http协议连接es使用的端口;