百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Elasticsearch必须了解的知识:映射(mapping)

toyiye 2024-09-14 13:35 3 浏览 0 评论

映射(mapping)

Mapping 是定义文档及其包含的字段是如何存储和索引的过程。

它的作用:

  • 定义index下的字段名
  • 定义字段类型,比如数值型、浮点型、布尔型等
  • 定义倒排索引相关的设置,比如是否索引、记录position等

为了简单理解,可以把它理解为数据库中的表结构定义,比如说msql中定义一个表,然后每个字段的类型是什么,是整型,字符型,还是浮点型等等。mapping定义了每个字段的数据类型以及这些字段如何分词等相关属性,mapping是elasticsearch中很重要的一个部分。

如果把Elasticsearch比作关系型数据库的话,那么,映射就是建表,映射类型就是存储引擎,字段类型就是字段类型(还不是很了解的话,先继续往下看,最后会有例子,看完后就会很清楚了,之前的文章也有过说明)

首先请按顺序往下看,先了解一下内容:

为了能够将时间字段视为时间,数字字段视为数字,字符串字段视为全文或精确值字符串, Elasticsearch 需要知道每个文档中数据的类型。这个信息包含在映射中。

索引中每个文档都有 类型 。每种类型都有它自己的 映射。

核心简单类型:

Elasticsearch 支持 如下简单类型:

  • 字符串: keyword,text
  • 整数 : byte, short, integer, long
  • 浮点数: float, double
  • 布尔型: boolean
  • 日期: date

当你索引一个文档--之前未曾出现-- Elasticsearch 会使用 动态映射(注意) ,通过JSON中基本数据类型,尝试猜测各种数据类型,使用如下规则:

Note: 这意味着如果你通过引号( "123" )索引一个数字,它会被映射为字符串类型,而不是 long 。但是,如果这个已经映射为 long ,那么 Elasticsearch 会尝试将这个字符串转化为 long ,如果无法转化,则抛出一个异常。

首先,我们向Elasticsearch中PUT(或POST)数据:

索引名:blog1, id:1

请注意PUT与POST的区别:

PUT 必须指定id, POST可以不指定id, es会自动帮我们生成:

出现created字样,表示PUT数据成功。

对比下面的POST,可以看出区别:

通过 /_mapping,我们可以查看 Elasticsearch 在一个或多个索引中的一个或多个类型的映射,Elasticsearch 根据我们索引的文档,(称为 属性 )动态生成映射

GET /blog1/_mapping

其中的city字段以及country字段的type为text,显示正确,但是我们put的数据lat和lon,为数字,却显示为text(存储字符串),我的本意是要显示为地理位置经纬度坐标,所以在kibana中使用地图的时候,是不会正确显示的。

* 在es 2.*版本里存储字符串,只有string字段。

*5.*之后,把string字段设置为了过时字段,引入text,keyword字段

*这两个字段都可以存储字符串使用,但建立索引和搜索的时候是不太一样的

*keyword:存储数据时候,不会分词建立索引

*text:存储数据时候,会自动分词,并生成索引(这是很智能的,但在有些字段里面是没 用的,所以对于有些字段使用text则浪费了空间)

因此,像上面这种情况,当我们创建索引的时候,Elasticsearch会自动的为我们建立mapping(记录了各个字段的类型)也就是动态映射,但是它是会出错的,即有时候并不会按照我们的意图去生成相对应的字段类型。错误的映射会导致查询出现令人困惑的结果。

因此创建完成之后,一定要检查一下!而不是假设你的映射是正确的。

当 Elasticsearch 遇到文档中以前 未遇到的字段,它用 dynamic mapping(动态映射) 来确定字段的数据类型并自动把新的字段添加到类型映射

现在你知道什么是动态映射了吗?那出现上面错误的时候,我们该怎么办呢?别着急,接着往下看吧!

如需更详细的了解mapping,请查看文章: https://www.cnblogs.com/shoufeng/p/10655797.html

自定义映射

尽管在很多情况下基本数据类型 已经够用,但你经常需要为单独域自定义映射 。自定义映射允许你执行下面的操作:

  • 全文字符串域和精确值字符串域的区别
  • 使用特定语言分析器
  • 优化域以适应部分匹配
  • 指定自定义数据格式

更新映射

当你首次 创建一个索引的时候,可以指定类型的映射。你也可以使用 /_mapping 为新类型(或者为存在的类型更新映射)增加映射。

mapping中的字段类型一旦设置,禁止直接修改,因为 lucene实现的倒排索引生成后不允许修改,可使用索引重建的方式。但是可以新增字段。

例如:增加一个birthday字段,类型为:date

索引重建的步骤如下:

1.使用正确的mapping新建索引和类型

例如要将lon及lat的类型改为: geo_point #用于地理位置经纬度坐标

创建新的索引: PUT /blog2

设置mapping:

2.使用reindex api将旧索引数据导入新索引

索引重建后可使用reindex命令迁移数据,如将blog1数据迁移至blog2,请求如下:

3.为新索引添加别名

为索引添加别名后,在程序代码中可以使用固定别名查询动态的索引名称,然后进行查询,如此索引重建则不会引起程序的变动

添加别名请求:

将旧索引别名迁移到新索引请求:

4.删除旧索引

添加或迁移别名后删除旧索引:

查看索引blog2:

使用_bulk插入多条数据:

查看插入的数据:

这样,字段的类型就更新完成了!!!

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码