ES7基础篇-04-索引映射操作(_mappering)

2023-11-13

1.简介

有了索引库,等于有了数据库中的database
接下来就需要索引库中的类型了,也就是数据库中的
但是在es7中,映射类型已经被移除,但是映射约束还在,
创建数据库表需要设置字段约束,索引库也一样,在创建索引库的类型时,需要知道这个类型下有哪些字段,每个字段有哪些约束信息,这就叫做字段映射(mapping)

映射是定义文档的过程,文档包含哪些字段,字段是否store, 是否index, 是什么类型的数据, 是否分词等信息;

2. 索引库和索引映射一起创建

eg:

PUT /wql
{
  "mappings": {
    "properties": {
      "address": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "userName": {
        "type": "keyword"
      },
      "userPhone": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

当然也可以同时设置settings 和 aliases,我就采用系统默认了
在这里插入图片描述

3. 索引库和索引映射分开创建

分两步执行,先创建索引库,再创建字段映射
eg:

PUT /wql

PUT /wql/_mapping
{
  "properties": {
    "address": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "userName": {
      "type": "keyword"
    },
    "userPhone": {
      "type": "text",
      "analyzer": "ik_max_word"
    }
  }
}

4. 字段映射解释

PUT /索引库名/_mapping
{
  "properties": {
    "字段名1": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    },
    "字段名2": {
      "type": "类型",
      "index": true,
      "store": true,
      "analyzer": "分词器"
    },
    ...
  }
}

字段名:任意填写,下面指定许多属性,例如:

  • type:类型,可以是text、long、short、date、integer、object等
  • index:是否索引,默认为true
  • store:是否存储,默认为false
  • analyzer:分词器,这里的ik_max_word即使用ik分词器

使用PUT方法,后面跟随我们的索引名称,再接上_mapping,请求体中是我们新添加的映射字段,我们指定了字段的类型为keyword,index索引为false,说明这个字段只用于存储,不会用于搜索,搜索这个字段是搜索不到的。

我们在更新字段时候,是不能修改字段的类型的。如果我们要修改字段的类型,最好是新建一个新的字段,指定正确的类型,然后再更新索引,以后我们只需要查询这个新增的字段就可以了。

注意:

在关系型数据库中,不同的表中,包含相同的字段名是很常见的,而且它们可以做到互不干扰。

在ElasticSearch中,不同的type,如果包含相同的字段名,它们是一样的,es会认为是一个字段,模糊掉不同type的概念。

所以在es里边,type这个概念没必要存在,所以es7就废弃了

在同一个index中,不同的type,创建一个同名的字段,但是类型不要弄成一样的,看能否成功创建。

答案是不可以,它会提示你,不可以将这个字段的类型更改为这个类型。所以,结论就是,es确实把不同type中的同名字段,当成了一个字段。在设计索引库的时候,同名问题一定要注意,最简单的方法就是一个index,一个type,想要其他类型,另外创建index,当然你可以用别的字段名。

注意:ES7废弃,但还在用,ES8才真正的去掉了type。
在这里插入图片描述
比如这样玩,在7以下可以,7之后不行,会报错;

  • es7之后版本需要在索引库后面拼接一个参数
    include_type_name参数,值为true
    在这里插入图片描述
PUT /wql/_mapping/wang-01?include_type_name=true
{
  "properties": {
    "id": {
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "userName": {
      "type": "text",
      "index": "false"
    },
    "userPhone": {
      "type": "keyword",
      "index": "false"
    }
  }
}

响应结果:

#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.15/security-minimal-setup.html to enable security.
#! [types removal] Using include_type_name in put mapping requests is deprecated. The parameter will be removed in the next major version.
{
  "acknowledged" : true
}

上述案例中,就给wql这个索引库添加了一个名为wang-01的类型,并且在类型中设置了3个字段:

  • id:id
  • userName:用户名
  • userPhone:用户电话

并且给这些字段设置了一些属性,至于这些属性对应的含义,我们在后续会详细介绍。

5.查看映射关系

语法: GET /索引库名/_mapping

查看某个索引库中的所有类型的映射。如果要查看某个类型映射,可以再路径后面跟上类型名称。即:

  • es7之前可以这样查询:
GET /索引库名/_mapping/映射名
  • es7之后这样查询:
GET /索引库名/_mapping/

GET /索引库名/_mapping/?pretty

示例: GET /索引库名/_mapping/

响应:

{
  "wql" : {
    "mappings" : {
      "properties" : {
        "id" : {
          "type" : "text",
          "analyzer" : "ik_max_word"
        },
        "userName" : {
          "type" : "text",
          "index" : false
        },
        "userPhone" : {
          "type" : "keyword",
          "index" : false
        }
      }
    }
  }
}

6.映射属性详解

  • type(数据类型)
    Elasticsearch中支持的数据类型非常丰富:
    在这里插入图片描述
    我们说几个关键的:

    • String类型,又分两种:

      • text可分词,不可参与聚合
      • keyword不可分词,数据会作为完整字段进行匹配,可以参与聚合
    • Numerical:数值类型,分两类

      • 基本数据类型:long,interger,short,byte,double,float,half_float
      • 浮点数的高精度类型:scaled_float
      • 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
    • Date:日期类型

    elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。

    • Array:数组类型
    • 进行匹配时,任意一个元素满足,都认为满足
    • 排序时,如果升序则用数组中的最小值来排序,如果降序则用数组中的最大值来排序
    • Object:对象
{
    name:"Jack",
    age:21,
   	girl:{
		name: "Rose",
        age:21
   }
}

如果存储到索引库的是对象类型,例如上面的girl,会把girl处理成两个字段:girl.name和girl.age

  • index :index影响字段的索引情况。

    • true:字段会被索引,则可以用来进行搜索过滤,默认值就是true
    • false:字段不会被索引,不能用来搜索
      index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。
      但是有些字段是我们不希望被索引的,比如商品的图片信息,就需要手动设置index为false。
  • store :是否将数据进行额外存储。
    在学习lucene和solr时,我们知道如果一个字段的store设置为false,那么在文档列表中就不会有这个字段的值,用户的搜索结果中不会显示出来。
    但是在Elasticsearch中,即便store设置为false,也可以搜索到结果。
    原因是Elasticsearch在创建文档索引时,会将文档中的原始数据备份,保存到一个叫做_source的属性中。而且我们可以通过过滤_source来选择哪些要显示,哪些不显示。
    而如果设置store为true,就会在_source以外额外存储一份数据,多余,因此一般我们都会将store设置为false,事实上,store的默认值就是false。

在这里插入图片描述

小tip:

Elasticsearch之settings和mappings的意义:
简单的说,就是

  • settings是修改分片和副本数的。
  • mappings是修改字段和类型的。
    ES的mapping如何用?什么时候需要手动,什么时候需要自动?
  • Mapping,就是对索引库中索引的字段名称及其数据类型进行定义,类似于mysql中的表结构信息。不过es的mapping比数据库灵活很多,它可以动态识别字段。一般不需要指定mapping都可以,因为es会自动根据数据格式识别它的类型,如果你需要对某些字段添加特殊属性(如:定义使用其它分词器、是否分词、是否存储等),就必须手动添加mapping
  • 我们在es中添加索引数据时不需要指定数据类型,es中有自动影射机制,字符串映射为string,数字映射为long。通过mappings可以指定数据类型是否存储等属性。
PUT /wql
{
  "mappings": {
    "properties": {
      "userName": {
        "type": "text",
        "analyzer": "ik_max_word"
      },
      "userPhone": {
        "type": "text"
      },
      "address": {
        "type": "text"
      }
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES7基础篇-04-索引映射操作(_mappering) 的相关文章

  • 连接所有 PostgreSQL 表并创建 Python 字典

    我需要加入allPostgreSQL 表并将它们转换为 Python 字典 数据库中有72张表 总列数大于1600 我编写了一个简单的 Python 脚本 该脚本连接多个表 但由于以下原因无法连接所有表内存错误 https gist git
  • Elasticsearch 可搜索合成字段

    假设源文档 JSON 中存在几个名为的字段 a and b 属于类型long 我想构建一个综合字段 例如c 通过用下划线连接前面字段的值和 将其索引为keyword 也就是说 我正在研究一个可以通过如下虚构的部分映射来支持的功能 a typ
  • 如何修改 Elasticsearch 文档的 _source 字段

    问题 有没有办法从文档的 source 中清除 html html 的剥离可以是周期性的 触发的 或者理想情况下是在索引时即时进行的 我将数据输入到elasticsearch中 并针对分析器进行索引 该分析器在索引之前剥离不需要的htmls
  • 使用 python 聚合 elasticsearch-dsl 中的字段

    有人可以告诉我如何编写 Python 语句来聚合 求和和计数 有关我的文档的内容吗 SCRIPT from datetime import datetime from elasticsearch dsl import DocType Str
  • 在elasticsearch中存储聊天消息的最佳方式

    我们目前正在实施一项即时通讯系统在我们的平台上 我们需要为我们的用户提供聊天记录并能够显示用户最近进行的 5 次对话 像 Facebook 上的预览一样 事实上 我们必须考虑如何才能存储所有这些数据 我们正在使用弹性搜索我们认为这可能是存储
  • Elasticquent(ElasticSearch) Laravel 限制

    您好 我尝试使用 elasticSearch 查询获取所有结果 但如果 limit 值为 null 则仅返回 10 个结果 videos Video searchByQuery match gt field gt request gt fi
  • Elasticsearch GET API 获取分片大小

    在 Elasticsearch 2 3 3 中 有没有办法使用返回 JSON 的 GET API 获取分片大小 目前我找到了以下几种获取shard size的方法 这两种方法都存在问题 recovery gt 使用 JSON 进行响应并提供
  • Elasticsearch如何支持涉及多个文档的事务

    我使用elasticsearch和非规范化数据 比如 PUT my index user 1 name John Smith email email protected cdn cgi l email protection dob 1970
  • Elasticsearch 中的组合非嵌套和嵌套查询

    我想使用 ES 进行书籍搜索 所以我决定将作者姓名和标题 作为嵌套文档 放入索引中 如下所示 curl XPUT localhost 9200 library search books 1 d author one books title
  • 如何使用 Fluent 为 Elasticsearch 添加时间戳和密钥

    我已经配置了 fluidd 和 elasticsearch 它们都工作正常 我正在跟踪一个文件 然后读取其数据并将其发布到elasticsearch 下面是json数据 time 2018 05 14T11 37 30 339593 Dat
  • Spring MVC 中的 Elasticsearch 集成?

    有谁知道如何集成spring mvc和elasticsearch吗 我想实现一个像一般网站 谷歌 雅虎搜索引擎 一样的网页 有教程或者示例代码吗 查看 Spring Data Elasticsearchproject https githu
  • Elasticsearch,如何使 NEST 地图响应类

    首先 我使用的是NEST 5 5 0 我对远程 elasticsearch index 的使用如下 var node new Uri http distribution virk dk cvr permanent var settings
  • 在elasticsearch中搜索字幕数据

    有以下数据 简单的srt 1 00 02 17 440 gt 00 02 20 375 Senator we re making our final 2 00 02 20 476 gt 00 02 22 501 approach into
  • Logback 与 Elasticsearch 直接集成

    我有带有 slf4j logback 的 Spring Boot 应用程序 并寻找集中式日志记录解决方案 现在我发现我不需要使用日志收集器 比如logstash filebeat rsyslog 有直接收集器Ingest Node在 Ela
  • 使用映射创建 Elasticsearch 索引

    我正在努力完成索引创建的简单任务 目标是使用分析器和字段映射创建索引 当我使用分析器创建索引时 我可以通过分析 api 调用与分析器对话 但是当我添加映射信息时 创建索引调用失败 并显示 未找到字段 field 的分析器 analyzer1
  • 如何查找elasticsearch 6.2.1中存在的索引?

    我试图检查elasticsearch 6 2 1的RestHighLevelClient中是否存在索引 目前我正在使用以下代码 try OpenIndexRequest openIndexRequest new OpenIndexReque
  • Elasticsearch 聚合过滤器

    因为我在谷歌上找不到任何东西 是否可以在elasticsearch中过滤聚合 我正在考虑这样的事情 获取 SOME object X gt 100 的所有对象 提前致谢 编辑 样本数据 我有以下文档结构 docKey 1 value 2 d
  • 包含 Elasticsearch 中的查询或部分匹配

    我正在寻找一个 amend 这个词 它可能在数据中以 amending amendment 甚至 amend 的形式出现 搜索此类单词的最佳方法是什么 我知道通配符可以实现这一点 但由于我的代码的其他部分 我被限制不使用它 有哪些不同的方式
  • Rails Searchkick / Elasticsearch has_many 和belongs_to 关联

    我尝试使用 Searchkick 运行搜索并基于多个模型返回 我的书本模型包含这个 class Book lt ActiveRecord Base searchkick has many book subjects has many sub
  • 如何将不带空格的单词与带空格的 ElasticSearch 数据进行匹配

    在我的elasticsearch中 我有数据 New York 我想查询并匹配 NewYork 请注意查询字符串中没有空格 我怎样才能实现这个目标 有什么分析仪可以在这里提供帮助吗 我认为你可以申请木瓦令牌过滤器 https www ela

随机推荐

  • node.js学习

    一 基础知识 1 终端 shell命令 dir 列出当前目录下所有路径 表示当前目录 表示上一级目录 md 目录名 新建文件 rd 目录名 删除文件 文件名 直接打开文件 2 环境变量 windows系统中的变量 配置path 当在命令行窗
  • 数字图像处理之二维码图像提取算法(十一)

    check ratio requirement b w b w b 1 1 3 1 1 bool qr checkRatio totalFinderSize 0 for int i 0 i lt 5 i int count stateCou
  • vue项目PC端屏幕分辨率与窗口大小自适应

    效果 mermaid svg O0n9N0Pq5xuLBK3e label font family trebuchet ms verdana arial font family var mermaid font family fill 33
  • java求数组中,某个值连续出现次数最多的数的次数

    这次遇到的问题是 要在一个数组中找到连续出现次数最多的数的次数 下面的数组 我想拿到0的连续出现次数最多的次数 连续出现3次 第一次0连续出现一次 第二次连续出现2次 第三次连续出现6次 我要拿到6次这个东西 int s 0 1 0 0 1
  • 信息物理系统(CPS)之吾之愚见

    信息物理系统 CPS 是这两年比较热门的研究方向 下面我就从定义 结构等2个方面浅谈一下 如有错误之处请多指教 信息物理系统是集成计算 通信与控制于一体的下一代智能系统 通过人机交互接口实现和物理进程的交互 使用网络化空间以远程的 可靠的
  • 利用python处理excel

    本宝宝有个工作中 需要报送个人所得税 其实以前我写过一个集成报送各年金税金vba的小代码 但是因为新接的任务数据量太大 vba可能会假死 即使能处理 也因为最近在自学python 所以想尝试用python 我的思路是 把报税模板复制出来 然
  • verilog中已知系统时钟频率和波特率可知传输一位数据所需周期和边沿检测电路

    设时钟频率为 clk 50MHZ 50 000 000 HZ 波特率为 bound 115200 位 秒 每秒可以传输115200位数据 传输一位数据所需周期数为 T cnt clk bound 50 000 000 115200 其中选择
  • 究竟深度学习在干什么?

    来源 人机与认知实验室 概要 深度学习取得了巨大的成功 这是无容置疑的 对此 我们不必再多说什么 但是 其理论基础仍然有很大的空白 深度学习取得了巨大的成功 这是无容置疑的 对此 我们不必再多说什么 但是 其理论基础仍然有很大的空白 例如
  • 10 种常用的字符串方法

    10 种常用的字符串方法 1 concat 字符串拼接 const str1 12345678 const str2 abcdefgh const str3 console log str1 concat str2 str3 1234567
  • Linux下TCP通信在两个虚拟机上连接失败,使用回环地址正常

    Linux下TCP通信在两个虚拟机上连接失败 情况描述 在一台虚拟机上使用回环地址 127 0 0 1 时一切正常 当部署到两台虚拟机 局域网下同网段 上时出现连接失败的情况 解决办法 首先使用命令nc z v
  • TCP客户端与服务端建立以及测试——缇友的python学习笔记

    一 客户端创建以及测试 书写代码 import socket if name main tcp test socket socket socket socket AF INET socket SOCK STREAM 创建tcp套接字 AF
  • 肠道细菌四大“门派”——拟杆菌门,厚壁菌门,变形菌门,放线菌门

    一般在肠道菌群健康检测报告中 会有主要菌属构成比例 类似下图 图源 谷禾肠道菌群健康检测报告我们可以看到图中列举了拟杆菌门 厚壁菌门 等 很多小伙伴拿到报告之后 对于这些细菌门表示困惑 这些细菌门都代表了什么意思 某个细菌门比例高了会怎么样
  • 微信小程序调用腾讯地图,获取当前位置得到数据有偏差以及不同软件,不同坐标之间的转换Gcoord

    前言 在微信小程序中调用腾讯本家地图后 发现有偏差 而且距离还不小 在找了很多资料后 发现网上的资料很多都是挂羊头卖狗肉 都是坐标轴之间的互转 比如腾讯的坐标和百度坐标之间的转换 还起的名字是解决小程序的偏移问题 被误导了很久 也找了很多资
  • JAVA入门到精通:Path环境变量

    一 环境变量的定义 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数比如临时文件夹位置和系统文件夹位置等 这点有点类似于DOS时期的默认路径当你运行某些程序时除了在当前文件夹中寻找外还会到设置的默认路径中去查找 简单地说这里的
  • wx.login 和 wx.getUserProfile 同时使用问题

    在开发微信小程序时 会先调用wx login 获取 code 以后 调用 wx getUserProfile 获取rawData signature encryptedData iv等信息 到后台进行处理 但是随着4月28日24时后发布的新
  • SprinBoot项目启动报错Exception in thread "main" java.lang.reflect.InvocationTargetException

    错误代码 lottery api start SLF4J Class path contains multiple SLF4J bindings SLF4J Found binding in jar file data javaprogra
  • Linux多线程并发运行原理+代码例程详解

    文章目录 线程创建和退出 原理 代码 结果 线程属性修改 原理 代码 结果 互斥锁 原理 代码 结果 信号量线程控制原理 使用信号量线程互斥 代码 结果 使用信号量线程同步 代码 结果 小结分析 生产者消费者 实验 问题分析 代码 结果分析
  • 不可重复读和可重复读的理解

    image png 1 不可重复读 同一个事务中 id 10行 字段c1 第一次查询 c1 0 id 10行 字段c1 第二次查询 c1 1 因为在第二次查询 另外一个事务修改了c1 1 且事务提交 2 可重复读 同一个事务中 id 10行
  • iOS编程基础-OC(九)-专家级技巧:使用运行时系统API(续)

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第九章 专家级技巧 使用运行时系统API 9 2 使用运行时系统API 接下来仍然是编写一段程序 该程序会使用运行时系统API以动态的方式创建一个类和一个类实例 然后
  • ES7基础篇-04-索引映射操作(_mappering)

    文章目录 1 简介 2 索引库和索引映射一起创建 3 索引库和索引映射分开创建 4 字段映射解释 5 查看映射关系 6 映射属性详解 1 简介 有了索引库 等于有了数据库中的database 接下来就需要索引库中的类型了 也就是数据库中的表