关系型数据库 vs Elasticsearch:
| RDBMS | Elasticsearch |
|---|---|
| Database | Index |
| Table | Mapping Type |
| Row | Document |
| Column | Field |
| SQL | DSL |
索引、文档
- 索引:索引是文档的容器,是一类文档的集合
- 文档: ES 是面向文档的,文档是所有可搜索数据的最小单位

创建索引
语法介绍
PUT /<index># Query Parameterswait_for_active_shards(可选,String) 设置写入成功多少个分片后返回,默认: 1(只写成功主分片)timeout(可选,时间单位) 指定超时未响应时间 30smaster_timeout(可选,时间单位) master 节点超时时间,默认 30s# Request body
对索引设置分片数:
PUT /<index>{"settings" : {"number_of_shards" : 3,"number_of_replicas" : 2}}
创建包含 field 的 Mapping:
PUT /<index>{"mappings" : {"properties" : {"fieldName" : { "type" : "text" }}}}
设置索引别名:
PUT /<index>{"aliases" : {"alias_1" : {},"alias_2" : {"filter" : { "term" : {"<type>" : "<value>" } },"routing" : "<routeGroup>"}}}
通过API给索引添加别名:
POST /_aliases{"actions" : [{"add" : {"index" : "<index>","alias" : "alias_3","filter" : { "term" : {"<type>" : "<value>" } }}}]}
新增文档
语法介绍:
PUT /<index>/_doc/<_id> // 指定文档IDPOST /<index>/_doc/ // 自动生成文档IDPUT /<index>/_create/<_id> // 见 op_typePOST /<index>/_create/<_id># Query Parametersop_type(可选,enum) Valid values: index, create* index:不存在会创建,存在会更新* create:不存在会创建,存在会创建失败refresh(可选,enum) Valid values: true, false, wait_for (Default: false)* true:实时刷新数据* false:不刷新(Default)* wait_for:等待 es 默认刷新后返回routing(可选,String) 指定路由字段,默认使用 documentIdtimeout(可选,时间单位) 指定超时未响应时间 30smaster_timeout(可选,时间单位) master 节点超时时间,默认 30swait_for_active_shards(可选,String) 设置写入成功多少个分片后返回,默认: 1(只写成功主分片)# Request body<field>(必选,String) Request body 包含文档内容的 JSON 串# 示例POST <index>/_doc/<id>{"name": "张三","age": 22,"sex": 1}
Tips
被弱化的Mapping Type
:::info
- 6.x 版本:同一个Index下可以支持多个Mapping Type
- 7.0 版本之后:同一个Index下仅可以创建一个Mapping Type,一般起名为:_doc
- 原因分析:Elasticsearch官方之所以要删除映射类型的概念,不单纯是因为映射类型容易造成混乱,主要是因为映射类型只是文档在逻辑上的容器,在物理上并没有起到隔离文档的作用。
:::
文档存储不是实时的
:::info 因为文档存储前的分析和索引过程比较耗资源,所以为了提升性能,文档在添加到ES中时并不会立即被编入索引。在默认情况下,ES会每隔1s统一处理一次新加入的文档,可以通过index.refresh_interval参数修改。在ES 7.x中还添加了index.search.idle.after参数,它的默认值是30s
未编入索引的文档会被临时保存到缓冲区中,缓冲区的大小可以通过一些配置参数设置,包括:
indices.memory.index_buffer_sizeindices.memory.min_index_buffer_sizeindices.memory.max_index_buffer_size- 默认情况下,缓冲区最小为48MB且没有上限
总结
ES实际上是准实时的(Near Realtime,NRT)。也就是说,新添加到索引中的文档,有可能在一段时间内不能被检索到。如果的确需要立即检索到文档,ES也提供了强制刷新到索引的方式,包括使用 _refresh 接口和在操作文档时使用 refresh 参数。(但这会对性能造成一定的影响)
:::
参考文章: https://gitbook.cn/books/5e81f2fbfb14aa44b0ea286e/index.html https://gitbook.cn/books/5cf386ddfed1e2779b66ec3d/index.html 参考书籍:《Elastic Stack 应用宝典》
