用ES有一段时间了,但是项目用的都是很简单的逻辑,抽时间系统的学习了一下,整理一下 Elasticsearch 都有什么功能 。
以下资料参照官方文档ES 7.2
www.elastic.co/guide/en/el…
Search_type 搜索类型
Es词条在各种分片中 每个分片词条分数不一致 所以有4种方式取TOPN
QUERY_AND_FEATCH :<br>
搜索时向所有分片发出查询请求,各分片返回的时候把元素文档和计算后的排名信息一起返回 效率高 但是每一个分片都取topn 再排序就会不准 <br>
QUERY_THEN_FETCH (默认方式)<br>
和上面的相比 取出来的是id和排序相关信息 排序完成后 再取数据 两次请求<br>
DFS_QUERY_AND_FEATCH<br>
把所有分片数据都取出来 然后综合排序 效率比上面的第 但是最准确
DFS_QUERY_THEN_FEATCH<br>
DFS的后续过程和QUERY_THEN_FETCH一致
Search_after 深度分页
假如有深度分页的需求 那么 from,size 这种分页方式就会有很高的损耗 使用 search_after 需要指定主键 _id 和 辅助排序索引 指定排序规则 并且不能设置from 举个一看就懂的官方例子
第一次查询
GET twitter/_search
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"sort": [
{"date": "asc"},
{"tie_breaker_id": "asc"}
]
}
第二次 search_after 查询 指定了上一次查询 date和tie_breaker_id 的值
GET twitter/_search
{
"size": 10,
"query": {
"match" : {
"title" : "elasticsearch"
}
},
"search_after": [1463538857, "654323"],
"sort": [
{"date": "asc"},
{"tie_breaker_id": "asc"}
]
}
Track_total_hits 统计上限
如果你的数据量很大 如果要count某个索引 那么需要完全匹配后才能统计完数据 track_total_hits=999 可以指定如果满足999条数据匹配 就可以不再往下匹配了
_source 和 stored_fields
stored_fields 是单个文档 一条记录可能有多个stored_fields 如 id,name等 如果查询时指定stored_fields 那么就会有N次IO
_source 就是id,name的总体文档 并且是压缩过的 如果查询时指定_source 那么只会有一次IO 但是如果遇到某个字段特别的大 就会浪费内存空间和解析的时间
Post_filter
通常聚合agg 会在filter 之后 如果想聚合全量的数据但是又想查询过滤filter 那么需要post_filter 这时agg会在post_filter之前
Min_score 最小分数过滤
查询的数据必须满足最小分数限制
Explain 查询的时候展示详情
查看细节 或者 调试的时候有用
Collapse 相当于 sql的 distinct
Nested 和 parent/child 内嵌索引和父子索引
为了解决关联查询效率低的问题 引入了内嵌和父子索引
内嵌索引的一对多相当于一个整体 改任何一条记录都需要改整个索引
父子索引是独立的索引 但是查询效率不如内嵌索引, 且索引必须在一个分片,且不能改变父子索引关系
Highlight 高亮
高亮就像百度查出来的帖子 里面各种红色的分词
Boost 查询权重加成
某个条件加入boost 那么这个条件的score = score*boost 那么他的分数就会更大
{
"_source": false,
"min_score": 4,
"explain": true,
"query": {
"term": {
"deliverId": {
"value": 57257826348037,
"boost": 10
}
}
}
}
Suggest 搜索建议
像谷歌那种 如果你查询的单词有误 然后建议你 是不是要查找xxxx
Freeze Index 冻结索引
有些索引经常用不到 查询频率非常低 这时候可以使用冻结索引 来节省内存
X-PACK 这是官方付费包
里面有各种高级特性,也有一些是开源免费的
Cat Api 打各种日志
Aggregations 各种统计
统计分为三种类别 指标统计,分桶聚合,桶管道统计
blog.csdn.net/zyc88888/ar…
上面这个文章简单介绍了三种统计相互配合的例子
一、Metrics Aggregations 指标统计
1.Avg Aggregation 计算出字段平均值
2.Weighted Avg Aggregation 加权平均值
3.Cardinality Aggregation 计算出字段的唯一值
4.Extended Stats Aggregation 综合属性,最大,最小,方差等等
5.Geo Bounds Aggregation 坐标点方框范围统计,返回左上,右下坐标
6.Geo Centroid Aggregation 给一个范围,统计中心点
7.Max Aggregation 最大值
8.Min Aggregation 最小值
9.Percentiles Aggregation 查出结果 按照类别划分“百分位数”
比如可以应用于一个网站的加载时长的指标,或者各种性能指标。
10.Percentile Ranks Aggregation 给一组类别 返回对应百分比
11.Scripted Metric Aggregation 写脚本统计 相当于自己计数
12.Sum Aggregation 求和
13.Top Hits Aggregation 相当于group by 然后 topN
14.Value Count Aggregation 数量统计 一个类别有多少不同的值
15.Median Absolute Deviation Aggregation 绝对中位差 标准差的改进版 避免某一个离散点的影响力
二、Bucket Aggregations 分桶统计
1.Adjacency Matrix Aggregation 邻接矩阵统计 例如共同好友这些功能
2.Date Histogram Aggregation 日期柱状图统计 按照日期间隔统计数量
3.Composite Aggregation 多条件聚合 相当于多条件的count group by
4.Range Aggregation 范围分桶统计
5.Date Range Aggregation 按日期格式范围分桶统计
6.Sampler Aggregation 采集器
貌似是说 如果一个低相关度的词和一个高相关度的词在一起 那么如果都去匹配 就会浪费资源 可以设置匹配分数最佳的词条 topN
7.Ip Range Aggregation Ip范围统计
8.Nested /Reverse Nested Aggregation 内嵌统计
9.Parent Aggregation 父子统计
10.Terms/Significant Terms Aggregation 按key聚合统计
Significant Terms 相比Terms 会考虑占比 比如100个文档命中4个 和 1000个文档命中8个 显然前者更关键。
11.Significant Terms Aggregation 指定文本,按重要文本聚合统计
12.Geo Distance Aggregation 按地址距离统计
13.GeoHash grid Aggregation GeoHash网格统计
GeoHash是将地图划分成块并用字符串标识 可以统计出有多少个区域块,或者指定区域块有多少数据匹配该块
关于GeoHash的介绍和应用链接
blog.csdn.net/alitech2017…
三、Pipeline Aggregations 对桶进行流式统计
1.Avg Bucket Aggregation 对桶统计后的结果求平均
2.Derivative Aggregation 对桶求导
比较晦涩 举个官方栗子 算月利润增涨
Request:
POST /sales/_search
{
"size": 0,
"aggs" : {
"sales_per_month" : {
"date_histogram" : {//对日期月份分桶
"field" : "date",
"calendar_interval" : "month"
},
"aggs": {
"sales": {//取每月的利润总和
"sum": {
"field": "price"
}
},
"sales_deriv": {//对每月利润求导,sales 为上面的求和统计名
"derivative": {
"buckets_path": "sales"
}
}
}
}
}
}
Response:
{
"took": 11,
"timed_out": false,
"_shards": ...,
"hits": ...,
"aggregations": {
"sales_per_month": {
"buckets": [
{
"key_as_string": "2015/01/01 00:00:00", //1月
"key": 1420070400000,
"doc_count": 3,//匹配文档3个
"sales": {
"value": 550.0 //月总利润550
}
},
{
"key_as_string": "2015/02/01 00:00:00",//2月
"key": 1422748800000,
"doc_count": 2,
"sales": {
"value": 60.0 //月总利润60
},
"sales_deriv": {
"value": -490.0 // 月利润求导 上一条没有记录 是因为求导需要两条数据 所以第一条没有数据
}
},
{
"key_as_string": "2015/03/01 00:00:00",
"key": 1425168000000,
"doc_count": 2,
"sales": {
"value": 375.0
},
"sales_deriv": {
"value": 315.0
}
}
]
}
}
}
3.Max/Min/Sum Bucket Aggregation 对桶求最大/最小值/求和
4.Percentiles Bucket Aggregation 对桶求百分位数
这个官方例子没有Percentiles Aggregation 讲的好 先看这个然后再对应分桶就是了
5.Moving Average[Function] Aggregation 滑动平均法分桶聚合
“滑动平均法”利用现有的数据,预测未来的走势,消除个别离散点的影响。
下图是滑动窗口数值10和100的区别图。
6.Cumulative Sum Aggregation 对桶累加求和 适用于柱状图
7.Bucket Sort Aggregation 对桶排序
8.Bucket Selector Aggregation 对桶再次过滤
9.Bucket Script Aggregation 对桶进行脚本运算 比 Bucket Selector 更定制一些
Indices API
里面有各种对索引的管理
例如:创建,删除,获取,扩容,压缩,重构,别名,改变Mapping 等..
Cluster API
里面有各种集群的管理 感觉像是运维的东西 先不看了。。。
Mapping
mapping 就相当于Sql的建表语句一样
一个索引对应一个mapping 包含了各种信息
_index(db),_type(table),_id(index),_score(分数),field(各种字段)
下面的是mapping的字段类型 只列出不常规的类型 常规类型不举例了
field datatypes
1.keyword
与text的区别是 keywork需要精确的查找 比如邮箱,姓名等,而text一般用来分词查找的。
2.geo_point
用来存经纬度的 应用可以参考上面的geohash统计
3.ip
这是用来避免字符串分词的? 有对应的ip查找api
4.nested/join datatype
上面讲过nested内嵌类型和父子文档查询 这个就是对应的内嵌/父子存储类型
5.Percolator type
反向查询类型 配合Percolator query
貌似是说 为索引注册一个查询条件 然后用value 反向来判断这个注册的查询条件 有没有匹配 应用一些报警和监控,比如你注册了一个监控条件 然后当有一条数据插入的时候 会判断这条数据是否匹配你的监控??? 大概是这个意思 下面是一个相对 好一点的例子 不过感觉还是不太懂
www.elastic.co/cn/blog/per…
6.Rank feature/features datatype
高性能打分和_score类似,_score是一个文档对应的分数 这个是一个单独的存储类型 配合Rank feature Query 使用 并且Query还支持多种变化分数的计算公式 比计算_score的fuction scroe query 要高效。
mapping paramters mapping的参数
1.analyzer
文本分词器 这个以后详细讲吧
2.normalizer
和keyword配套 比如大小写不匹配的时候 查不出来 这时候可以指定按照小写来查
3.boost
对打分的分数进行二次加成
4.doc_values
如果确定某个字段 不进行 排序 聚合 和脚本操作 可以禁用 节约磁盘空间提升索引速度
5.fieldData
fieldData 主要针对于 text 这种需要分词的field 来进行存储设置
fieldData.loading = eager 预加载,正常fieldData是落在磁盘的。 如果要检索大量的字符串,就需要非常耗时。这时候就需要预加载了。
fieldData 里面还有各种 匹配加载策略 可以节省加载的内存 。
6.其他
其他的参数太过于扣细节了 感觉很难有实际应用场景 大多都是和分词匹配有关的 以后真遇到再说吧
Analysis 里面有各种分词器 但是都没什么卵用 因为我们都用中文,所以得自定义了。 网上找的一些分词 IK,jieba,Hanlp,THUAC 据说ik常用。