文章目录
资料收集
公司组件文档
公司ES组件介绍:包含最佳实践案例、SDK API介绍、多机房容灾部署、ES平台架构等,协助公司开发迅速使用。
基础概念与原理
概念入门
很赞很细有实例的一篇文章:
搜索引擎原理以及ES原理漫画讲解
ES入门教程
全部是最基本的操作,有个感觉。
一、安装教程
二、基本概念
注意点:
- Elastic 会索引所有字段,经过处理后写入一个反向索引(Inverted Index)。查找数据的时候,直接查找该索引。
所以,Elastic 数据管理的顶层单位就叫做 Index(索引)。它是单个数据库的同义词。每个 Index (即数据库)的名字必须是小写。 - Document 可以分组,比如weather这个 Index 里面,可以按城市分组(北京和上海),也可以按气候分组(晴天和雨天)。这种分组就叫做 Type,它是虚拟的逻辑分组,用来过滤 Document。不同的 Type 应该有相似的结构(schema)。
三、基础命令(第三、五、六部分)
1,CRUD Index、Type、Document(row)等:这部分大多数是在数据同步时候使用。
2,业务上对ES的使用主要集中在查询中
底层调用命令是种crul执行的,类似于rest api的方式与ES进行交互。
四、中文分词设置
不同组件有不同分词断句的算法
Elasticsearch概念与MySQL对应
- 单个 Elastic 实例称为一个节点(node)。一组节点构成一个集群(cluster)。
- MySQL 中一个数据库下面有 N 张表(Table),等价于1个索引 Index 下面有 N 多类型(Type)。
- MySQL 中一个数据库表(Table)下的数据由多行(Row)多列(column,属性)组成,等价于1个 Type 由多个文档(Document)和多 Field 组成。
- MySQL 中定义表结构、设定字段类型等价于 ES 中的 Mapping。举例说明,在一个关系型数据库里面,Schema 定义了表、每个表的字段,还有表和字段之间的关系。与之对应的,在 ES 中,Mapping 定义索引下的 Type 的字段处理规则,即索引如何建立、索引类型、是否保存原始索引 JSON 文档、是否压缩原始 JSON 文档、是否需要分词处理、如何进行分词处理等。
- MySQL 中的增 insert、删 delete、改 update、查 search 操作等价于 ES 中的增 PUT/POST、删 Delete、改 _update、查 GET。其中的修改指定条件的更新 update 等价于 ES 中的 update_by_query,指定条件的删除等价于 ES 中的 delete_by_query。
- MySQL 中的 group by、avg、sum 等函数类似于 ES 中的 Aggregations 的部分特性。
- MySQL 中的去重 distinct 类似 ES 中的 cardinality 操作。
- MySQL 中的数据迁移等价于 ES 中的 reindex 操作。
倒排索引
与索引表的概念某种程度上是相通的。
搜索引擎原理以及ES原理漫画讲解
倒排索引原理与一个实例:倒排索引通用概念以及一个倒排索引文档建立的例子,ES的实现不是用文中最后介绍的方法实现的。
倒排索引介绍文档
ES聚焦在倒排索引数据结构的优化,引入了字典树优化term dictionary,使用FST压缩term dictionary,通过roaring bitmaps优化posting list、通过跳表 + bitset完成联合索引的查询优化。
ES对倒排索引的优化
字典树优化:1,便于字段查找。2,减少磁盘存储空间。
scroll与scan理解
scroll存在的原因与API最简demo
在默认情况下,ES查询每次返回的数量最多只有1W条,且只能是前1W条.
这意味着,在不修改配置的情况下,想通过分页的方式(如下)拿到1W条之后的数据是做不到的
scroll与scan结合的demo
scroll本身有排序的步骤,如果对于接口的时序性没有要求的话,加上scan。只是拉取命中的结果,但是不会去进行排序操作。
最佳实践文章
API
Elasticsearch Java Rest Client API 整理总结 (一)——Document API
RestClientBuilder设置详解:setHttpClientConfigCallback设置超时、线程数、基本认证、加密通信、嗅探器sniff等设置。
Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
Java QueryBuilders常见用法:常见几种query的实例demo
操作中的相关概念:
must、should、must_not
client demo
public EsClient(CommonEsProperties esProperties) {
this.esProperties = esProperties;
buildClient(esProperties);
}
private void buildClient(CommonEsProperties properties) {
IOReactorConfig reactorConfig = IOReactorConfig.custom()
.setConnectTimeout(6000)
.setSoTimeout(6000).build();
RestClientBuilder restClientBuilder = RestClient
.builder(psm, NodeTypeEnum.DATA)
.setRequestConfigCallback(builder -> {
builder.setSocketTimeout(6000);
builder.setConnectTimeout(6000);
builder.setConnectionRequestTimeout(6000);
return builder;
}).setHttpClientConfigCallback(config ->
config.setKeepAliveStrategy((response, context) -> 30000)
.setDefaultIOReactorConfig(reactorConfig)
.setMaxConnPerRoute(8)
.setMaxConnTotal(32)
);
RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder);
RestClient lowLevelClient = restHighLevelClient.getLowLevelClient()
.setTraceIdGenerator(IdUtil::getId)
.setMetricsPrefix("");
this.restHighLevelClient = restHighLevelClient;
this.sniffer = Sniffer.builder(lowLevelClient)
.setSniffIntervalMillis(30000)
.build();
}
search demo
待续
读从库demo
待续
MySQL同步ES
数据一致性问题主流解决方案
非常好的讲解一致性问题的帖子:
MySQL与ES之间的数据一致性问题
MySQL 数据实时同步到 Elasticsearch 的技术方案选型和思考
分不清谁是原创。。。
总结:
- MySQL数据库资源非常宝贵,希望DB的操作尽可能集中在复杂的CUD上,复杂的查询操作借助于ES进行实现。因此会引出一致性的问题,即DB的更新是否能立即同步到ES上。
主流的方式:数据迁移同步工具。 - 数据库去规范化对于快捷查询的好处:通过字段冗余,避免多个表之间的联合查询。也避免同步时要更新多个表。
主要内容:1,去规范化的动机。2,去规范化的几种方式(主查询表列冗余、宽表预构建/应用多写/物化视图/数据迁移同步工具)。
其中,物化视图的介绍帖子:数据库view与物化视图 - 主要的数据迁移同步模型:订阅消费模式、端到端直连模式
- 同步存在的问题:ES设计(类型选择:objected(全部扁平化的问题)、nested(保持一定的关联关系,牺牲部分写入性能)、join(影响搜索性能))。
join 适合写多读少场景,更加适合关注索引性能的场景。这意味着更新的生效会更快,但是搜索时的开销也相对大些;nested 适合读多写少的场景,保持一定关联关系的同时更加关注搜索的性能。 - MySQL 到 ES 实时数据同步实现去规范化,推荐方式:多表订阅合并预构建宽表数据
- 数据迁移同步工具选型
其他(TODO)
待学习与搜索内容:ELK框架
- Kibana 是为 Elasticsearch 集群上的內容提供了友好的 Web 界面,可以帮助你汇总、分析和搜索重要数据。
- ES读写数据过程
- 23个最有用的ES检索技巧(Java API实现)