咱们用ES做日志检索和简单分析,它适用于全文搜索,近实时分析,也能够做为nosql存储(订单的冷库接入ES),须要关注架构,单机的功能(搜索原理,动态索引),性能(索引和数据组织),分布式的可靠性,可扩展,一致性。html
搜索引擎和NoSQL数据库功能,用于全文搜索,结构化搜索,近实时分析[竞品:Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch
]
指南:https://es.xiaoleilu.com/020_...
经常使用:E(存储和索引)L(数据转换和解析Beat采集过来)K(可视化)
逻辑架构图:
Local FileSystem等。存储:索引信息,集群内信息,mapping,transaction log
lucene directory lucene不一样存储层服务发现的抽象,FSDirectory,RAWDirectory 控制索引文件的位置
discovery Zen 服务发现+选主
river:数据源 mq等
memcached协议:get/set/delete/quitnode
节点对等写入和读取。写入只能在P分片而后同步复制到R分片,读写转发到主节点或副本节点
搜索:须要先查询排序再取回排序中想要的数据
其中查询:
1)node3建立from+size优先队列
2)请求转发个每一个分片,每一个分片本身获取from+size本地优先队列
3)返回给node3合并产生全局排序
搜索有两种:基于短语的、全文索引
1)基于短语的:低级查询,没有分析,精确查找(加not_analyzed)
2)match,query_string这种高级查询,会产生短语列表和低级查询结合,获得文档相关度。
Elasticsearch经过下面的步骤执行match查询:sql
GET /my_index/my_type/_search { "query": { "match": { "title": "QUICK!" } } } 1.检查field类型,title字段是一个字符串(analyzed),因此该查询字符串也须要被分析(analyzed) 2.分析查询字符串,查询词QUICK!通过标准分析器的分析后变成单词quick。由于咱们只有一个查询词,所以match查询能够以一种低级别term查询的方式执行。 3.找到匹配的文档 term查询在倒排索引中搜索quick,而且返回包含该词的文档。 4.为每一个文档打分 term查询综合考虑词频(每篇文档title字段包含quick的次数)、逆文档频率(在所有文档中title字段包含quick的次数)、包含quick的字段长度(长度越短越相关)来计算每篇文档的相关性得分_score。 由于match查询须要查询两个关键词:"brown"和"dog",在内部会执行两个term查询并综合两者的结果获得最终的结果。match的实现方式是将两个term查询放入一个bool查询 https://es.xiaoleilu.com/100_Full_Text_Search/05_Match_query.html
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns) Elasticsearch ⇒ 索引(=》分片=》segment) ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)
动态索引、近实时索引: 数据库
Luence per-segment search 索引:段的集合+提交点(包含全部段的文件)缓存
1.当一个文档被索引,它被加入到内存缓存,同时加到事务日志。 2.refresh使得分片的进入以下图描述的状态。每秒分片都进行refeash: 内存缓冲区的文档写入到段中,但没有fsync。 段被打开,使得新的文档能够搜索。 缓存被清除 3.随着更多的文档加入到缓存区,写入日志,这个过程会继续 4.不时地,好比日志很大了,新的日志会建立,会进行一次全提交: 内存缓存区的全部文档会写入到新段中。 清除缓存 一个提交点写入硬盘 文件系统缓存经过fsync操做flush到硬盘 事务日志被清除