ElasticSearch之Mapping

写在前面

本文看下es的mapping的设置。es支持两种mapping,一种式dynamic mapping,另外一种是显式的mapping设置。分别来看下。

在正式开始之前我们需要先看下es提供的字段数据类型:
在这里插入图片描述

1:dynamic mapping

我们在使用关系型数据库的时候必须先建表,并指定有哪些字段,什么数据类型,否则将不能保存数据,但是在es中这个建表,并指定有哪些字段,什么数据类型的过程es可以自动的帮助我们完成,就叫做dynamic mapping,具体是这样子的:

当我们向一个不存在的index插入数据的时候,es会自动的根据我们所插入的数据信息,反推出字段信息,并通过dynamic mapping的机制,自动的给我们创建mapping信息,然后再将文档进行保存,自然,这种自动的动作,肯定不可能百分百符合我们的预期,所以在工作中,还是手动创建比较靠谱些,关于如何手动创建,我们在文章的后边也会一起来看下。

如下我们向一个不存在的index中插入数据:
在这里插入图片描述
查看自动生成的mapping信息:

1.1:更改 mapping

分新增字段和已有字段两种情况:

  • 新增字段
    看图吧!
    在这里插入图片描述

在这里插入图片描述

  • 已有字段
    不允许修改。
    我就非得要修改,咋办,可以使用reindex API,重建索引。

1.2:测试dynamic false和stric

此时新增的字段将无法被搜索,但是可以存储。
如下操作实验:

# 1:写入文档
PUT dynamic_mapping_test/_doc/1
{
  "newField": "someValue"
}
# 2:可以搜索到
POST dynamic_mapping_test/_search
{
  "query": {
    "match": {
      "newField": "someValue"
    }
  }
}

# 3:修改dynamic为false
PUT dynamic_mapping_test/_mapping
{
  "dynamic": false
}

# 4:在添加一个新字段,将不能被搜索,因为dynamic设置为false了
PUT dynamic_mapping_test/_doc/10
{
  "anotherField": "someValue"
}

# 5:就搜索不到了,因为字段并没有创建倒排,即没有被索引
POST dynamic_mapping_test/_search
{
  "query": {
    "match": {
      "anotherField": "someValue"
    }
  }
}

# 6:查看mapping信息并没有anotherField
GET dynamic_mapping_test/_mapping

# 7:再将dynamic修改为strict
PUT dynamic_mapping_test/_mapping
{
  "dynamic": "strict"
}

# 8:就报错了,不让添加新字段
# mapping set to strict, dynamic introduction of [anotherField1] within [_doc] is not allowed
PUT dynamic_mapping_test/_doc/10
{
  "anotherField1": "someValue"
}

2:显式定义mapping信息

格式:
在这里插入图片描述
咋写?
在这里插入图片描述
建议第二种写法,稍微改吧改吧就行了,不易出错,效率高。简答来说就是因为es自动mapping也能生成个八九不离十,我们只需要在再对其中不正确的部分,做小改动就可以了。

3:字段的常用配置

3.1:index

通过该选项的true和false,来控制字段是否可以被搜索,如果某个字段不需要或者是不希望被搜索,则可以再mapping中将该字段设置为false。如:
在这里插入图片描述
查询没有被索引的字段将会报错(但search uri的方式不报错,只是查不到),测试一下:

# 1:创建索引users,并指定mobile不索引
PUT users
{
    "mappings": {
        "properties": {
            "firstName": {
                "type": "text"
            },
            "lastName": {
                "type": "text"
            },
            "mobile": {
                "type": "text",
                "index": false
            }
        }
    }
}
# 2:查看创建的索引users,确定mobile的index就是false,如果不是就回过头检查一下
GET users/_mapping

# 3:插入一条数据
PUT users/_create/1
{
    "firstName": "jack",
    "lastName": "james",
    "mobile": "13652525252"
}
# 4:查询mobile,会报错Cannot search on field [mobile] since it is not indexed 
POST users/_search
{
  "query": {
    "match": {
      "mobile": "13652525252"
    }
  }
}
# 5:但search uri的方式是可以查询的,不报错,只是查询不到
GET users/_search?q=mobile:13652525252

3.2:index_option

用来设置索引记录的内容,默认是docs,只记录doc_id,具体如下:
在这里插入图片描述

3.3:null_value

如果某些场景下希望搜索出值为null的文档,则可以使用null_value来给null一个特殊的值,搜索时,搜索这个特质就可以了,如下:

# 1:先删除索引,因为前面创建过了
DELETE users
# 2:创建索引,并指定firstName的null_value
PUT users
{
    "mappings": {
        "properties": {
            "firstName": {
                "type": "text"
            },
            "lastName": {
                "type": "text"
            },
            "mobile": {
                "type": "keyword",
                "null_value": "imnull"
            }
        }
    }
}
# 3:创建新数据
POST users/_create/1
{
    "firstName": "jack",
    "lastName": "james",
    "mobile": null
}
# 4:通过mobile的null值搜索,可以搜索到,并且mobile的值是 "mobile" : null
GET users/_search?q=mobile:"imnull"

3.4:copy_to

如果是希望将多个字段汇总到一个字段中,并搜索,可以使用copy_to,如下:
在这里插入图片描述
测试:

# 1:先删除索引,因为前面创建过了
DELETE users
# 2:创建索引,并指定firstName的null_value
PUT users
{
    "mappings": {
        "properties": {
            "firstName": {
                "type": "text",
                "copy_to": "fullName"
            },
            "lastName": {
                "type": "text",
                "copy_to": "fullName"
            }
        }
    }
}
# 3:创建新数据
POST users/_create/1
{
    "firstName": "jack",
    "lastName": "james"
}
# 4:搜索在fulleName中包含jack或者是包含james的,可以正常搜索到
GET users/_search?q=fullName:(jack james)
{
  "profile": "true"
}

3.5:多字段类型

考虑这样的场景,对于文档的某个字段,有时候我们需要对其进行模糊查询,有时候需要对其进行精确查询,此时,就可以考虑使用多字段类型,即给字段设置一个子字段,当然,在当前假设的场景下,子字段的类型需要设置为keyword,来满足精确查找的需求,如下:

# 1:先删除索引,因为前面创建过了
DELETE users
# 2:创建索引,并指定firstName的null_value
PUT users
{
    "mappings": {
        "properties": {
            "firstName": {
                "type": "text",
                "fields": {
                  "my_keyword": {
                    "type": "keyword"
                  }
                }
            },
            "lastName": {
                "type": "text"
            }
        }
    }
}

# 3:插入数据
POST users/_create/1
{
  "firstName": "AA BB CC",
  "lastName": "james"
}

# 4:使用firstName查询“AA BB”可以查询到,此时是模糊匹配
GET users/_search?q=firstName:"AA BB"
{
  "profile": "true"
}

# 5:使用firstName的子字段my_keyword查询“AA BB”查询不到,因为是精准匹配
GET users/_search?q=firstName.my_keyword:"AA BB"
{
  "profile": "true"
}

# 6:使用firstName的子字段my_keyword查询“AA BB CC"可以查询到
GET users/_search?q=firstName.my_keyword:"AA BB CC"
{
  "profile": "true"
}

注意keyword和text的关键区别就是,keyword是精确匹配,text是模糊匹配。当然text当给定的是完全匹配的值时也是可以查询到的,但本质上还是通过模糊查询的方式匹配到的,这点要注意。

当然我们也可以设置一个指定了自定义分词器的子字段,如下:
在这里插入图片描述

具体的可以根据业务场景来灵活定义。

3.6:Exact Values 和 Full text

Exact values就是精确值,需要进行精确匹配,比如一个身份证号,下载地址等,Full text就是模糊匹配,比如一段描述性的文本,对于Exact Value需要设置type:"keyword",对于Full Text需要设置type:"text",如下图:
在这里插入图片描述

在这里插入图片描述

4:自定义分词器

我们在前面 看过分词器由三部分组成:

charanter Filters:无
Tokennizer:按词切分,就是按照空格切分吧
Token Filters:小写处理

本部分我们继续来看下自定义分词器的相关内容。

4.1:Character Filters有哪些

在这里插入图片描述

4.2:Tokennizer有哪些

在这里插入图片描述

4.3:Token Filters有哪些

在这里插入图片描述

4.4:自定义一些分词器

4.4.1:Character Filter使用html_strip,tokennizer使用keyword

# 1:<b>hello world</b> character filter处理后变为hello world
# 2:hello world tokenizer处理后变为hello world
# 3:没有token filter,所以结果就是hello world
POST _analyze
{
  "tokenizer": "keyword",
  "char_filter": ["html_strip"],
  "text": "<b>hello world</b>"
}

4.4.2:Character Filter使用mapping,tokennizer使用standard(按词切分)

# 1:"123-456, I-test! test-990 650-550-1234" 经过character filter变为"123_456, I_test! test_990 650_550_1234"
# 2:"123_456, I_test! test_990 650_550_1234" 经过tokenizer,按照单词切分变为 ["123_456", "I_test", "test_990", "650_550_1234" ]
# 3:因为没有token filters,所以结果就是 ["123_456", "I_test", "test_990", "650_550_1234" ]
POST _analyze
{
  "tokenizer": "standard",
  "char_filter": [
    {
      "type": "mapping",
      "mappings": [ "- => _" ]
    }
  ],
  "text": "123-456, I-test! test-990 650-550-1234"
}

4.4.3:Character Filter使用正则,tokennizer使用standard(按词切分)

在这里插入图片描述

4.4.4:tokennizer使用path_hiarrarchy,切分路径

在这里插入图片描述

4.4.5:tokennizer使用whitespace(按照空格切分),token filter使用stop删除the,am,a等

# 结果中The还在,因为stop过滤的是小写的the,因此如果想要过滤掉大The的话,只需要修改"filter": ["stop"] 为 "filter": ["lowercase", "stop"],即The先变为the
POST _analyze
{
  "tokenizer": "whitespace",
  "filter": ["stop"],
  "text": "The rain in Spain falls mianly on the plain"
}

写在后面

参考文章列表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/394143.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图数据库 之 Neo4j - 应用场景1(6)

Neo4j是一种图数据库&#xff0c;它专注于处理关系数据密集型的问题。由于其图结构的特性&#xff0c;Neo4j能够高效地存储、查询和分析连接数据。 以下是一些常见的Neo4j应用场景&#xff1a; 社交网络分析&#xff1a;通过建模和分析人际关系&#xff0c;可以揭示社交网络中…

Linux-系统资源管理的命令

目录 查看CPU&#xff1a;more /proc/meminfo 查看内存数据&#xff1a;free -m / free -h 查看系统版本&#xff1a;more /etc/issue 查看操作系统的类型&#xff1a;uname -a 查看主机名称&#xff1a;hostname 查看磁盘空间&#xff1a;df -h 查看某个目录空间…

防御保护---防火墙综合实验

拓扑图 实验要求 办公区的设备可以通过电信链路和移动链路上网分公司设备可以通过总公司的移动链路和电信链路访问到DMZ区域的HTTP服务器分公司内部的客户端可以通过公网地址访问到内部的服务器FW1和FW2组成主备模式双击热备办公区上网用户限制流量不超过60M&#xff0c;其中销…

海外媒体发稿:8个提升影响力的日韩地区媒体发稿推广策略-华媒舍

在今天的数字化时代&#xff0c;媒体发稿推广成为企业和个人增加影响力的重要方式。特别是在日韩地区&#xff0c;这个拥有庞大媒体市场和活跃社交媒体用户的地区&#xff0c;正确的推广策略将对影响力的提升起到关键作用。我们将介绍8个提升影响力的日韩地区媒体发稿推广策略。…

从零开始学逆向:理解ret2syscall

1.题目信息 链接&#xff1a;https://pan.baidu.com/s/19ymHlZZmVGsJHFmmlwww0w 提取码&#xff1a;r4el 首先checksec 看一下保护机制 2.原理 ret2syscall 即控制程序执行系统调用来获取 shell 什么是系统调用&#xff1f; 操作系统提供给用户的编程接口是提供访问操作系统…

辽宁博学优晨教育科技有限公司视频剪辑培训专业之选

随着数字时代的到来&#xff0c;视频剪辑技术已成为各行各业不可或缺的一项技能。为了满足市场需求&#xff0c;辽宁博学优晨教育科技有限公司&#xff08;以下简称“博学优晨”&#xff09;推出了专业的视频剪辑培训课程&#xff0c;旨在为广大学员提供系统、高效的学习机会。…

基于 Amazon EC2 和 Amazon Systems Manager Session Manager 的堡垒机的设计和自动化实现

1. 背景 在很多企业的技术实现中&#xff0c;由于数据安全和合规性要求&#xff0c;大部分的应用服务都部署在私有云环境或专用网络中。为了满足开发人员和运维团队从本地数据中心安全访问云上资源的需求&#xff0c;采用堡垒机作为一种有效的解决方案变得尤为重要。 堡垒机的…

win家庭中文版支持远程桌面

win11家庭版不支持远程桌面&#xff0c;需要下载RDP Wrap补丁 链接&#xff1a;https://pan.baidu.com/s/1Q1MgoBB0v7_rAnR89snT_g 提取码&#xff1a;navi 一、安装RDP Wrap 1、解压RDPWrap-v1.6.2.zip&#xff0c;以管理员身份运行install.bat 2、双击RDPConf.exe&#xff…

考研证件照可以自己用手机拍吗?考研证件照p过可以通过审核吗?考研证件照有什么要求

一、考研证件照可以自己用手机拍吗 现在的智能手机相机技术先进&#xff0c;大多都配备了高像素摄像头&#xff0c;使得自拍照片的质量有了大幅提升。相较于传统的证件照拍摄&#xff0c;使用手机自拍考研证件照理论上是可行的。然而&#xff0c;考研证件照需要满足一定的规定…

鸿蒙应用模型开发-更新SDK后报错解决

更新SDK后提示 “ohos.application.Ability”/“ohos.application.AbilityStage”等模块找不到或者无相关类型声明 问题现象 更新SDK后报错“Cannot find module ‘ohos.application.AbilityStage’ or its corresponding type declarations”&#xff0c;“Cannot find modu…

Rust-知多少?

文章目录 前言1.使用下划线开头忽略未使用的变量2. 变量解构3.常量4.变量遮蔽&#xff08;shadowing&#xff09;5. 类似println!("{}", x); 为啥加感叹号6.单元类型总结 前言 Rust 学习系列&#xff0c;记录一些rust使用小技巧 1.使用下划线开头忽略未使用的变量 …

【STM32 物联网】AT指令与TCP,发送与接收数据

文章目录 前言一、连接TCP服务器1.1 配置Wifi模式1.2 连接路由器1.3 查询ESP8266设备IP地址1.4 连接TCP服务器 二、向服务器接收数据和发送数据2.1 发送数据2.2 接收数据 总结 前言 随着物联网&#xff08;IoT&#xff09;技术的迅速发展&#xff0c;越来越多的设备和系统开始…

java的泛型【详解】

定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff08;如&#xff1a;<E>&#xff09; &#xff0c;称为泛型类、泛型接口&#xff0c;泛型方法、它们统称为泛型。 作用&#xff1a;泛型提供了在编译阶段约束所能操作的数据类型&#xff0c;并自…

Mac M1芯片编译openjdk报错问题解决

使用命令&#xff1a; sudo sh configure --with-target-bits64 用mac m1芯片编译openjdk一直报错&#xff1a; configure: The tested number of bits in the target (64) differs from the number of bits expected to be found in the target (32) configure: error: Cann…

C++ 调用js 脚本

需求&#xff1a; 使用Qt/C 调用js 脚本。Qt 调用lua 脚本性能应该是最快的&#xff0c;但是需要引入第三方库&#xff0c;虽然也不是特别麻烦&#xff0c;但是调用js脚本&#xff0c;确实内置的功能&#xff08;C 调用lua 脚本-CSDN博客&#xff09; 步骤&#xff1a; 1&…

零基础搭建 Kubernetes 集群

零基础搭建 Kubernetes 集群 1、简介 在数字化时代&#xff0c;容器技术已经变成了软件开发和部署的标准&#xff0c;而在众多容器管理工具中&#xff0c;Kubernetes&#xff08;简称为 K8s&#xff09;凭借其高效的资源管理、弹性伸缩和自我修复的能力&#xff0c;成为了行业…

三防平板电脑丨亿道工业三防平板丨三防平板定制丨机场维修应用

随着全球航空交通的增长和机场运营的扩展&#xff0c;机场维护的重要性日益凸显。为确保机场设施的安全和顺畅运行&#xff0c;采取适当的措施来加强机场维护至关重要。其中&#xff0c;三防平板是一种有效的工具&#xff0c;它可以提供持久耐用的表面保护&#xff0c;使机场维…

最简单的基于 FFmpeg 的视频编码器(YUV 编码为 HEVC(H.265))

最简单的基于 FFmpeg 的视频编码器&#xff08;YUV 编码为 HEVC&#xff08;H.265&#xff09;&#xff09; 最简单的基于 FFmpeg 的视频编码器&#xff08;YUV 编码为 HEVC&#xff08;H.265&#xff09;&#xff09;正文结果工程文件下载 最简单的基于 FFmpeg 的视频编码器&a…

【开源】SpringBoot框架开发高校宿舍调配管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能需求2.1 学生端2.2 宿管2.3 老师端 三、系统展示四、核心代码4.1 查询单条个人习惯4.2 查询我的室友4.3 查询宿舍4.4 查询指定性别全部宿舍4.5 初次分配宿舍 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的…

基于ESP32+Platformio的物联网RTOS_SDK-CC_Device

本项目基于ESP32以及Platformio平台开发&#xff0c;请自行查阅如何配置这个环境 开源gitee地址&#xff1a;cc_smart_device 如果愿意贡献项目or提出疑问和修改的&#xff0c;请在gitee上提issue 文章目录 1 基本介绍2 基本架构3 中间件3.1 RTOS部分3.1.1 互斥锁3.1.2 信号量3…
最新文章