我的我的 Elasticsearch 系列文章,逐渐更新中,欢迎关注
0A. 关于 Elasticsearch 及实例应用
00.Solr 与 ElasticSearch 对比
01.ElasticSearch 能做什么?
02.Elastic Stack 功能介绍
03. 如何安装与设置 Elasticsearch API
04. 如果通过 elasticsearch 的 head 插件建立索引_CRUD 操作
05.Elasticsearch 多个实例和 head plugin 使用介绍
06. 当 Elasticsearch 进行文档索引时,它是如何工作的?
07.Elasticsearch 中的映射方式—简洁版教程
另外对于入门小白,我强烈推荐这篇 Elasticsearch 手把手搭建指南给你,新手碰到的坑,这里都已经写了答案。
介绍
在这个简短的博客中,我将解释 Elasticsearch 中的映射以及一些常见的有用最佳实践。在本系列博客后面的 Elasticsearch 中学习分析 / 分析器时,对映射有一个很好的了解将很方便。
映射
映射不过是 Elasticsearch 中文档的架构。正如我之前在阶段 01 的博客之一中提到的那样,Elasticsearch 的架构较少。这意味着,与其他数据库(例如 MongoDb 或 MySql)不同,在将文档索引到 Elasticsearch 之前,无需预定义文档的架构。那么这是如何工作的呢?简而言之,Elasticsearch 具有检测文档字段类型并生成模式并将其应用于整个索引的内置功能。当然,这里有一些事情要注意,但是我们稍后会在本博客中再次讨论。首先让我们看看在索引示例文档时映射是如何存在的。
步骤 1
创建没有任何文档的索引。
curl -XPUT localhost:9200/testindex-0202
对于上面的命令,我们将得到以下响应:
{“acknowledged”: true,”shards_acknowledged”: true,”index”:”testindex-0202"
}
现在,让我们通过使用如下所示的“获取映射”API 来查看是否对其应用了任何映射:
curl -XGET localhost:9200/testindex-0202/_mapping
上面的命令将导致以下响应:
{“testindex-0202”: {“mappings”: {}
}
}
从响应中可以看到,“映射”部分为空,这意味着在此阶段没有应用任何映射。
第 2 步
现在将文档索引到创建的索引,如下所示:
curl -XPUT localhost:9200/testindex-0202/testtype/1 — d‘{“name”:”ArunPMohan”,”age”: 31,”married”: true
}’
如您在上面的文档中看到的,我有三个字段,字段的类型是字符串(对于“名称”字段),整数(对于“年龄”字段)和布尔值(对于“已婚”字段)。当我们键入此命令时,它不会导致任何错误,这仅表示 Elasticsearch 已自动检测到字段类型。上面的用于为文档建立索引的命令从 Elasticsearch 产生以下输出:
{“_index”:”testindex-0202",”_type”:”testtype”,”_id”:”1",”_version”: 1,”result”:”created”,”_shards”: {“total”: 2,”successful”: 1,”failed”: 0
},”created”: true
}
现在,在创建文档之后,我们可以使用“GET mapping”API 来查看映射更改。因此,应用以下命令:
curl -XGET localhost:9200/testindex-0202/_mapping
响应如下所示:
{“testindex-0202”: {“mappings”: {“testtype”: {“properties”: {“age”: {“type”:“long”},“married”: {“type”:“boolean”},“name”: {“type”:“text”,“fields”: {“keyword”: {“type”:“keyword”,“ignore_above”: 256
}
}
}
}
}
}
}
}
在上述回复中,请注意“映射”部分。这里,映射下的第一个对象是“testtype”。“testtype”指示索引的类型。在“测试类型”下方,我们有“属性”对象,该对象保存字段及其类型的列表。您可以看到“年龄”字段的类型为“长”,“已婚”字段的类型为“布尔”,“名称”字段的类型为“文本”。“文本”类型表示字段为“字符串”类型。在名称字段下,我们还有另一个部分称为“字段”。在以后的博客中,我们将看到更多关于“字段”部分的信息,现在,它默认包含字符串 / 文本字段就足够了。
关于 Mappings 的认识
让我们看一下一些重要的事情,这些事情将有助于我们更多地了解映射。
1. 更新映射。
在 Elasticsearch 中,会有多种类型,每种类型都有自己的映射。一旦为一个类型下的字段数生成了映射,就不能修改它。就是说,如果一个文档包含 10 个字段,则会生成 10 个映射,而我们以后将无法对其进行修改。如果我们要修改它,我们需要删除索引,然后手动应用修改后的映射,然后为数据重新索引。
这里要注意的另一重要事情是,如果我们尝试修改现有映射,则上述情况是正确的,但是对于新字段,我们能够更新映射。也就是说,如果我们在文档之间添加第 11 个字段,则映射将相应地自动更新。为了使事情更加清楚,让我们将新文档索引到“testindex-0202”。在新文档的此处,除了“姓名”,“年龄”和“已婚”字段外,我们还包括一个称为“国家”的新字段。让我们像下面这样做:
curl -XPUT localhost:9200/testindex-0202/testtype/2 -d‘{“name”:”AlexJohn”,”age”: 32,”married”: true,”country”:”Italy”}’
现在像我们之前一样操作 GET 映射 API。在结果中,您可以看到还有一个名为“国家”的字段。
2. 常见错误
处理映射时,最常见的错误之一是更改字段的现有类型。让我们自己看看这个错误,并加深了解。
testindex-0202
到目前为止,在索引“”中,我们已经索引了 2 个文档。两个文档的“年龄”字段具有相同的类型,且类型为“长”。现在,让我们尝试为文档编制索引,如下所示:
curl -XPUT localhost:9200/testindex-0202/testtype/3 -d‘{“name”:”LexaMathew”,”age”:”twenty”,”married”: false,”country”:”Italy”}’
请注意,这里的年龄以字符串类型给出,表示它是一个字符串字段。上述要求的回应如下:
{“error”: {“root_cause”: [
{“type”:”mapper_parsing_exception”,”reason”:”failedtoparse[age]”}
],”type”:”mapper_parsing_exception”,”reason”:”failedtoparse[age]”,”caused_by”: {“type”:”number_format_exception”,”reason”:”Forinputstring: \”twenty\””}
},”status”: 400
}
在以上响应中,我们可以
mapper_parsing_exception
在“年龄”字段中看到错误“”。这表明此处的期望字段是另一种类型,而不是字符串。在这种情况下,请使用适当的类型为文档重新编制索引或检查数据,以查看是否有任何数据修改需要进行并相应地更改数据格式 / 映射。
3. 应用自定义映射
到目前为止,我们已经看到了映射的自动生成,即映射仅由 elasticsearch 生成。现在,最常见的用例是应用我们自己的映射。这可以通过在 Elasticsearch 中使用 PUT 映射 API 来完成,如下所示:
首先创建一个名称为“testindex-0202a”的索引
curl -XPUT localhost:9200/testindex-0202a
现在,使用如下所示的 PUT 映射 API:
curl -XPUT localhost:9200/testindex-0202a/_mapping/testtype -d‘{“properties”: {“name”: {“type”:”text”}
}
}’
这将创建一个以“名称”作为字符串 / 文本字段的映射。现在,索引为“testindex-0202a”和类型为“testtype”的任何文档都应具有“文本”类型的“名称”字段。
4. 应用映射的最佳实践
实际上,发生的事情是字段的数据类型可能在不同的时间点发生变化。因此,需要两次迭代才能确定文档字段的结构 / 类型。因此,我们可能需要不断更改索引的数据类型 / 结构或映射。通常建议的做法是创建一个 Shell 脚本,该脚本将首先删除现有索引,然后将映射应用于该索引。这种做法的优点是,删除现有索引然后通过创建新索引来修改映射将非常容易,从而为我们节省了大量时间。
结论
在此博客中,我们介绍了 Elasticsearch 映射的基础知识,例如 Elasticsearch 映射的应用,一些最佳实践以及如何将自定义映射应用于 Elasticsearch 索引。在接下来的博客中,我们将详细介绍 Elasticsearch 分析和分析器。