题记
Elasticsearch 社区有大量关于 Elasticsearch 错误和异常的问题。
深挖这些错误背后的原因,把常见的错误积累为自己的实战经验甚至是工具,不仅可以节省我们的开发和运维时间,而且可以帮助确保 Elasticsearch 集群的长期健康运行。
常见的异常、原因和常规最佳实践拆解如下,这些最佳实践可以帮助我们更有效地识别、最小化定位和处理异常问题。
1、 Mapper_parsing_exception
Elasticsearch 依靠映射(Mapping)定义的数据类型处理数据。
映射定义了文档中的字段并指定了它们对应的数据类型,例如日期类型 Date、长整数类型 long 和 字符串类型 text。
如果索引文档包含没有定义数据类型的新字段,Elasticsearch将使用动态映射来估计字段的类型,并在必要时将其从一种类型转换为另一种类型。
如果Elasticsearch无法执行此转换,它将引发“ mapper_parsing_exception无法解析” 异常。
如果此类异常太多会降低索引吞吐量。
实战举例如下:
DELETE mytest_0001
PUT mytest_0001/_doc/1
{
"name":"John"
}
PUT mytest_0001/_doc/2
{
"name": {
"firstname": "John",
"lastname": "doe"
}
}
为避免此问题,可以在创建索引时显示定义Mapping,明确敲定字段类型。或者可以使用 _mapping 动态添加新字段映射。
动态更新索引实战:
PUT mytest_0001/_mapping
{
"properties": {
"title": {
"type": "text"
}
}
}
请注意:虽然可以通过如上命令动态添加字段,但是不能更改现有字段映射。
若想做字段类型的修改,需要重新定义Mapping 结合 reindex 和 alias 别名 实现。
2、BulkIndexError
批量索引大型数据集通常更有效。
例如,您可以执行一个批量操作来索引 1,000 个文档,而不是使用 1,000 个索引操作。
批量操作可以通过 bulk API 完成。
批量操作实战:
PUT my_index_0003/_bulk
{
"index":{
"_id":1}}
{
"myid":"c12345"}
{
"index":{
"_id":2}}
{
"myid":"C12456"}
{
"index":{
"_id":3}}
{
"myid":"C31268"}
但是,此过程容易出错。执行批量操作的过程中,你需要仔细检查:数据类型不匹配和空值匹配等问题。
对于批量 API ,你需要格外警惕,因为即使有数百个肯定的响应,批量中的某些索引请求也可能失败。
批量操作捕获错误实战:
&#