2022 flag 150篇文章 - 63 - ES - elastic search

elastic search 是一个分布式搜索和数据分析引擎,基于lucene构建;

由一个或多个具有相同cluster.name的节点组成集群;分片:ES可以把一个大的索引分成多个分片;副本:索引的副本,提高容错性;

集群 

  - 索引

    - 分片 

  - 副本

ES 默认会为每个索引创建5个分片; 

 - 集群

- 节点

 - 索引 (与mysql的数据库实例相当,索引只是一个逻辑命名空间,指向一个或多个分片)

   - 文档类型(相当于数据库中表的概念) 

   - 文档 (相当于数据库表的row)

   - mapping 

   - 分片

 

 ES查询快的原因: 集群、分片、副本

 在索引创建的时候, 确定主分片;路由算法:shard = hash(routing) % number_of_primary_shards

数据写入过程 

 数据写入到主分片, 然后同步到全部副本分片;

数据查询过程 

 1.查询请求发送到协调节点,协调节点把请求转发到全部分片; 

 2. 全部分片把查询结果(包含doc_id,排序值)返回到协调节点;协调节点合并、排序、分页;

 3. 协调节点根据doc_id从各个分片获取实际数据并返回给客户端;

数据更新或删除? 
删除:在提交的时候生成一个.del文件,把doc文档的状态更新为删除; 

更新:doc文档的状态更新为删除; 再写新的doc; buffer每refresh一次,生成一个segment file. 要定期merge

ES的查询有2种;一种是query(计算每个文档得分、并排序), 一种是filter(仅过滤符合条件的数据并缓存);

bool查询 : must ,出现于查询结果中;filter,必须满足才出现;must_not:满足条件的数据不出现;

查询:指定索引 , 条件查询: term(精确查询)、range(范围查询),terms(多值匹配),match(分词查询)、ids(); exits(包含某个字段)、missing(不包含)

"ids": {
"type": "news",
"values": "2101"
}

分页滚动查询 scroll

"scroll":"1m",
"scroll_id":"DnF1ZXJ5VGhlbkZldGNoAwAAAAAAADShFmpBMjJJY2F2U242RFU5UlAzUzA4YXZTbjZEVTlSUDNTMDgxZw=="

sort , 排序 

"sort":[
  {"user_id":{"order":"asc"}},
  {"salary":{"order":"desc"}}
]

aggs,聚合

max,min, avg, sum, stats, terms(分组查询), cardina

size设置为0,返回聚合结果。

 

posted @ 2022-02-20 20:57  路途遥远  阅读(32)  评论(0编辑  收藏  举报