关系型数据库 vs Elasticsearch:
RDBMS | Elasticsearch |
---|---|
Database | Index |
Table | Mapping Type |
Row | Document |
Column | Field |
SQL | DSL |
索引、文档
- 索引:索引是文档的容器,是一类文档的集合
- 文档: ES 是面向文档的,文档是所有可搜索数据的最小单位
创建索引
语法介绍
PUT /<index>
# Query Parameters
wait_for_active_shards
(可选,String) 设置写入成功多少个分片后返回,默认: 1(只写成功主分片)
timeout
(可选,时间单位) 指定超时未响应时间 30s
master_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> // 指定文档ID
POST /<index>/_doc/ // 自动生成文档ID
PUT /<index>/_create/<_id> // 见 op_type
POST /<index>/_create/<_id>
# Query Parameters
op_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) 指定路由字段,默认使用 documentId
timeout
(可选,时间单位) 指定超时未响应时间 30s
master_timeout
(可选,时间单位) master 节点超时时间,默认 30s
wait_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_size
indices.memory.min_index_buffer_size
indices.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 应用宝典》