Elasticsearch中的映射方式—简洁版教程

1_3-6A9nJFXMmU34IEaDc4dg.png个人个人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手把手搭建指南给你,新手碰到的坑,这里都已经写了答案。segmentfault

介绍
在这个简短的博客中,我将解释Elasticsearch中的映射以及一些常见的有用最佳实践。在本系列博客后面的Elasticsearch中学习分析/分析器时,对映射有一个很好的了解将很方便。
映射
映射不过是Elasticsearch中文档的架构。正如我以前在阶段01的博客之一中提到的那样,Elasticsearch的架构较少。这意味着,与其余数据库(例如MongoDb或MySql)不一样,在将文档索引到Elasticsearch以前,无需预约义文档的架构。那么这是如何工做的呢?简而言之,Elasticsearch具备检测文档字段类型并生成模式并将其应用于整个索引的内置功能。固然,这里有一些事情要注意,可是咱们稍后会在本博客中再次讨论。首先让咱们看看在索引示例文档时映射是如何存在的。
步骤1
建立没有任何文档的索引。架构

curl -XPUT localhost:9200/testindex-0202

对于上面的命令,咱们将获得如下响应:app

{
  “acknowledged”: true,
  ”shards_acknowledged”: true,
  ”index”: ”testindex-0202"
}

如今,让咱们经过使用以下所示的“获取映射” API来查看是否对其应用了任何映射:curl

curl -XGET localhost:9200/testindex-0202/_mapping

上面的命令将致使如下响应:elasticsearch

{
  “testindex-0202”: {
    “mappings”: {
    }
  }
}

从响应中能够看到,“映射”部分为空,这意味着在此阶段没有应用任何映射。学习

第2步
如今将文档索引到建立的索引,以下所示:测试

curl -XPUT localhost:9200/testindex-0202/testtype/1 — d ‘{
 “name”: ”ArunPMohan”,
 ”age”: 31,
 ”married”: true
}’

如您在上面的文档中看到的,我有三个字段,字段的类型是字符串(对于“名称”字段),整数(对于“年龄”字段)和布尔值(对于“已婚”字段)。当咱们键入此命令时,它不会致使任何错误,这仅表示Elasticsearch已自动检测到字段类型。上面的用于为文档创建索引的命令从Elasticsearch产生如下输出:url

{
  “_index”: ”testindex-0202",”_type”:”testtype”,”_id”:”1",
  ”_version”: 1,
  ”result”: ”created”,
  ”_shards”: {
    “total”: 2,
    ”successful”: 1,
    ”failed”: 0
  },
  ”created”: true
}

如今,在建立文档以后,咱们可使用“ GET mapping” API来查看映射更改。所以,应用如下命令:spa

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分析和分析器。

相关文章
相关标签/搜索