用ES有一段时间了,可是项目用的都是很简单的逻辑,抽时间系统的学习了一下,整理一下 Elasticsearch 都有什么功能 。
html
如下资料参照官方文档ES 7.2
www.elastic.co/guide/en/el…sql
Search_type 搜索类型api
Es词条在各类分片中 每一个分片词条分数不一致 因此有4种方式取TOPNbash
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 深度分页app
假若有深度分页的需求 那么 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 统计上限elasticsearch
若是你的数据量很大 若是要count某个索引 那么须要彻底匹配后才能统计完数据 track_total_hits=999 能够指定若是知足999条数据匹配 就能够再也不往下匹配了
ide
_source 和 stored_fields post
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…
上面这个文章简单介绍了三种统计相互配合的例子
1、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 绝对中位差 标准差的改进版 避免某一个离散点的影响力
2、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…
3、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经常使用。