Hash算法确保文档均匀分散到分片中
默认的_routing 值是文档id
可以自行制定routing数值,例如用相同国家的商品,都分配到指定的shard
设置Index Setting后,Primary数,不能随意修改的更本原因
更新一个文档
a.倒排索引的不可变性
倒排索引采用Immutable Design,一旦生成,不可更改不可变性,带来了的好处如下: 1.无需考虑并发写文件的问题,避免了锁机制带来的性能问题
2.一旦读入内核的文件系统缓存,便留在哪里。只要文件系统存有足够大的空间,大部分请求就会直接请求内存,不会命中磁盘,提升了很大的性能
3.缓存容易生成和维护/数据可以被压缩
调用Refresh,Index Buffer清空并且Refresh
调用fsync,将缓存中的Segments写入磁盘
清空(删除)Transaction Log
默认30分钟调用一次
Transaction Log满(默认512MB)
减少Segments/删除已经删除的文档
ES和Lucene会自动进行Merge操作 POST my_index/_forcemerge
每个分片上需要查的文档个数=from+size
最终协调点需要处理:number_of_shard*(from+size)
深度分页
相关性算分
每个分片都基于自己的分片上的数据经行相关度计算。这会导致打分偏离的情况,特别是数据很少时。相关性算分之间是相互独立。当文档总数很少的情况下,如果主分片大于1,主分片数越多,相关性算分会越不准
当数据量足够大时侯,只要保证文档均匀分散在各个分片上,结果一般就不会出现偏差
使用DFS Qurery Then Fetch 搜索的URL中指定参数“_search?search_type=dfs_query_then_fetch”
到每个分片把个分片的词频和文档频率进行搜集,然后完整的进行一次相关性算分,耗费更多的CPU和内存,执行性能低下,一般不建议使用
POST message/_doc { "content":"good" } POST message/_doc { "content":"good morning everyone" } POST message/_doc { "content":"good morning" } POST message/_search { "query": { "term": { "content": { "value": "good" } } } } DELETE message PUT message { "settings": { //20个分片算分一样 "number_of_shards": 20 } } GET message POST message/_doc?routing=1 { "content":"good" } POST message/_doc?routing=2 { "content":"good morning" } POST message/_doc?routing=3 { "content":"good morning everyone" } POST message/_search { "explain": true, "query": { "term": { "content": { "value": "good" } } } } //type dfs_query_then_fetch POST message/_search?search_type=dfs_query_then_fetch { "query": { "term": { "content": { "value": "good" } } } } 1.Fielddata
2.Dov Values(列式存储,对Text类型无效)
关闭Dov Values
默认启用,可以通过Mapping设置关闭增加索引的速度/减少磁盘空间
如果重新打开,需要重建索引什么时候需要关闭