关系型数据库 vs Elasticsearch:

RDBMS Elasticsearch
Database Index
Table Mapping Type
Row Document
Column Field
SQL DSL

索引、文档

  • 索引:索引是文档的容器,是一类文档的集合
  • 文档: ES 是面向文档的,文档是所有可搜索数据的最小单位

ES基本概念 - 图1

创建索引

语法介绍

  1. PUT /<index>
  2. # Query Parameters
  3. wait_for_active_shards
  4. (可选,String) 设置写入成功多少个分片后返回,默认: 1(只写成功主分片)
  5. timeout
  6. (可选,时间单位) 指定超时未响应时间 30s
  7. master_timeout
  8. (可选,时间单位) master 节点超时时间,默认 30s
  9. # Request body

对索引设置分片数:

  1. PUT /<index>
  2. {
  3. "settings" : {
  4. "number_of_shards" : 3,
  5. "number_of_replicas" : 2
  6. }
  7. }

创建包含 field 的 Mapping:

  1. PUT /<index>
  2. {
  3. "mappings" : {
  4. "properties" : {
  5. "fieldName" : { "type" : "text" }
  6. }
  7. }
  8. }

设置索引别名:

  1. PUT /<index>
  2. {
  3. "aliases" : {
  4. "alias_1" : {},
  5. "alias_2" : {
  6. "filter" : { "term" : {"<type>" : "<value>" } },
  7. "routing" : "<routeGroup>"
  8. }
  9. }
  10. }

通过API给索引添加别名:

  1. POST /_aliases
  2. {
  3. "actions" : [
  4. {
  5. "add" : {
  6. "index" : "<index>",
  7. "alias" : "alias_3",
  8. "filter" : { "term" : {"<type>" : "<value>" } }
  9. }
  10. }
  11. ]
  12. }

新增文档

语法介绍:

  1. PUT /<index>/_doc/<_id> // 指定文档ID
  2. POST /<index>/_doc/ // 自动生成文档ID
  3. PUT /<index>/_create/<_id> // 见 op_type
  4. POST /<index>/_create/<_id>
  5. # Query Parameters
  6. op_type
  7. (可选,enum) Valid values: index, create
  8. * index:不存在会创建,存在会更新
  9. * create:不存在会创建,存在会创建失败
  10. refresh
  11. (可选,enum) Valid values: true, false, wait_for Default: false
  12. * true:实时刷新数据
  13. * false:不刷新(Default
  14. * wait_for:等待 es 默认刷新后返回
  15. routing
  16. (可选,String) 指定路由字段,默认使用 documentId
  17. timeout
  18. (可选,时间单位) 指定超时未响应时间 30s
  19. master_timeout
  20. (可选,时间单位) master 节点超时时间,默认 30s
  21. wait_for_active_shards
  22. (可选,String) 设置写入成功多少个分片后返回,默认: 1(只写成功主分片)
  23. # Request body
  24. <field>
  25. (必选,String) Request body 包含文档内容的 JSON
  26. # 示例
  27. POST <index>/_doc/<id>
  28. {
  29. "name": "张三",
  30. "age": 22,
  31. "sex": 1
  32. }

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 应用宝典》