侧边栏壁纸
  • 累计撰写 48 篇文章
  • 累计创建 33 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

ES Mapping 设计

Angus
2023-02-08 / 0 评论 / 0 点赞 / 182 阅读 / 3089 字

1.Mapping 设计

Mapping 的设计主要设计字段名、字段类型及属性的设定,建议如下:

1.1 字符串类型合理选择 text 和 keyword

对于字符串类型的字段,es 默认会创建 text 类型字段和一个名为 “keyword” 的 keyword 类型的字段。 Text 类型是指这里的字符串会进行分词,即分成多个 term,用于全文检索,比如博客文章、快递地址之类的信息。 Keyword 类型是指这里的字符串作为一个 term 来处理,主要用于精确匹配的数据,比如状态码、标签等。 es 的默认处理虽然同时支持了全文检索和精确匹配,但同时也导致存储成本急剧增加。因此针对字符串类型,不建议采用默认配置,而要明确指定其类型。如果无法明确确定索引的所有字符串类型的字段,那么可以结合 es 动态模板的配置,对字符串类型进行默认设定,如下所示:

PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "strings_as_keywords": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}

  另外对于一些枚举类型的字段,即便其是数值,需要设置为 keyword 类型,比如 http status code、id、邮政编码、数据库主键等。对于这类可以枚举有限的数值,倒排索引的效率远高于数值类型。如果设定为 number 类型,会导致查询效率极低。

1.2 index 参数设定

默认所有字段都会被索引,index 参数为 true。如果某字段不需要被搜索,只需要在结果里面返回,那么就不必为其创建倒排索引,此时可以将其 index 参数设置为 false,节省存储空间,提升索引性能。

1.3 store 参数设定

默认 _source 字段存储了原始文档,如果你想自定义字段存储,可以将其 store 参数设置为 true,一般此时也会同时将 _source 设置为 false。这样可以节省磁盘空间,提升索引性能。

1.4 enabled 参数设定

对于不需要查询,也不需要单独存储的字段,可以直接设定 enabled 为 false,类似下面:

"session_data": { 
    "enabled": false
}

等同于

"session_data": { 
    "type": "text",
    "index": false,
    "store": false
}

1.5 doc_values 参数设定

对于不需要聚合计算和排序的字段,可以将其 doc_values 设置为 false,节省磁盘空间,提升索引性能。

1.6 norms 参数设定

如果一个 text 类型的字段只需要全文检索,不需要归一化的因子,比如字段提权(field boost)、字段值长度因子等,可以将 norms 设为 false,节省磁盘空间,提升索引性能。 norms 含义可参考如下文档 http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/similarities/TFIDFSimilarity.html#formula_norm

1.7 index_options 参数设定

index_options 用于控制倒排索引记录的内容,有如下 4 种配置

  • docs 只记录 doc id
  • freqs 记录 doc id 和 term frequencies
  • positions 记录 doc id、term frequencies 和 term position
  • offsets 记录 doc id、term frequencies、term position 和 character offsets

text 类型默认配置为 positions,其他默认为 docs,记录内容越多,占用空间越大  

1.8 null_value 参数设定

null 值不会被索引,也就不能被检索,可以通过该设定给字段一个默认值

1.9 eager_global_ordinals 参数设定

keyword 类型的 terms 聚合分析 会依赖 global ordinals,而其加载是在 terms 聚合查询的时候进行。通过设定 eager_global_ordinals 参数可以将 global ordinal 的加载更新提前到数据写入时,从而牺牲写入的效率以提升查询的效率。

2 Mapping 设定流程图

总结 Mapping 设定流程图如下: image-1675847130651

0

评论区