背景
- 最近产品经理反馈查报文麻烦,后期和领导讨论做一个日志收集服务,日志存储选择用ES
- 在学习ES之前,带上下面的疑问点进行学习,下面请求参数是啥意思?
2.1 url:/plume_log_run_20210804*/_search?from=0&size=100
2.2 查询参数{"query":{"bool":{"must":[{"match_phrase":{"appName":{"query":"plumelog_demo"}}},{"range":{"dtTime":{"gte":1628041788000,"lt":1628045658000}}}]}},"highlight":{"fields":{"content":{"fragment_size":2147483647}}},"sort":[{"dtTime":"desc"},{"seq":"desc"}]}
Elasticsearch搜索都发生了什么?
- REST API 搜索请求被发送到所连接的节点,该节点根据要查询的索引,将这个请求依次发送到所有的相关分片(主分片或者副本分片)。从所有分片收集到足够的排序和排名信息之后,只有包含所需文档的分片才被要求返回相关的内容
- 搜索路由的行为是可以配置的
2.1 转发请求
2.2 聚集结果
搜索请求的结构
确定搜索范围
- 所有的REST搜索请求使用_search的REST端点,既可以是GET请求,也可以是POST请求
- 可以通过在搜索URL中指定索引或类型的名称来限制范围
2.1 例如/plume_log_run_20210804*/_search?from=0&size=100,限制以plume_log_run_20210804开头的索引
2.2 size:代表了返回文档的数量
2.3 from:和size一起使用,from用于分页操作
搜索请求的基本模块
query:搜索请求中最重要的组成部分。该模块使用DSL和过滤器DSL来配置
sort:默认排序是基于文档的得分,添加额外的sort将帮助你控制哪些文档被返回
常用的基础查询
match查询
- match查询是一个散列映射,包含了希望搜索的字段和字符串
- 布尔查询行为
2.1 默认情况下,match查询使用布尔行为和OR操作符
(1)搜索文本"ES Denver",ES会搜索"ES OR Denver",同时匹配"ES Amsterdan"和"Denver Clojure"聚会分组
2.2 为了搜索同时包含"ES"和"Denver"关键词的结果,将match字段的name修改为一个映射"query":{ "match":{ "name":{ "query" : "ES Denver", "operator" : "and" } } }
- 词组查询行为
3.1 每个单词的位置之间可以留有余地(slop:表示词组中多个分词之间的距离)
3.2 match_phrase 查询同样可写成一种类型为 phrase 的 match 查询"query":{ "match":{ "name":{ "type" : "phrase", "query" : "ES Denver", "slop" : 1 } } }
range查询
- 为了使用范围查询,需要指定某个字段的上界和下界值
"query":{ "range" :{ "create_on":{ "gt" : "2012-06-01", "lt" : "2012-09-01" } } }
组合查询或复合查询
- bool查询允许你在单独的查询中组合任意数量的查询
1.1 指定的查询子句表明哪些部分是必须(must)匹配、应该(should)匹配或者是不能(must_not)匹配上ES索引里的数据
使用聚集来探索数据
- Elasticsearch的聚集(aggregations)加载了和搜索相匹配的文档,并且完成了各种的计算
- 聚集分为两个主要的类别:度量型和桶型
2.1 度量型聚集是指一组文档的统计分析,可以得到诸如最大值、最小值、标准差等度量值
2.2 桶聚集将匹配的文档切分一个或多个容器(桶),然后告诉你每个桶里的文档数量 - 有了桶聚集,可以嵌套其他的聚集,让子聚集在上层聚集所产生的每个文档桶上运行
聚集的具体结构
"aggregations": {
"2": {
"date_histogram": {
"field": "dtTime",
"interval": 60000,
"min_doc_count": 0
}
}
}
- 使用键aggregations或者aggs来进行标记。需要给每个聚集起一个名字,指定它的类型以及该类型相关的选项
- 运行在查询的结果之上。和查询不匹配的文档不会计算在内
histogram聚集
- 定义一个固定的间距,然后Elasticsearch会为你构建多个范围
- histogram聚集有一个用于日期的变体,称为date_histogram聚集
2.1 需要在interval字段里插入日期
2.2 使用min_doc_count选项显示空的桶,或者是忽略只包含少量文档的桶