ElasticSearch之索引结构

1. 索引结构

Elasticsearch索引主要结构有mappingsetting,下面学习一下。

{
    
    
    "scorpios": {
    
    
        "aliases": {
    
    },
        "mappings":{
    
    
            "properties":{
    
    
                "name":{
    
    
                   "type": "text",
                   "index": true
                },
                "sex":{
    
    
                   "type": "text",
                   "index": false
                },
                "age":{
    
    
                    "type": "long",
                    "index": false
                }
            }
        },
         "settings": {
    
    
             "index": {
    
    
                 "creation_date": "1650278315803",
                 "number_of_shards": "1",
                 "number_of_replicas": "1",
                 "uuid": "cQTAD1btTpmDcfMYzX4TtA",
                 "version": {
    
    
                     "created": "7080099"
                 },
                 "provided_name": "scorpios"
             }
         }
    }
}

2. Mapping

索引的Mapping可以类比关系型数据库中的Schema,主要包含:

  • 定义索引中字段名称
  • 定义字段数据类型,如:字符串、数字、boolean
  • 可对字段设置倒排索引相关配置,如是否需要分词,使用什么分词器

注:ElasticSearch从7.x版本开始,一个Mapping只属于一个索引type,即一个索引只能有一个类型type,默认type _doc

下面是一个典型的mappings结构

{
    
    
  "mappings": {
    
           #mappings关键字
    "properties": {
    
       #字段名称和类型的定义
      "name": {
    
      #字段名
        "type": "text",   #字段类型
        "fields": {
    
    
          "keyword": {
    
    
            "type": "keyword",
            "ignore_above": 256
          },
    	"index": true
        }
      }
    }
  }
}

2.1 字段数据类型

每个字段都有一个数据数据type

  • textkeyworddatelongdoubleboolean等简单类型
  • 支持JSON分层性质的类型,如 objectnested
  • 一种特殊类型,如geo_pointgeo_shapecompletion

出于不同目的,以不同方式,对同一字段建立索引通常很有用, 例如:

一个字符串字段可以被索引为text全文搜索字段,也可以被索引为keyword排序或聚合字段,还可以使用standard分析器等分词器为字符串字段建立索引

大部分数据类型通过fields参数支持多字段,在上面例子中,通过fields来定义keyword字段,这样就可以通过name.keyword来实现排序或者聚合

注:mapping中字段类型一旦设定后禁止直接修改。因为lucene实现的倒排索引生成后不允许修改,所以在定义字段类型时候要考虑清楚

2.2 动态映射

Elasticsearch提供了动态映射的功能,即会根据用户输入的内容进行动态映射,功能如下:

在写入文档时,如果索引不存在,会自动创建索引,这种机制,使得用户无需手动定义mappings

``Elasticsearch会自动根据文档信息,推算出字段的类型,有时候,Elasticsearch`可能会推算不准确,

如:地理位置信息,当类型推算得不对时,可能导致一些功能无法正常运行,如Range查询。

尽管动态映射对于入门者来说非常有用,但有时仍需要自己显式指定映射,因为动态映射的类型和分词器不一定符合自身要求。所以可以在创建索引时创建字段Mapping 映射 ,也可以使用PUT Mapping API将字段添加到现有索引中。

在创建索引时可以指定一个mapping映射,如下所示:

{
    
    
  "mappings": {
    
    
    "_doc": {
    
              #添加名为doc的映射类型
      "properties": {
    
           #指定字段或属性
        "title":    {
    
     "type": "text"  },      #指定title字段的类型为text
        "name":     {
    
     "type": "text"  }, 
        "age":      {
    
     "type": "integer" },  
        "created":  {
    
    
          "type":   "date", 
          "format": "strict_date_optional_time||epoch_millis"
        }
      }
    }
  }
}

也可以在已有的类型上添加字段时,显式指定类型和分词器

PUT /scorpios/_mapping/my_type
{
    
    
    "properties": {
    
    
        "english_title": {
    
    
            "type":     "text",
            "analyzer": "english"
        }
    }    
}

注:

  1. _mapping方法表示修改mapping属性
  2. 已存在的字段,一旦数据被写入,就不再支持修改字段定义,需要修改已存在的字段属性,是通过Reindex api,即重建索引来实现的,在数据较多的时候,开销较大

2.3 映射参数

mappingsfield定义详细解释

  • type:text。 文本类型,指定类型
  • index:false。设置成false,字段将不会被索引
  • analyzer:ik。指定分词器
  • boost:1.23。字段级别的分数加权
  • doc_values:false。对not_analyzed字段,默认都是开启,analyzed字段不能使用,对排序和聚合能提升较大性能,节约内存,如果您确定不需要对字段进行排序或聚合,或者从script访问字段值,则可以禁用doc值以节省磁盘空间
  • fielddata:{loading : eager }。Elasticsearch 加载内存 fielddata 的默认行为是延迟加载。 当 Elasticsearch 第一次查询某个字段时,它将会完整加载这个字段所有 Segment 中的倒排索引到内存中,以便于以后的查询能够获取更好的性能。
  • fields:{keyword: {type: keyword,ignore_above: 256}} 。可以对一个字段提供多种索引模式,同一个字段的值,一个分词,一个不分词
  • ignore_above:100 。超过100个字符的文本,将会被忽略,不被索引
  • include_in_all:ture。设置是否此字段包含在_all字段中,默认是true,除非index设置成no选项
  • index_options:docs。4个可选参数docs(索引文档号) ,freqs(文档号+词频),positions(文档号+词频+位置,通常用来距离查询),offsets(文档号+词频+位置+偏移量,通常被使用在高亮字段)分词字段默认是position,其他的默认是docs
  • norms:{enable:true,loading:lazy}。分词字段默认配置,不分词字段:默认{enable:false},存储长度因子和索引时boost,建议对需要参与评分字段使用 ,会额外增加内存消耗量
  • null_value:NULL。设置一些缺失字段的初始化值,只有string可以使用,分词字段的null值也会被分词
  • position_increament_gap:0。影响距离查询或近似查询,可以设置在多值字段的数据上火分词字段上,查询时可指定slop间隔,默认值是100
  • store:false。是否单独设置此字段的是否存储而从_source字段中分离,默认是false,只能搜索,不能获取值
  • search_analyzer:ik。设置搜索时的分词器,默认跟ananlyzer是一致的,比如index时用standard+ngram,搜索时用standard用来完成自动提示功能
  • similarity:BM25。默认是TF/IDF算法,指定一个字段评分策略,仅仅对字符串型和分词类型有效
  • term_vector:no。默认不存储向量信息,支持参数yes(term存储),with_positions(term+位置),with_offsets(term+偏移量),with_positions_offsets(term+位置+偏移量) 对快速高亮fast vector highlighter能提升性能,但开启又会加大索引体积,不适合大数据量用

3. Setting

settingElasticSearch索引的配置属性。索引配置项按是否可以更改,分为静态配置与动态配置

静态配置即索引创建后不能修改,静态配置只能在创建索引时或者在状态为closed index的索引上设置

3.1 索引静态配置

  • index.number_of_shards :主分片数,默认为1,只能在创建索引时设置,不能修改

  • index.shard.check_on_startup :是否在索引打开前检查分片是否损坏,当检查到分片损坏将禁止分片被打开
    可选值:

    • false:不检测;
    • checksum:只检查物理结构;
    • true:检查物理和逻辑损坏,相对比较耗CPU;
    • fix:类同与false,7.0版本后将废弃。默认值:false。
  • index.codec:数据存储的压缩算法,默认算法为LZ4,也可以设置成best_compression,best_compression压缩比较好,但存储性能比LZ4差

  • index.routing_partition_size :路由分区数,默认为 1,只能在索引创建时设置。此值必须小于index.number_of_shards。

3.2 索引动态配置

  • index.number_of_replicas :每个主分片的副本数,默认为 1,该值必须大于等于0

  • index.auto_expand_replicas :基于可用节点的数量自动分配副本数量,默认为 false(即禁用此功能)

  • index.refresh_interval :执行刷新操作的频率,这使得索引的最近更改可以被搜索。默认为 1s。可以设置为 -1 以禁用刷新。

  • index.max_result_window :用于索引搜索的 from+size 的最大值。默认为 10000

  • index.max_rescore_window : 在搜索此索引中 rescore 的 window_size 的最大值

  • index.blocks.read_only :设置为 true 使索引和索引元数据为只读,false 为允许写入和元数据更改。

  • index.blocks.read_only_allow_delete:与index.blocks.read_only基本类似,唯一的区别是允许删除动作。

  • index.blocks.read :设置为 true 可禁用对索引的读取操作

  • index.blocks.write :设置为 true 可禁用对索引的写入操作。

  • index.blocks.metadata :设置为 true 可禁用索引元数据的读取和写入。

  • index.max_refresh_listeners :索引的每个分片上可用的最大刷新侦听器数

  • index.max_docvalue_fields_search:一次查询最多包含开启doc_values字段的个数,默认为100。

可以在创建索引时就进行settings配置

PUT /scorpios
{
    
    
    "settings": {
    
    
        "number_of_shards": "3",
        "number_of_replicas": "1"     
    }
}

对于已存在的索引,如果想要修改它的动态配置,可以使用_settings方法

PUT  /scorpios/_settings
{
    
    
    "number_of_replicas": "0"           
}

猜你喜欢

转载自blog.csdn.net/zxd1435513775/article/details/127029879