Elasticsearch mapping 之 性能相关配置

这篇具有很好参考价值的文章主要介绍了Elasticsearch mapping 之 性能相关配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ES 常见类型

通用类型:

二进制: binary

布尔型: boolean

字符串: keywordconstant_keywordwildcard, text

别名: alias

对象: object, flattened, nested, join

结构化数据类型: Range, ip, version, murmur3

空间数据类型: geo_point, geo_shape, point, shape

性能相关参数

_all

  _all 字段的索引方式是将所有其他字段的值作为一个大字符串索引的,通过include_in_all参数指定哪些字段的内容放入_all 字段,_all 字段在v6.0+已经废弃,v7.0正式移除,但是可以通过copy_to来实现_all相同功能.

PUT /test_index
{
  "mappings": {
    "properties": {
      "field1": {
        "type": "text",
        "copy_to": "field_all"
      },
      "field2": {
        "type": "text",
        "copy_to": "field_all"
      },
      "field_all": {
        "type": "text"
      }
    }
  }
}

POST /test_index/_doc/1
{
  "field1": "smith",
  "field2": "John@example.com"
}

GET /test_index/_search
{
  "query": {
    "match": {
      "field_all": "smith"
    }
  }
}

现在field_all存的是[“smith”, “John@example.com”].

优点: 当我们想要查询field1或者field2中包含“smith”的时候,只要查询field_all字段就行. 不需要从两个字段的倒排索引中查询两遍.

缺点: 我们不清楚“smith”是在field1还是field2, 需要按照字段或者“smith”在字段中的占比算score的时候就不支持了. 额外需要硬盘空间存储field_all字段内容.

_source

    _source 字段用于存储 post 到 ES 的原始 json 文档。为什么要存储原始文档呢?因为 ES 采用倒排索引对文本进行搜索,而倒排索引无法存储原始输入文本。一段文本交给ES后,首先会被分析器(analyzer)打散成单词,为了保证搜索的准确性,在打散的过程中,会去除文本中的标点符号,统一文本的大小写,甚至对于英文等主流语言,会把发生形式变化的单词恢复成原型或词根,然后再根据统一规整之后的单词建立倒排索引,经过如此一番处理,原文已经面目全非。因此需要有一个地方来存储原始的信息,以便在搜到这个文档时能够把原文返回给查询者。和所有被存储的字段一样, _source 字段在被写入磁盘之前先会被压缩。

那么一定要存储原始文档吗?不一定!如果没有取出整个原始 json 结构体的需求,可以在 mapping 中关闭 source 字段或者只在 source 中存储部分字段(使用store)。但是这样做有些负面影响:

(1)不能获取到原文

(2)无法reindex:如果存储了 source,当 index 发生损坏,或需要改变 mapping 结构时,由于存在原始数据,ES可以通过原始数据自动重建index,如果不存 source 则无法实现

(3)无法在查询中使用script:因为 script 需要访问 source 中的字段

(4)如果没有 _source 字段,部分 update 请求不会生效。

如果不需要如上功能,可以禁用_source,减少空间或者指定字段储存到_source, 一般不建议禁用_source,可以通过设置best_compression高压缩比来代替禁用_source.

PUT test_index
{
  "mappings": {
    "_source": {
      "enabled": false
    }
  }
}

PUT /test_index
{
  "mappings": {
    "_source": {
      "includes": [
        "field1"
      ],
      "excludes": [
        "field2"
      ]
    }
  }
}

store

    store 决定一个字段是否要被单独存储。大家可能会有疑问,_source 里面不是已经存储了原始的文档嘛,为什么还需要一个额外的 store 属性呢?原因如下:

(1)如果禁用了 _source 保存,可以通过指定 store 属性来单独保存某个或某几个字段,而不是将整个输入文档保存到 _source 中。

(2)如果 _source 中有长度很长的文本(如一篇文章)和较短的文本(如文章标题),当只需要取出标题时,如果使用 _source 字段,ES需要读取整个 _source 字段,然后返回其中的 title,由此会引来额外的IO开销,降低效率。此时可以选择将 title 的 store 设置为true,在 _source 字段外单独存储一份。读取时不必在读取整 _source 字段了。但是需要注意,应该避免使用 store 查询多个字段,因为 store 的存储在磁盘上不连续,ES在读取不同的 store 字段时,每个字段的读取均需要在磁盘上进行查询操作,而使用 _source 字段可以一次性连续读取多个字段。

PUT /test_index
{
  "mappings": {
    "properties": {
      "field1": {
        "type": "text",
        "copy_to": "field_all",
        "store": true
      },
      "field2": {
        "type": "text",
        "copy_to": "field_all"
      },
      "field_all": {
        "type": "text",
        "store": true
      }
    },
    "_source": {
      "enabled": false
    }
  }
}

GET /test_index/_search
{
  "stored_fields": ["field1", "field_all"]
}

doc_values

    倒排索引可以提供全文检索能力,但是无法提供对排序和数据聚合的支持。如果没有doc_values, 聚合A字段流程如下:

  1. 通过倒排索引查询到匹配的docId列表
  2. 根据docId列表去各个分片获取到Doc的_source字段
  3. 解压缩_source字段获取json字符串里面的A字段
  4. 统一在内存中进行A字段的聚合

doc_values 本质上是一个序列化的列式存储结构,适用于聚合(aggregations)、排序(Sorting)、脚本(scripts access to field)等操作。当A字段开启doc_values时, 聚合A字段流程如下:

  1. 通过倒排索引查询到匹配的docId列表
  2. 根据docId列表去各个分片获取到Doc的doc_values里面的A字段, 由于doc_values是列存储,A字段在内存中是连续的,获取方便
  3. 统一在内存中进行A字段的聚合

默认情况下,ES几乎会为所有类型的字段存储doc_value,但是 text 或 text_annotated 等可分词字段不支持 doc values 。如果不需要对某个字段进行排序或者聚合,则可以关闭该字段的doc_value存储(doc_values: false),关闭后不能进行聚合和排序操作

PUT /test_index
{
  "mappings": {
    "properties": {
      "field1": {
        "type": "keyword",
        "copy_to": "field_all",
        "store": true
      },
      "field2": {
        "type": "keyword",
        "copy_to": "field_all",
        "doc_values": false
      },
      "field_all": {
        "type": "text",
        "store": true
      }
    },
    "_source": {
      "enabled": false
    }
  }
}

GET /test_index/_search
{
  "query": {
      "match_all": {}
  },
  "aggregations": {
    "terms_field2": {
      "terms": {
        "field": "field1"
      }
    }
  }
}

index

    控制倒排索引,用于标识指定字段是否需要被索引。默认情况下是开启的,如果关闭了 index,则该字段的内容不会被 analyze 分词,也不会存入倒排索引,即意味着该字段无法被搜索。

PUT /test_index
{
  "mappings": {
    "properties": {
      "field1": {
        "type": "keyword",
        "copy_to": "field_all",
        "store": true,
        "index": false
      },
      "field2": {
        "type": "keyword",
        "copy_to": "field_all",
        "doc_values": false
      },
      "field_all": {
        "type": "text",
        "store": true
      }
    },
    "_source": {
      "enabled": true
    }
  }
}

GET /test_index/_search
{
  "query": {
    "match": {
      "field1": "smith"
    }
  }
}

enabled

    这是一个 index 和 doc_value 的总开关,如果 enabled 设置为false,则这个字段将会仅存在于 source 中,其对应的 index 和 doc_value 都不会被创建。这意味着,该字段将不可以被搜索、排序或者聚合,但可以通过 source 获取其原始值。文章来源地址https://www.toymoban.com/news/detail-756516.html

到了这里,关于Elasticsearch mapping 之 性能相关配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【ElasticSearch】索引数据mapping嵌套深度过大导致Stackoverflow问题排查

    集群所有数据节点频繁因为StackOverflowError的错误挂掉,启动后还会挂掉,StackOverflowError异常栈如下 通过堆栈可以看出是写入线程池[write]发生的Stackoverflow,并且可能是在解析mapping的过程发生的,通过ObjectMapper类推断是Object类型数据写入导致的。因此通过拉取集群内所有索引的

    2024年02月03日
    浏览(41)
  • ElasticSearch数据库修改分片数、副本数及修改mapping字段

            对于已经存在的索引,副本数可以随时修改。 示例演示如下:         ElasticSearch中的数据会被分别存储在不同的分片上,索引库的分片数量是在索引库创建的时候通过settings去设置的,如果不设置,分片数默认是5,分片数一旦确定就不能改变。分片数量的设

    2024年02月02日
    浏览(48)
  • 搜索引擎(大数据检索)论述[elasticsearch原理相关]

    首先需要大致知道搜索引擎有大致几类:1.全文搜索引擎 2.垂直搜索引擎 3.类目搜索引擎等。 1.全文搜索引擎:是全文本覆盖的,百度,google等都是全文本搜索,就是我搜一个词项“方圆”,那么这个词项可以是数字平方的概念,可以是一个人名,可以是一首歌等,所有的相

    2023年04月08日
    浏览(55)
  • 【Elasticsearch学习笔记二】es的Mapping字段映射、Mapping字段常用类型、Mapping映射的创建、查看和更新、es数据迁移、ik分词器

    目录 1、Mapping字段映射概述 2、Mapping字段常用类型 3、映射中对时间类型详解 1)采取自动映射器来映射 2)手工映射提前指定日期类型 4、ES的keyword的属性ignore_above 5、Mapping映射的查看和创建 1)查看mapping信息:GET 索引名/_mapping 2)创建映射:PUT /索引名 3) 查看所有索引映

    2024年01月20日
    浏览(61)
  • ElasticSearch之Mapping

    本文看下es的mapping的设置。es支持两种mapping,一种式dynamic mapping,另外一种是显式的mapping设置。分别来看下。 在正式开始之前我们需要先看下es提供的字段数据类型: 我们在使用关系型数据库的时候必须先建表,并指定有哪些字段,什么数据类型,否则将不能保存数据,但是

    2024年02月19日
    浏览(37)
  • Elasticsearch 映射Mappings (三)

    本文主要记录映射Mappings的作用、类型、ES常用数据类型、常见参数、重要的数据类型、映射配置、映射模板。 静态参数使不可修改的,所以mappings里的配置需要谨慎行事 mapping类似Mysql中的表结构,在Maping里包含了一些属性,比如字段名称、类型、字段使用的分词器、是否评

    2024年02月16日
    浏览(43)
  • Elasticsearch:mapping

    es官方文档 :https://www.elastic.co/guide/en/elasticsearch/reference/7.6/mapping.html mapping是对索引库中文档的约束,常见的mapping属性包括如下内容 type :字段数据类型,常见的简单类型有: 字符串: text (可分词的文本), keyword (精确值,例如:品牌,国家,ip地址) 数值 :long,integer,s

    2024年02月12日
    浏览(36)
  • ElasticSearch索引mapping添加字段

    ES版本5.3.0,在已存在的索引mapping中添加字段。 如下: my_index索引名称,my_type为索引类型名称,new_field_name为新增的字段名称。 如下: 返回为true代表添加操作成功。

    2024年02月13日
    浏览(48)
  • Elasticsearch实践:Setting、Mapping

    版本:Elasticsearch 6.2.4。 Mapping类似于数据库中的表结构定义,主要作用如下: 定义Index下字段名(Field Name) 定义字段的类型,比如数值型,字符串型、布尔型等 定义倒排索引的相关配置,比如是否索引、记录postion等 Mapping完整的内容可以分为四部分内容: 字段类型(Field d

    2024年02月04日
    浏览(37)
  • 【ElasticSearch-基础篇】Mapping结构

    Mapping 类似 mysql 中的 schema 的定义 用于定义索引属性字段的名称、字段的数据类型 (如 text , long , keyword…)、字段的倒排索引相关配置 一个Mapping 属于一个索引的Type、每个文档都属于一个Type es7.0开始, 在Mapping中不需要指定 Type信息, 因为7.0之后只有_doc Type 当我们去创建一个

    2024年01月21日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包