简介
Elasticsearch 是一款稳定高效的分布式搜索和分析引擎,它的底层基于 Lucene,并提供了友好的 RESTful API 来对数据进行操作,还有比较重要的一点是,Elasticsearch 开箱即可用,上手也比较容易。目前 Elasticsearch 在搭建企业级搜索(如日志搜索、商品搜索等)平台中很广泛,官网也提供了不少案例,比如:
- GitHub 使用 Elasticsearch 检索超过 800 万的代码库
- eBay 使用 Elasticsearch 搜索海量的商品数据
- Netflix 使用 Elasticsearch 来实现高效的消息传递系统
概念知识
基础数据类型
ES的数据结构和Mysql等关系型数据库的结构可以对应起来的:
- Index:这里的Index是名词,一个Index就像是传统关系数据库的 Database,它是Elasticsearch用来存储数据的逻辑区域
- Document:Elasticsearch使用JSON文档来表示一个对象,就像是关系数据库中一个Table中的一行数据
- Type:文档归属于一种Type,就像是关系数据库中的一个Table
- Field:每个文档包含多个字段,类似关系数据库中一个Table的列
文档
通常情况下,我们使用的术语 `对象` 和 `文档` 是可以互相替换的。不过,有一个区别: 一个对象仅仅是类似于 hash 、 hashmap 、字典或者关联数组的 JSON 对象,对象中也可以嵌套其他的对象。 对象可能包含了另外一些对象。在 Elasticsearch 中,术语 文档 有着特定的含义。它是指最顶层或者根对象, 这个根对象被序列化成 JSON 并存储到 Elasticsearch 中,指定了唯一 ID。
文档元数据
- _index 文档存储的地方
- _type 文档代表的对象的类(7.x的版本将去掉_type)
- _id 文档的唯一标识。可手动设置也可自动生成(22位长)
冲突解决
- 悲观并发控制
- 这种方法被关系型数据库广泛使用,它假定有变更冲突可能发生,因此阻塞访问资源以防止冲突。 一个典型的例子是读取一行数据之前先将其锁住,确保只有放置锁的线程能够对这行数据进行修改。
- 乐观并发控制
- Elasticsearch 中使用的这种方法假定冲突是不可能发生的,并且不会阻塞正在尝试的操作。 然而,如果源数据在读写当中被修改,更新将会失败。应用程序接下来将决定该如何解决冲突。 例如,可以重试更新、使用新的数据、或者将相关情况报告给用户。