ElasticSearch
大约 4 分钟
阅读提示
建议先看题目目录,再按“概念 -> 原理 -> 场景 -> 优化”顺序复习。
每题先讲结论,再补关键机制和项目实践,回答会更稳。
1、ES是什么,为什么要用ES
ES是一个开源的分布式搜索和分析引擎,它被设计用于快速、灵活地搜索和分析大量数据。
- Elasticsearch提供出色的全文搜索能力,适用于需要对大量数据进行高效搜索和查询的应用场景,使用倒排索引技术,能够快速高效地执行文本搜索,支持模糊搜索等。可以用来解决使用数据库进行模糊搜索时存在的性能问题;
- Elasticsearch能够提供实时的搜索和分析结果,适用于对数据的及时性有要求的场景;
- 支持多种数据类型,适用于处理不同结构和格式的数据,使其更灵活和通用;
和Mysql相比:
- 关系型数据库(如 MySQL)在大数据量下查询效率低下, 模糊匹配有可能导致全表扫描。
- MySQL全文索引只支持CHAR,VARCHAR 或者 TEXT 字段类型,不支持分词器。
2、ES索引的构建
Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求。
可以通过RESTful API或相关的客户端库来操作创建索引。
创建索引的请求格式:
- 请求方式:PUT
- 请求路径:/索引库名
- 请求参数:json格式:
{
"settings": { //索引库的设置
"number_of_shards": 3, //分片数量
"number_of_replicas": 2 //副本数量
}
}3、ES为啥查询这么快
- 倒排索引:Elasticsearch使用倒排索引结构,这是一种能够快速定位文档的数据结构。倒排索引通过记录每个词项(terms)出现在哪些文档中来加速搜索。相比于传统的行式数据库存储结构,倒排索引在文本搜索场景中的性能更好。
- 分布式搜索引擎:Elasticsearch是一个分布式系统,可以在多个节点上运行。它将数据分成多个分片,每个分片可以独立运行在不同的节点上。这种分布式架构允许Elasticsearch并行处理查询请求,提高了查询的速度和扩展性。
- 近实时性:Elasticsearch提供近实时性的搜索,在数据变更后,查询操作几乎可以立即看到结果。这得益于Elasticsearch的刷新机制,使得文档变更能够迅速生效。
- 缓存机制:Elasticsearch在查询时使用缓存,包括字段数据缓存、过滤器缓存等。这有助于在相同的查询被重复执行时,避免重新计算相同的结果,提高了查询效率。
- 文档存储格式:Elasticsearch 使用 JSON 格式存储文档,这种结构化的存储方式便于索引和查询。JSON 的灵活性也使得 Elasticsearch 能够轻松处理不同类型的数据。
4、倒排索引
传统的我们的检索是通过文章,逐个遍历找到对应关键词的位置。 而倒排索引,恰恰相反,它是从词出发,记载这个词在哪些文章中存在。
倒排索引的底层实现是基于:FST(Finite State Transducer)数据结构。
lucene 从 4+版本后开始大量使用的数据结构是 FST。FST 有两个优点:
- 空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;
- 查询速度快。
5、ES中的数据和数据库同步的问题
- 同步双写:将数据写到 MySQL 时,同时将数据写到ES。缺点就是性能也比较差,还存在写入失败数据丢失的风险。
- 异步双写:使用MQ异步写入。但是引入了消息中间件,系统复杂性增加。
- 定时扫表:数据库的相关表增加一个字段为 timestamp 的字段,Mysql做正常的增删改操作,然后增加一个定时任务每隔一段时间扫描该表,把这段时间发生变化的数据提取出来写入到es。但是这种方法时效性比较差。
- 基于Binlog实时同步:监听binlog日志,从binlog日志中读取该表的日志信息,家那个变动的信息发送到MQ,然后消费消息写入到es。
