Elasticsearch服务器开发(第2版) - 读书笔记 第二章 索引

发布于:2025-08-01 ⋅ 阅读:(18) ⋅ 点赞:(0)

2 索引

2.1 Elasticsearch索引

2.1.1 分片和副本

Elasticsearch索引是由一个或多个分片组成,每个分片包含了文档集的一部分.并且这些分片可以有副本.在创建索引的时候,可以规定应创建的分片和副本的数量. 默认使用的是全局配置文件(elasticsearch.yml)定义的默认值,或者是内部的默认值.

一般情况下,同时具有分片和副本,在建立索引文档时,两者都需要进行修改.因为要使用分片得到精确的副本,Elasticsearch需要将分片的变更通知所有的副本。 如果要读取文件,可以使用分片及其副本。在多节点物理设备中,可以将分片和副本放置不同节点中,从而发挥多节点的处理能力。

  • 更多的分片使索引能传送到更多的服务器,意味着可以处理更多的文件,而不会降低性能
  • 更多的分片意味着获取特定文档所需要的资源量会减少,部署于更少的分片,存储中单个分片中的文件数量更少。
  • 更多的分片意味搜索时会面临更多的问题,因为必须要从更多的分片中合并结果,使得查询的聚合阶段需要更多的资源。
  • 更多的副本会增强集群系统的容错性,因为当原始分片不可用时,其副本将替代分片发挥作用。
  • 更多的分片意味着查询吞吐量会增加,因为查询可以使用分片或者任意副本。

在创建好索引之后,副本的数量可以进行调整,但是分片的数量创建之后就不能改变。

就目前的版本来说,提供了Split API和Shrink API来实现分片数量的成倍增加和减少,最灵活的事Reindex API来重建索引。

2.1.2 创建索引

在我们创建文档的时候,如果没有索引会自动创建,但是这种方式是没有制定分片等配置的。我们可以手动创建索引,并直接指定配置以及索引结构。

PUT /blog

我们也可以关闭索引的自动创建,在elasticsearch.yml中配置下面的命令可以关闭索引自动创建

action.auto_create_index: false

action.auto_create_index 不仅仅可以设置成true和false,还可以设置 字符串 比如值: -an*,+a,-* 会从左到右进行匹配生效,代表 不允许an开头,允许a开头,不允许全部,越靠左越优先,匹配到,不会继续往右匹配了

指定配置

PUT /blog/
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 2
  }
}

创建索引成功之后会有一个分片两个副本,总共3个Lucene索引。

删除索引

DELETE /blog

2.2 配置映射

2.2.1 类型确认机制

Elasticsearch通过定义文档的json来推断文档的结构。如下面的文档

{
  "feild1": 10,
  "feild2": "10"
}

feild1字段会被确认成数字(number,或者说是long类型),但是field2会被确认为字符串。

feild1字段会被确认成数字(number,或者说是long类型),但是field2会被确认为字符串。但是有时候会省略数据类型的相关信息,一切都是字符串。那么我们在映射定义文件中把 numeric_detection属性设置为true,就会开启更积极的文本检测。例如

PUT /blog/
{
  "mappings": {
    "numeric_detection": true
  }
}

但是当我们使用日期的时候,我们可以直接指定可以被识别的日期格式列表,例如

PUT /blog/ 
{
  "mappings": {
    "dynamic_date_formats": ["yyyy-MM-dd", "yyyy-MM-dd hh:mm"]
  }
}

禁用字段类型猜测
在使用类型推断的时候,如果前面文档中类型是数字,会推断出类型为整数型(integer)或长整型(long),当写入另外一个文档的时候,值是浮点数,这个时候Elasticsearch会删除小数部分并且存储剩余整数。很显然这个不是我们希望看到的。另外一个原因,我们并不一定希望中索引中出现新加的字段,这个时候我们就可以关闭自动添加字段。可以把dynamic属性设置为false。把dynamic属性添加为类型的属性。例如

PUT /blog 
{
  "mappings": {
    "dynamic": false,
    "properties": {
      "id": {
        "type": "keyword"
      },
      "content": {
        "type": "text"
      },
      "author": {
        "type": "keyword"
      }
    }
  }
}

创建索引之后,如果在properties部分没有定义的字段就会被Elasticsearch忽略。

2.2.2 索引结构映射

模式映射(schema mapping)用于定义索引结构。我们可以使用文件内容来定义,在创建索引的时候使用,eg,posts.json文件内容

{
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword" 
      },
      "name": {
        "type": "text"
      },
      "published": {
        "type": "date"
      },
      "contents": { 
        "type": "text"
      }
    }
  }
}
  1. 类型定义【已经废弃】

  2. 字段
    完整的单个字段定义如下所示

"contents": { "type":"text", "store":"yes", "index":"analyzed" }

如果包含多个使用逗号进行分割。
3. 核心类型
每个字段可以指定为elasticsearch提供的一个特定核心类型。

  • string: 字符串,已经修改为 keyword和text
  • number:数字
  • date:日期
  • boolean:布尔
  • binary:二进制
  1. 分析器
    下面几种系统自带的
  • standard 标准分析器
  • simple 基于非字母字符进行分割,并且转换成小写
  • whitespace 基于空格进行分词
  • stop 类似simple分析器,还能基于所提供的停用词(stop word)过滤数据
  • keyword 不进行分词
  • pattern 通过使用正则表达式进行分离文本
  • language 在特定的语言环境下工作
  • snowball 类似standard分析器,但是提供了词干提取算法(stemming algorithm)

自定义分析器

{
  "settings": {
    "analysis": {
      "analyzer": {
        "en": {
          "tokenizer": "standard",
          "filter": [
            "asciifolding",
            "lowercase",
            "ourEnglishFilter"
          ]
        }
      },
      "filter": {
        "ourEnglishFilter": {
          "type": "kstem"
        }
      }
    }
  }
}

定义了一个新的分析器en,每个分析器由一个分词器和多个过滤器组成,上面的定义包含standard分词器和三个过滤器,默认的asciifolding、lowercase和自定义的ourEnglishFilter。自定义过滤器需要指明名称、过滤器类型和任意数量的附加参数。

未完,后续不再更新,图书版本太老了,学习官方文档去了,啦啦啦


网站公告

今日签到

点亮在社区的每一天
去签到