1. 检索结构复习(所有的设计都是 trade off
):
线性检索,数组与链表效率分析,二分查找法,对于有序数组的范围查找
[x,y]
,先二分法定位x
,缩小区间后在[x,max]
之间再二分找到y
是比较好的方式,数组可以利用内存局部性原理加快查询,小数据量下的插入操作可以使用到内存拷贝,也不会很慢。非线性结构,链表
O(N)
–> 二叉排序树(OlogN)
,是为了增加链表的检索效率。由于存在树退化的可能,引申出了 红黑树、二叉平衡树等平衡结构,Set
、Map
的底层就用到了红黑树;跳表(链表的二分查找),空间换时间的一种结构。采用分层存储的方式,缩小检索范围,大数据量下趋于
O(logn)
,小数据量下检索效率不稳定。因为跳表在实际存储时并不是按照2^n
步长维护的,否则新增节点会修改已有的大部分指针;Redis
为什么使用跳表实现Sorted Set
操作?(严格来说,不同数据量下redis
采用的数据结构是不同的,数据少时,Sorted Set
使用的是压缩列表)1.set支持范围操作,而跳表在范围查找上的效率高于红黑树。(树的局部中序遍历,不太好操作,否则就是全局中序判断是否相等)
2.跳表在思想上相对于红黑树来说更易理解(实现其实都不简单,并且红黑树有现成的,跳表还得自己写。。雾)
3.跳表更加灵活,调节步长可以灵活控制内存消耗及平衡策略。
Hash
表冲突的解决方式:开放寻址法(对比时总是被吊打,应用场景:以及位图思想,布隆过滤等),链式hash
法开发寻址法的优化策略:“双散列,求多个
hash
值”(布隆过滤),布隆过滤在删除一个元素时,不能直接置为0(可以采用计数法,或者定时重建)1
计算最优哈希函数个数的数学公式: 哈希函数个数 k = (m/n) * ln(2)。其中 m 为 bit 数组长度,n 为要存入的对象的个数。实际上,如果哈希函数个数为 1,且数组长度足够,布隆过滤器就可以退化成一个位图。所以,我们可以认为“位图是只有一个特殊的哈希函数,且没有被压缩长度的布隆过滤器
倒排索引与正排索引。
2. 文档阅读:
Getting started with Elasticsearch
,安装部署1
2
3
4GET /_cat/health?v
GET /_cat/indices?v
GET /_cat/recovery
GET /_cat/nodes?vterm Aggregations,term
聚合Important Elasticsearch Configuration
,重要的设置项Documents API
,增删改查复习集群升级模块
API conventions
,时间函数支持、通用参数设置等IndexAPI、HEAD、delete_by_query、update_by_query、reindex
script
在update、update_by_query、reindex
中的应用highlight
与highlight_query
3. 以前忽略的小知识总结
Index,update,delete,bulk
请求支持 手动刷新?refresh
参数,可选值包含空字符串 (= true
),也可以设置wait_for
或false
,默认为false
;refresh_interval
、index.write.wait_for_active_shards
的默认值都为1,后者表示主分片写入即返回成功。增大该参数后。如果处于正常状态的分片数量达不到要求,写入会失败;GET API
默认是realtime
的,会查询到尚未被refresh_interval
刷到磁盘的内容,通过?realtime=false
参数可以关闭;delete
的实际删除时间,默认是在60s
后。index.gc_deletes
可以设置该时间;routing
可以设置在mapping
中,设置之后,请求都需要带上routing
才行。在只有一个分片的情况下,该参数没有效果;delete_by_query、update_by_query
都可以设置routing
,操作指定分片上的内容,默认scroll_size
为1000
,通过slice_scroll
可以分段并发的删除;乐观并发控制
version
,新版本增加了if_seq_no
、if_primery_term
;reindex 可以通过query、sort、size等查询参数指定范围,通过
ingest/pipeline
、script
进行数据处理;不支持跨大版本进行reindex
version_type: external 创建缺失的文档,并更新target中版本号更低的,默认 internal
op_type: create 只创建缺失文档 ,默认全覆盖
跨集群操作
reindex
,需要在yml
文件中增加 配置reindex.remote.whitelist: localhost:*,....
。此外,跨集群操作使用的堆缓冲区大小默认为100M,批量操作不能太大;Search API
,字段映射时doc_values : false
可以被搜索到,但不能用于排序聚合,script
操作;collapse
可以对结果进行折叠(可以二次折叠),排序会影响折叠后得展示结果,hits
命中数是折叠之前的总数(必须是keyword
或数值类型)。inner_hits
可以返回折叠的详细内容;不支持与scroll、search_after(from分页是可以的)、rescore 一起使用
4. 脚本记录
1. script操作
1 | PUT test/_doc/1 |
2. collapse
1 | GET /twitter/_search |
和服 Alter