type
status
date
slug
summary
tags
category
icon
password

1、简介

索引配置(Settings) 定义了分片数量及副本数量等相关的配置信息。可以通过下面方式定义 settings
索引的配置也分为静态配置和动态配置
  • 静态配置:必须在创建映射时写入settings。
  • 动态配置:既可以在settings中设置,也可以在创建映射后调用REST服务进行修改。

1.1 索引静态配置

静态配置即索引创建后不能修改。常用项如下:
  • number_of_shards :主分片数,默认为 5。只能在创建索引时设置,不能修改
  • analysis:设置自定义分词器
  • shard.check_on_startup :是否在索引打开前检查分片是否损坏,当检查到分片损坏将禁止分片被打开
  • 可选值:false:不检测;checksum:只检查物理结构;true:检查物理和逻辑损坏,相对比较耗CPU;fix:类同与false,7.0版本后将废弃。默认值:false。
  • codec:数据存储的压缩算法,默认算法为 LZ4,也可以设置成best_compression,best_compression压缩比较好,但存储性能比LZ4差
  • routing_partition_size :路由分区数,默认为 1,只能在索引创建时设置。此值必须小于index.number_of_shards,如果设置了该参数,其路由算法为: (hash(routing) + hash(id) % index.routing_parttion_size ) % number_of_shards。如果该值不设置,则路由算法为 hash(routing) % number_of_shardings,routing默认值为_id。

1.2 索引动态配置

动态配置可以在运行时进行配置修改。常用项如下:
  • number_of_replicas :每个主分片的副本数,默认为 1,该值必须大于等于0
  • auto_expand_replicas :基于可用节点的数量自动分配副本数量,默认为 false(即禁用此功能)
  • refresh_interval :执行刷新操作的频率,这使得索引的最近更改可以被搜索。默认为 1s。可以设置为 -1 以禁用刷新。
  • max_result_window :用于索引搜索的 from+size 的最大值。默认为 10000
  • max_rescore_window : 在搜索此索引中 rescore 的 window_size 的最大值
  • blocks.read_only :设置为 true 使索引和索引元数据为只读,false 为允许写入和元数据更改。
  • blocks.read_only_allow_delete:与blocks.read_only基本类似,唯一的区别是允许删除动作。
  • blocks.read :设置为 true 可禁用对索引的读取操作
  • blocks.write :设置为 true 可禁用对索引的写入操作。
  • blocks.metadata :设置为 true 可禁用索引元数据的读取和写入。
  • max_refresh_listeners :索引的每个分片上可用的最大刷新侦听器数
  • max_docvalue_fields_search:一次查询最多包含开启 doc_values 字段的个数,默认为100。

2、文本分析

2.1 文本分析的原理

Elasticsearch规定,一个完整的文本分析过程需要经过大于等于零个字符过滤器、一个分词器、大于等于零个分词过滤器的处理过程。文本分析的顺序是先进行字符过滤器的处理,然后是分词器的处理,最后是分词过滤器的处理。相关说明如下:
  • 字符过滤器(Character Filters):用于对原始文本做简单的字符过滤和转换,例如,Elasticsearch内置的HTML strip字符过滤器可以用于方便地剔除文本中的HTML标签。
  • 分词器(Tokenizer):分词器的功能就是把原始的文本按照一定的规则切分成一个个单词,对于中文文本而言分词的效果和中文分词器的类型有关。分词器还会保留每个关键词在原始文本中出现的位置数据。Elasticsearch内置的分词器有几十种,通常针对不同语言的文本需要使用不同的分词器,你也可以安装一些第三方的分词器来扩展分词的功能。
  • 分词过滤器(Token Filters):用于对用分词器切词后的单词做进一步过滤和转换,例如,停用词分词过滤器(stop token filter)可以把分词器切分出来的冠词a、介词of等无实际意义的单词直接丢弃,避免它们影响搜索结果。
notion image
上面这个图展示了 analysis(文本分析)的过程。analysis 通过 analyzer(分词器)来完成,而 analyzer 在索引配置 settings 里面设置。下面介绍如何使用分析器。

2.2 使用分析器

使用分析器有三种方式:
  • 定义索引 settings 的时候指定默认分析器。
  • 定义字段属性的时候指定分析器。
  • 可以直接调用分词器 API 对现成的文本进行分词,一般用于调试。

2.2.1 定义索引 settings 的时候指定分析器

分析器(analyzer)属于静态配置,只能在创建索引的时候定义。这里设置的分析器相当于索引的默认分析器,索引新增字段的时候如果没有显式设置分析器,就会使用默认分析器。
我们可以使用内置分词器或者第三方分词器,也可以使用自定义的 char_filter、tokenizer、filter 来自由组合。下面介绍几种使用场景
1、使用内置的分析器。这里使用内置的分词器 simple。
2、自定义分析器。我们也可以自定义分词器组件 char_filter、tokenizer、filter 的内容,这种方式更加灵活。例如,你可以定义一个分析器,使用字符过滤器过滤掉 HTML 标签,用标准分词器把文本、单词和数字切分到最细粒度,同时添加一个停用词黑名单过滤掉无意义的中文文本,代码如下

2.2.2 定义字段属性的时候指定分析器

如果我们不想用索引默认的分析器,可以在新增字段的时候显式指定分析器。例如下面全局默认分析器为 simple,但是 title 字段指定使用 whitespace 分析器。

2.2.3 使用分析器 API 分析文本

可以使用 _analyze 的 REST 端点测试分析器的分词效果,这种方式适用于本地调试。有以下三种使用方式:
  • 指定内置分析器分析文本
    • 使用索引字段的分析器分析文本
      • 自定义分析器组件进行文本分析

        3、内置分析器

        Elasticsearch 内置了8种分析器,可以直接使用它们。这些分析器有不同的使用效果,具体内容如图所示。
        notion image

        3.1 Standard Analyzer

        默认的分词器,它会对输入的文本按词的方式进行切分,切分好以后会进行转小写处理,默认的 stopwords 是关闭的。
        notion image

        3.2 Simple Analyzer

        只包括了 Lower Case 的 Tokenizer,它会按照非字母切分,非字母的会被去除,最后对切分好的做转小写处理,然后接着用刚才的输入文本,分词器换成 simple 来进行分词。
        notion image

        3.3 Stop Analyzer

        由 Lowe Case 的 Tokenizer 和 Stop 的 Token Filters 组成的,相较于刚才提到的 Simple Analyzer,多了 stop 过滤,stop 就是会把 the,a,is 等修饰词去除。
        notion image

        3.4 Whitespace Analyzer

        按照空格切分,不转小写
        notion image

        3.5 Keyword Analyzer

        不分词,直接将输入当做输出
        notion image

        3.6 Pattern Analyzer

        通过正则表达式的方式进行分词,默认是用 \W+ 进行分割的,也就是非字母的符合进行切分的,运行结果和 Stamdard Analyzer 一致。
        notion image

        4、IK 分词器

        在使用 Elasticsearch 进行搜索中文时,Elasticsearch 内置的分词器会将所有的汉字切分为单个字,对用国内习惯的一些形容词、常见名字等则无法优雅的处理,此时就需要用到一些开源的分词器。IK 分词器是业务中普遍采用的中文分词器。

        4.1 安装 IK 分词器

        1. 下载插件,注意要下载和使用的Elasticsearch 匹配的版本,否则会启动报错。
        1. 在 Elasticsearch 的安装目录的 Plugins 目录下新建 ik 文件夹,然后将下载的安装包解压到此目录下。
        1. 重启 Elasticsearch。

        4.2 使用 IK 分词器

        IK 分词器包含 ik_smart 以及 ik_max_word 两种分词器
        • ik_smart:分词器颗粒度较粗,满足分词场景要求不高的业务
        • ik_max_word:分词颗粒度小,满足业务场景更丰富
        通常,索引时的文本分析使用 ik_max_word 更加合适,而全文检索时的文本分析使用 ik_smart 较为多见。值得注意的是,每个分词结果用偏移量保存了每个分词在原始文本中出现的位置,这类位置信息在全文检索结果高亮展示时会被用到。
        另外,IK分词器虽然能够识别很多中文词,但是它无法自动发现新词,如果你想扩展自己的词典,则需要把扩展的内容配置到IK分词器目录下的IKAnalyzer.cfg.xml文件中。

        4.2.1 创建索引时设置 IK 分词器

        4.2.2 使用 ik_smart 分词器

        使用 ik_smart 分词器测试分词效果
        返回数据

        4.2.3 使用 ik_max_word 分词器

        使用 ik_max_word 分词器测试分词效果
        返回数据
         
        Linux系列:硬件结构Elasticsearch系列:索引映射(Mapping)
        mcbilla
        mcbilla
        一个普通的干饭人🍚
        Announcement
        type
        status
        date
        slug
        summary
        tags
        category
        icon
        password
        🎉欢迎来到飙戈的博客🎉
        -- 感谢您的支持 ---
        👏欢迎学习交流👏