diff --git a/note/README.md b/note/README.md index 86480a2..0e3d12d 100644 --- a/note/README.md +++ b/note/README.md @@ -351,7 +351,8 @@ - [🔖 elasticsearch 常用查询表达式](elasticsearch/basics/query_dsl.md) - [🔖 elasticsearch 批量操作常用API](elasticsearch/basics/batch.md) - [🔖 elasticsearch 聚合查询](elasticsearch/basics/agg.md) -- [🔖 elasticsearch中常用的数据类型大全](elasticsearch/basics/datatype.md) +- [🔖 elasticsearch 中常用的数据类型大全](elasticsearch/basics/datatype.md) +- [🔖 elasticsearch mapping](elasticsearch/basics/mapping.md) ## [🔖 面试题总结](InterviewQuestions/JavaYouHuo面试题总结.md) diff --git a/note/elasticsearch/README.md b/note/elasticsearch/README.md index 91ba52b..c120ebb 100644 --- a/note/elasticsearch/README.md +++ b/note/elasticsearch/README.md @@ -1,11 +1,13 @@ ![](img/20220127134641.png) ## 安装 -- [elasticsearch 安装教程](basics/install_elasticsearch.md) +- [🔖 elasticsearch 安装教程](basics/install_elasticsearch.md) ## ElasticSearch 常用语法命令 -- [elasticsearch 对索引增删改](basics/insert_update_delete.md) -- [elasticsearch 常用查询表达式](basics/query_dsl.md) -- [elasticsearch 批量操作常用API](basics/batch.md) -- [elasticsearch 聚合查询](basics/agg.md) -- [🔖 elasticsearch中常用的数据类型大全](basics/datatype.md) \ No newline at end of file +- [🔖 elasticsearch 对索引增删改](basics/insert_update_delete.md) +- [🔖 elasticsearch 常用查询表达式](basics/query_dsl.md) +- [🔖 elasticsearch 批量操作常用API](basics/batch.md) +- [🔖 elasticsearch 聚合查询](basics/agg.md) + +## ElasticSearch 高级 +- [🔖 elasticsearch mapping](basics/mapping.md) \ No newline at end of file diff --git a/note/elasticsearch/basics/mapping.md b/note/elasticsearch/basics/mapping.md new file mode 100644 index 0000000..9a9dc33 --- /dev/null +++ b/note/elasticsearch/basics/mapping.md @@ -0,0 +1,184 @@ +# Mapping 简介 + +映射是定义文档及其包含的字段的存储和索引方式的过程。例如,使用映射来定义: + +- 哪些字符串字段应被视为全文字段。 +- 哪些字段包含数字、日期或地理位置。 +- 日期值的格式。 +- 用于控制动态添加字段的映射的自定义规则。 + +映射定义具有: + +- **元数据字段** + + 元数据字段用于自定义如何处理文档的关联元数据。元数据字段的示例包括文档的`_index`、`_source`、`_id`字段。 + +- **字段或属性** + + 映射包含与文档相关的字段列表或字段列表。`properties` + +## 字段数据类型 + +每个字段都有一个数据,可以是:`type` + +- 一个简单的类型,如`text, keyword, date, long, double, boolean or ip`. +- 支持 JSON 的分层特性(如` object or nested`).类型。 +- 或特殊类型,如`geo_point`、`geo_shape`或`completion`。 + + 出于不同目的,以不同的方式为同一字段编制索引通常很有用。例如,可以将字段索引为用于全文搜索的字段,以及作为用于排序或聚合的字段。或者,您可以使用标准分析器、英语分析器和法语分析器为字符串字段编制索引 + +## 防止映射explosion的设置 + +在索引中定义太多字段可能会导致映射explosion,从而导致内存不足错误和难以恢复的情况。 + +请考虑插入的每个新文档都会引入新字段的情况,例如动态映射。每个新字段都会添加到索引映射中,随着映射的增长,这可能会成为一个问题。 + +使用以下设置来限制字段映射(手动或动态创建)的数量,并防止文档导致映射explosion: + +- **`index.mapping.total_fields.limit`** + + 索引中的最大字段数。字段和对象映射以及字段别名会计入此限制。缺省值为 `1000` + + > 该限制已到位,以防止映射和搜索变得太大。较高的值可能会导致性能下降和内存问题,尤其是在具有高负载或资源较少的群集中。 + > + > 如果增加此设置,我们还建议你增加 `indices.query.bool.max_clause_count` 设置,这将限制查询中`boolean clauses` 的最大数目。 + + +- **index.mapping.depth.limit** + + 最大深度,以内部对象的数量来测量。例如,如果所有字段都是在根对象级别定义的,则深度为1 。如果有一个对象映射,则深度为 2,依此类推。默认值为20 。 + +- **`index.mapping.nested_fields.limit`** + + 索引中不同映射的最大数目。该类型应仅在特殊情况下使用,当对象数组需要彼此独立地查询时。为了防止映射设计不当,此设置限制了每个索引的唯一类型数。默认值为 50 。 + +- **`index.mapping.nested_objects.limit`** + + 单个文档在所有类型中可以包含的最大嵌套 JSON 对象数。此限制有助于防止在文档包含太多嵌套对象时出现内存不足错误。默认值为 10000 。 + +- **`index.mapping.field_name_length.limit`** + + 设置字段名称的最大长度。此设置实际上并不能解决映射爆炸问题,但如果要限制字段长度,此设置可能仍然很有用。通常不需要设置此设置。默认值是可以的,除非用户开始添加大量具有非常长名称的字段。默认值为(无限制 `Long.MAX_VALUE`) + +## 动态映射 + +字段和映射类型在使用之前不需要定义。由于*动态映射*,只需为文档编制索引,即可自动添加新的字段名称。新字段既可以添加到顶级映射类型中,也可以添加到内部[`对象`]和[`嵌套`]字段中。 + +可以配置动态映射规则以自定义用于新字段的映射。 + +## 显式映射 + +您对数据的了解比 Elasticsearch 所能猜到的要多,因此,虽然动态映射对于入门很有用,但在某些时候,您将需要指定自己的显式映射。 + +您可以在创建[索引时创建]字段映射,并将[字段添加到现有索引]。 + +## 创建具有显式映射的索引 + +可以使用[创建索引]API 创建具有显式映射的新索引。 + +``` +PUT /my-index-000001?pretty +{ + "mappings": { + "properties": { + "age": { + "type": "integer" + }, + "email": { + "type": "keyword" + }, + "name": { + "type": "text" + } + } + } +} +``` + +## 向现有映射添加字段 + +您可以使用 put 映射 API 将一个或多个新字段添加到现有索引。 + +下面的示例添加了employee id,这是一个索引映射参数值为false的关键字字段。这意味着将存储employee id字段的值,但不会编制索引或用于搜索。 + +```console +PUT /my-index-000001/_mapping +{ + "properties": { + "employee-id": { + "type": "keyword", + "index": false + } + } +} +``` + +### 更新字段的映射 + +除支持的映射参数外,您无法更改现有字段的映射或字段类型。更改现有字段可能会使已编制索引的数据失效。 + +如果需要更改字段的映射,请使用正确的映射创建一个新索引,然后将数据[重新索引]()到该索引中。 + +重命名字段会使已在旧字段名称下编制索引的数据失效。相反,请添加[`别名`]()字段以创建备用字段名称。 + +## 查看索引的映射 + +可以使用[获取映射]() API 查看现有索引的映射。 + +``` +curl -X GET "localhost:9200/my-index-000001/_mapping?pretty" +``` + +API 将返回以下响应: + +```console-result +{ + "my-index-000001" : { + "mappings" : { + "properties" : { + "age" : { + "type" : "integer" + }, + "email" : { + "type" : "keyword" + }, + "employee-id" : { + "type" : "keyword", + "index" : false + }, + "name" : { + "type" : "text" + } + } + } + } +} +``` + + + +## 查看特定字段的映射 + +如果只想查看一个或多个特定字段的映射,则可以使用 [get 字段映射]() API。 + +如果您不需要索引的完整映射,或者索引包含大量字段,这将非常有用。 + +API 将返回以下响应: + +```console-result +{ + "my-index-000001" : { + "mappings" : { + "employee-id" : { + "full_name" : "employee-id", + "mapping" : { + "employee-id" : { + "type" : "keyword", + "index" : false + } + } + } + } + } +} +``` \ No newline at end of file