认识 elasticsearch
1,索引
一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices 或indexes
2,文档
索引一个文档表示把一个文档存储到索引里,以便它可以被检索或者查询。如果文档已经存在,新的文档将覆盖旧的文档。
一个文档不只有数据。它还包含了元数据(metadata)——关于文档的信息。三个必须的元数据节点是:
_index :索引(index)类似于关系型数据库里的“数据库”——它是我们存储和索引关联数据的地方
_type: 文档代表的对象的类。
_id: id仅仅是一个字符串,它与_index和_type组合时,就可以在Elasticsearch中唯一标识一个文档。当创建一个文档,你可以自定义_id,也可以让Elasticsearch帮你自动生成。
文档相关性评分,用一个相对的浮点数字段 _score 来表示 — _score 的评分越高,相关性越高。
3,倒排索引
Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的位置组成。
例如: 文档:
0. One shoe, two shoe, the red shoe, the blue shoe.
1. The blue dress shoe is the best shoe.
2. The best dress is the one red dress.
上面的文档集合,其词典和倒排表:
词典:给定字段在一个文档集合中出现的所有词汇所组成的有序列表
倒排表:记录了出现过某个单词的所有文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。
4,分析器 (包含过滤器,分词器)
首先,标记化一个文本块为适用于倒排索引单独的词(term)
然后标准化这些词为标准形式,提高它们的“可搜索性”或“查全率”
这个工作是分析器(analyzer)完成的。一个分析器(analyzer)只是一个包装用于将三个功能放到一个包里。
这里可以自行了解插件ik-smart分词器,拼音分词器。具体不在阐述。
5,ES 分布式集群:
Elasticsearch用于构建高可用和可扩展的系统。扩展的方式可以是购买更好的服务器(纵向扩展)或者购买更多的服务器(横向扩展)。
一个节点(node)就是一个Elasticsearch实例,而一个集群(cluster)由一个或多个节点组成,它们具有相同的cluster.name,它们协同工作,分享数据和负载。当加入新的节点或者删除一个节点时,集群就会感知到并平衡数据。
集群中一个节点会被选举为主节点(master),它将临时管理集群级别的一些变更,例如新建或删除索引、增加或移除节点等。 任何节点都可以成为主节点。
我们能够与集群中的任何节点通信,包括主节点。每一个节点都知道文档存在于哪个节点上,它们可以转发请求到相应的节点上。我们访问的节点负责收集各节点返回的数据,最后一起返回给客户端。这一切都由Elasticsearch处理。
6,集群分片:
分片是Elasticsearch在集群中分发数据的关键。把分片想象成数据的容器。文档存储在分片中,然后分片分配到你集群中的节点上。当你的集群扩容或缩小,Elasticsearch将会自动在你的节点间迁移分片,以使集群保持平衡。
7,mapping 设计
Indices --> Types----> Documents---->Fields
对比DB
Databases–>tables—>Rows---->Columns
mapping 作用是 定义映射 某字段是否存储,用哪种分词器,重要级别。
介绍到此 , 都是名词解释, 网上也很容易找到。
设计方案:
按照10亿数据来估算,数据库为64分库, 这样我们可以基本设置 Elasticsearch Cluster 部署3节点,1 Master,2 Slave ,64索引, 6分片 ,1副本, 索引路由为 ID, 以后需要扩展的话 可以扩展分片副本数。
分片数据量估算(某业务10亿数据为例):10*10000/64/6 = 260万
手动方案:
spring boot micro service -----> search Platfrom(双节点) -----> Elasticsearch Cluster (3 node) .
自动方案:
spring boot micro service -----> mysql cluster -----> canal client ---------->MQ-------> Async(Thread pool) ----> search Platfrom(双节点) -----> Elasticsearch Cluster (3 node)
Elasticsearch Cluster : 索引维护,搜索
search Platfrom : 封装Elasticsearch client 操作接口, 供其他服务调用。
canal : 将mysql 数据库变动发给MQ 。
Elasticsearch Cluster 与 canal 请自行 按照网上 安装。
我们今天 聊聊 search Platfrom —使用 官方elasticsearch-rest-high-level-client
//代码省略
我这里使用的是Elasticsearch 6.x, 一个 index 下只能存在一个 type
而 Elasticsearch 7.x 移除 type的概念, 可以使用_doc 代替, 其实我们这里不影响 只是区别 一下。
批量更新文档与批量添加文档 and 删除文档与 删除索引 我就不列了, 使用 API 很好解决 。。。。
一样可以 暴露为 rest 接口 供其他调用。
mQueryFilter.doQueryFilter 这是一个过滤器。
通过这个来过滤搜索的结果,
我们这里使用聚合查询: 例如 BoolQueryBuilder 为 bool 查询,match查询 等 。
例如 这里mQueryFilter.doQueryFilter 很简单的 ID 过滤查询:
关于查询过滤 有很多, 这里只是举例 ID, 其他查询类型 请参考官方。。。。
总结:
elasticsearch分布式实时文件存储,可将每一个字段存入索引,使其可以被检索到。
分布式:索引分拆成多个分片,每个分片可有零个或多个副本。集群中的每个数据节点都可承载一个或多个分片,并且协调和处理各种操作;
而且可以扩展到上百台服务器。
支持插件机制,分词插件,同步插件,可视化插件kibana等