1. 索引

1.1. 相关概念

1.1.1. 索引(名词)

如上文所述,一个索引(index)就像是传统关系数据库中的数据库,它是相关文档存储的地方,index的复数是indices 或indexes。

1.1.2. 索引(动词)

「索引一个文档」表示把一个文档存储到索引(名词)里,以便它可以被检索或者查询。这很像SQL中的INSERT关键字,差别是,如果文档已经存在,新的文档将覆盖旧的文档。

1.1.3. 倒排索引

传统数据库为特定列增加一个索引,例如B-Tree索引来加速检索。Elasticsearch和Lucene使用一种叫做倒排索引(inverted index)的数据结构来达到相同目的。

1.1.4. 什么是索引(名词)

索引是一个用来指向一个或多个分片的“逻辑命名空间”。

1.2. 索引详解

1.2.1. 什么是分片

分片是存储数据的容器, 数据在ElasticSearch中以 文档的概念存储在分片中,分片再分配在集群内。 分片可以分为主分片(primary key)复制分片(replica shard)

主分片

  1. 每个文档都被分派到索引下的某个主分片内。
  2. 当索引创建完成时,主分片的数量就固定了。
  3. 主分片的大小理论上是无限制的。
  4. 所有的写操作只能在主分片上完成后才能复制到其他分片上,写操作包括新建,索引,更新,删除。

    复制分片

  5. 复制分片是主分片的副本,用以防止硬件故障导致的数据丢失。
  6. 复制分片可以提供读操作,比如搜索或从别的shared取回文档。
  7. 复制分片可以支持横向拓展。

1.2.2. 索引结构

{
  "cnvd" | {
    "aliases" | { },
    "mappings" | {
      "_meta" | {
        "created_by" | "ml-file-data-visualizer"
      },
      "properties" | {
        "@timestamp" | {
          "type" | "date"
        }
      }
    },
    "settings" | {
      "index" | {
        "creation_date" | "1572342942096",
        "number_of_shards" | "1",
        "number_of_replicas" | "1",
        "uuid" | "ICZ5MKHwRU6bHvd6c7JoMg",
        "version" | {
          "created" | "7040099"
        },
        "provided_name" | "cnvd"
      }
    }
  }
}

如上所示的json对象,索引的结构主要由 别名(aliases), 映射(mappings), 设置(settings)组成。

别名 aliases

别名使用场景
  1. 有结构不同且不相干的索引库CNVD,CNNVD,需要查包含 “赛欧思漏洞”的所有数据。
  2. 数据按周存储到如2019-10-4的数据库中,如何固定访问路由 GET /current-week 去当前周的索引库中检索数据。
  3. 假设索引库存在字段 unit,每次删查改仅涉及到unit为zzedu但数据时,快捷查询。
    别名功能
  4. 给多个索引分组。
  5. 在运行的集群中可以无缝的从一个索引切换到另一个索引。
  6. 给索引的一个子集创建视图。
    别名用法
    Elasticsearch 中有两种方式管理别名: _alias 用于单个操作, _aliases 用于执行多个原子级操作。
    添加索引别名:
    POST /_aliases
    {
     "actions" | [
         { "add" | { "index" | "test1", "alias" | "alias1" } }
     ]
    }
    
    删除索引别名:
    POST /_aliases
    {
     "actions" | [
         { "remove" | { "index" | "test1", "alias" | "alias1" } }
     ]
    }
    
    重命名索引别名:
    POST /_aliases
    {
     "actions" | [
         { "remove" | { "index" | "test1", "alias" | "alias1" } },
         { "add" | { "index" | "test2", "alias" | "alias1" } }
     ]
    }
    
    别名关联多个索引:
    POST /_aliases
    {
     "actions" | [
         { "add" | { "index" | "test1", "alias" | "alias1" } },
         { "add" | { "index" | "test2", "alias" | "alias1" } }
     ]
    }
    
    亦可以通过索引数组的方式来实现
    POST /_aliases
    {
     "actions" | [
         { "add" | { "indices" | ["test1", "test2"], "alias" | "alias1" } }
     ]
    }
    
    简单的过滤用别名:
    假设索引库内存在字段user。
    POST /_aliases
    {
     "actions" | [
         {
             "add" | {
                  "index" | "test1",
                  "alias" | "alias2",
                  "filter" | { "term" | { "user" | "kimchy" } }
             }
         }
     ]
    }
    
    带路由routing的别名
    此功能只有在mappings中指定了路由之后才能使用。

可在别名定义中指定路由值,可和filter一起使用,用来限定操作的分片,避免不需要的其他分片操作。

 POST /_aliases
{
    "actions" | [
        {
            "add" | {
                 "index" | "test",
                 "alias" | "alias1",
                 "routing" | "1"
                }
            }
        ]
    }

为搜索、索引指定不同的路由值

POST /_aliases
{
    "actions" | [
            {
            "add" | {
                 "index" | "test",
                 "alias" | "alias2",
                 "search_routing" | "1,2",
                 "index_routing" | "2"
                }
            }
        ]
    }

映射 mappings

mappings相关概念
  1. mappings类似与关系型数据库中的表结构,在其中定义了字段及其类型。
  2. 如果需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping。
映射支持的类型

官方7.4类型介绍

JSON基础类型
类型名称 类型
字符串 text、keyword
数字 byte、short、integer、long、float、double
时间 date
布尔值 true、false
数组 array
对象 object
Elasticsearch独有的类型
类型名称 类型
多重 multi
经纬度 geo_point
网络地址 ip
堆叠对象 nested object
二进制 binary
附件 attachment
复合类型
类型说明 类型
数组类型 没有明显的字段类型设置,任何一个字段的值,都可以被添加0个到多个,要求,他们的类型必须一致
对象类型 存储类似json具有层级的数据
嵌套类型 支持数组类型的对象Aarray[Object],可层层嵌套
地理类型
类型名称 类型说明
geo-point类型 支持经纬度存储和距离范围检索
geo-shape类型 支持任意图形范围的检索,例如矩形和平面多边形
专用类型 ipv4类型:

用来存储IP地址,es内部会转换成long存储

类型名称 类型说明
completion类型 使用fst有限状态机来提供suggest前缀查询功能
token_count类型 提供token级别的计数功能
mapper-murmur3类型 安装sudo bin/plugin install mapper-size插件,可支持_size统计_source数据的大小
映射类型
类型名称 类型说明
analyzed 默认选项,以标准的全文索引方式,分析字符串,完成索引
not_analyzed 精确索引,不对字符串做分析,直接索引字段数据的精确内容
no 不索引该字段
动态映射

ElasticSearch中不需要事先定义映射(Mapping),文档写入ElasticSearch时,根据文档字段自动识别类型,这种机制称之为动态映射。

静态映射

在ElasticSearch中事先定义好映射,包含文档的各个字段及其类型等,这种方式称之为静态映射。

值得关注的点
字符型选 text 还是 keyword

text 用于检索全文:

特点:存储时自动分词,此类型常用于无需排序,极少聚合的文本信息。
适用场景示例:用于正文或描述,文本存储时将会自动分词,转化为单个术语的列表。

keyword 用于检索结构化文本:

特点:存储时不会分词,常用于需过滤,排序,聚合的文本信息; keyword字段只能通过确切值进行索引。
适用场景示例:电子邮件地址,主机名,状态代码,邮政编码或标签
部分字段是空值该如何搜索

mappings中有个参数是null_value 当一个字段是null值时,不可被索引或搜索。

"empty_value": " " , null_value” :null ,“ empty_array” :[],“ array_with_null_value” :[ null ]

null_value参数可以在值为空时,被显示替换为具体值,如“NULL”。实际搜索时,可以通过检索 NULL查出指定值为空的所有数据。

数组类型字段

设置 settings

设置settings的功能是定义分片。官方文档 简单用法: 修改分片和副本数:

PUT  /my_index
{
   "number_of_replicas":0,  # 主分片
   "number_of_shards":1  # 副本数
}

results matching ""

    No results matching ""

    results matching ""

      No results matching ""