重生之我们在ES顶端相遇第 20 章 - Mapping 参数设置大全(进阶)

news2024/12/27 5:32:31

文章目录

      • 0. 前言
      • 1. 前置知识 - _source
      • 2. copy_to
      • 3. doc_values
      • 4. index
      • 5. enabled
      • 6. normalizer
      • 7. null_value
      • 8. 总结

0. 前言

在基础篇,我们只介绍了索引 Mapping 的基本用法。
本章将深入探讨日常中较经常使用的 Mapping 其他参数配置。
不想看过程,可直接看最后的总结。

1. 前置知识 - _source

在介绍本章内容时,这边先补充一个知识点:
如果细心观察你会发现,搜索 API 返回的结果都包含在一个叫 _source 的字段中。如下图所示
在这里插入图片描述

_source 在 ES 中非常重要。默认情况下,所有的字段都会存储在 _source 中。
以下 API 都需要用到 _source

  • 搜索返回结果
  • updateupdate by queryreindex API
  • 高亮显示 API

因此,虽说我们可以通过以下操作将 _source 禁用,但一般不禁用

PUT test20_source
{
  "mappings": {
    "_source": {
      "enabled": false
    }
  }
}

2. copy_to

  • 描述: 将多个字段的值拷贝至 1 个或多个字段
  • 作用: 一般用于优化多个 text 字段查询

其使用如下:

PUT test20_copyto
{
  "mappings": {
    "properties": {
      "first_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "last_name": {
        "type": "text",
        "copy_to": "full_name" 
      },
      "full_name": {
        "type": "text"
      }
    }
  }
}

GET test20_copyto/_search
{
  "query": {
    "match": {
      "full_name": "hello"
    }
  }
}

注意: copy_to 不会改变 _source 的值

3. doc_values

  • 描述: 专为字段值存储而设计的列式存储格式。默认情况下,除了 textannotated_text 不启用,其他字段默认启用。禁用该字段,可以节约磁盘存储。
  • 作用: 允许字段使用排序、聚合、script 字段访问。

其使用如下:

PUT test_doc_value
{
  "mappings": {
    "properties": {
      "name": { 
        "type": "keyword"
      },
      "address": { 
        "type": "keyword",
        "doc_values": false
      }
    }
  }
}

PUT test_doc_value/_doc/1
{
  "name": "elasticsearch",
  "address": "china"
}

# 该操作会报错, address 字段的 doc_values 被禁用了
GET test_doc_value/_search
{
  "sort": [
    {
      "address": {
        "order": "desc"
      }
    }
  ]
}

注意: wildcard 字段(模糊匹配)无法禁用

4. index

  • 描述: 是否为字段建立索引(可以简单理解为倒排索引),默认 true。
  • 作用: 禁用时,字段无法搜索

其使用如下:

PUT test_index
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword",
        "index": false
      },
      "address": {
        "type": "keyword"
      },
      "age": {
        "type": "integer" ,
        "index": false
      }
    }
  }
}

PUT test_index/_doc/1
{
  "name": "java",
  "address": "china",
  "age": 13
}

# 不为其建立索引,所以无法被搜索
GET test_index/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "age": {
              "gte": 10
            }
          }
        }
      ]
    }
  }
}

# 依然可以排序
GET test_index/_search
{
  "query": {
    "term": {
      "address": {
        "value": "china"
      }
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

index 字段控制是否可以被搜索,doc_values 控制是否可以被排序、聚合。

5. enabled

  • 描述: enabled 只能应用在顶级映射定义和对象字段上。默认为 true。
  • 作用: 只存储字段值,不为该字段建立任何索引。禁用后,仅存在于 _source 字段中,其他任何地方都不会存储该字段,即可以认为字段无法被搜索、聚合、排序、script 字段访问。但可以获取、修改该字段值。

其使用如下:

# 该操作会报错,无法用于非对象字段
PUT test_enable
{
  "mappings": {
    "properties": {
      "name": { 
        "type": "keyword",
         "enabled": false
      }
    }
  }
}

PUT test_enable
{
  "mappings": {
    "properties": {
      "name": { 
        "type": "keyword"
      },
      "address": { 
        "type": "keyword"
      },
      "relation": {
        "type": "object",
        "enabled": false
      },
      "relation2": {
        "type": "object"
      }
    }
  }
}

PUT test_enable/_doc/1
{
  "name": "java",
  "address": "china",
  "relation": {
    "fruit": "apple",
    "hobby": "basketball"
  },
  "relation2": {
    "fruit": "apple",
    "hobby": "basketball"
  }
}

# 无法查询
GET test_enable/_search
{
  "query": {
    "term": {
      "relation.fruit": {
        "value": "apple"
      }
    }
  }
}

# 正常查询
GET test_enable/_search
{
  "query": {
    "term": {
      "relation2.fruit": {
        "value": "apple"
      }
    }
  }
}

enableddoc_valuesindex 的结合体。被禁用后,仅能被查看、修改值。但 enabled 只能作用于顶级的映射定义和对象字段。

6. normalizer

  • 作用: 规范 keyword 字段值。例如,统一将值转化为小写

其使用如下:

PUT test20_normalizer
{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "char_filter": [],
          "filter": ["lowercase", "asciifolding"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword",
        "normalizer": "my_normalizer"
      },
      "name2": {
         "type": "keyword"
      }
    }
  }
}

PUT test20_normalizer/_doc/1
{
  "name": "HELLO WORLD",
  "name2":  "HELLO WORLD"
}

# 因为 name 被转化为小写,因此我们使用小写也可以搜索到
GET test20_normalizer/_search
{
  "query": {
    "term": {
      "name": {
        "value": "hello world"
      }
    }
  }
}

# name2 未被规范化处理,因此无法使用小写搜索到结果集
GET test20_normalizer/_search
{
  "query": {
    "term": {
      "name2": {
        "value": "hello world"
      }
    }
  }
}

7. null_value

  • 描述: 当一个字段没有值时,写入到 ES 文档中会没有该字段。查询时我们则使用 exists API,ES 提供了 null 值的方式,允许我们查询 null 值。
  • 作用: 写入时设置值为 null。搜索时可通过声明的 null 值来搜索。

其使用如下:

PUT test_null_value 
{
  "mappings": {
    "properties": {
      "name": {
        "type": "keyword",
        "null_value": "NULL"
      },
      "address": {
        "type": "integer",
        "null_value": -99999
      }
    }
  }
}

POST /_bulk
{"index": {"_index":"test_null_value","_id": "1"}}
{"address": 12,"name": null}
{"index": {"_index":"test_null_value","_id": "2"}}
{"name": "hello","address": null}

# 使用声明的 null_value 查询 null 值
GET test_null_value/_search
{
  "query": {
    "term": {
      "address": {
        "value": -99999
      }
    }
  }
}

# 使用声明的 null_value 查询 null 值
GET test_null_value/_search
{
  "query": {
    "term": {
      "name": {
        "value": "NULL"
      }
    }
  }
}

注意: null_value 不改变 _source

8. 总结

  • _source
    • 作用: 所有的字段都会存储在 _source 中。搜索、updateupdate by queryreindex、高亮显示 API 需要用到该字段
    • 默认值: 默认启用
  • _copy_to
    • 作用: 将多个字段拷贝至 1 个或多个字段,用于优化多个 text 字段查询
    • 默认值: \
  • doc_values
    • 作用: 允许字段使用排序、聚合、script 字段访问
    • 默认值: 默认除了 textannotated_text 不启用,其他字段都启用
  • index
    • 作用: 是否允许字段被搜索
    • 默认值: true
  • enabled
    • 作用: 只能作用于顶级映射定义和对象字段,只存储于 _source 中,其他任何地方均不存储。false 时,只能查看、修改字段值,其他操作均被禁用
    • 默认值: true
  • normalizer
    • 作用: 规范 keyword 字段值
    • 默认值: \
  • null_value
    • 作用: 搜索 null
    • 默认值: \

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 实现动态时钟

1.实现效果 2.widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace

陪护小程序|护理陪护系统|陪护小程序成品

智能化&#xff0c;作为智慧医疗宏伟蓝图的基石&#xff0c;正引领着一场医疗服务的深刻变革。在这场变革的浪潮中&#xff0c;智慧医院小程序犹如璀璨新星&#xff0c;迅速崛起&#xff0c;而陪护小程序的诞生&#xff0c;更是如春风化雨&#xff0c;细腻地触及了老年病患、家…

Spring Cloud Netflix Ribbon 负载均衡详解和案例示范

1. 引言 在传统的集中式架构中&#xff0c;负载均衡器一般是放置在服务器端的&#xff0c;例如 Nginx等。随着微服务架构的兴起&#xff0c;服务实例的数量和部署地点变得更加动态和分布式&#xff0c;这使得在客户端进行负载均衡成为了一种可行且更灵活的方案。Netflix Ribbo…

【Linux】Linux命令与操作详解(二)权限管理、存储管理(磁盘分区、格式化、挂载)、进程管理、yum软件包安装

文章目录 一、前言二、权限管理2.1、用户权限2.2、权限说明2. 3、常用命令1、chmod2、chown3、chgrp 三、存储管理磁盘的分区、格式化与挂载1、新建一块硬盘2、在新建硬盘中进行分区3、格式化4、挂载 四、进程管理进程管理命令1、ps2、top3、nice 五、YUM软件包安装1、修改默认…

算法6:模拟运算

文章目录 z字形变幻外观数列数青蛙 题目均来自于力扣 z字形变幻 class Solution { public:string convert(string s, int numRows) {int n s.size();if(n < numRows || numRows 1) return s;int d 2 * numRows - 2;string res;for(int j 0; j < n; j d){res s[j]; …

Chromium 中<a> 标签href 属性实现分析c++

HTML 链接&#xff08;Anchor&#xff09;是网页之间跳转的核心部分。 HTML 使用链接与网络上的另一个文档相连。 HTML中的链接是一种用于在不同网页之间导航的元素。 链接通常用于将一个网页与另一个网页或资源&#xff08;如文档、图像、音频文件等&#xff09;相关联。 …

如何解决位置在表里的二维码的错行问题

众所周知&#xff0c;sap 里的二维码&#xff0c;在从其他形式转换成二维码之后&#xff0c;会经常有数据位置改变的情况&#xff0c;想让它老老实实待在原地很难&#xff0c; 这里要注意设置行间距&#xff0c;如果行间距不合适&#xff0c;就会导致错位

桥梁检测系统源码分享

桥梁检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision 研究…

Vue入门-指令学习-v-on

v-on 作用&#xff1a;注册事件 添加监听 提供处理逻辑 语法&#xff1a; v-on:事件名"内联语句" v-on:事件名"methods中的函数名" 注意&#xff1a;" v-on&#xff1a;"可以替换为" " v-on:click"XXX" --> cli…

CPU中的寄存器是什么以及它的工作原理是什么?

在计算机科学中&#xff0c;寄存器是数字设备中的一个重要组成部分&#xff0c;它用于存储数据和指令以快速处理。寄存器充当临时存储区&#xff0c;信息可以在这里被快速访问和操作&#xff0c;以执行复杂任务。寄存器是计算机中最基础的存储类型&#xff0c;它们在帮助机器高…

如何写出Pythonic的代码?

f-string、三元操作、各种解析式、生成器装饰器的熟练运用&#xff0c;“内库”引用和函数封装再加持PEP8&#xff0c;撰写的脚本不pythonic都难。&#x1f60e; (笔记模板由python脚本于2024年10月07日 18:03:27创建&#xff0c;本篇笔记适合特别喜欢python的coder翻阅) 【学习…

LeetCode讲解篇之377. 组合总和 Ⅳ

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 总和为target的元素组合个数 可以由 总和为target - nums[j]的元素组合个数 转换而来&#xff0c;其中j为nums所有元素的下标 而总和target - nums[j]的元素组合个数 可以由 总和为target - nums[j] - nums[k]的…

哪个牌子充电宝质量好又靠谱?年度四大热门款充电宝清单来了

​当今时代&#xff0c;智能手机已融入我们日常生活的方方面面&#xff0c;成为了不可或缺的伙伴。然而&#xff0c;随之而来的充电需求也日益增长&#xff0c;我们在选择充电宝时经常会面临困惑。面对市场上众多的充电宝品牌和型号&#xff0c;如何挑选一款性价比高、性能稳定…

机器学习框架(含实例说明)

机器学习框架是用于开发和部署机器学习模型的软件库和工具集。它们提供了一系列的算法、工具和基础设施&#xff0c;帮助开发者更高效地构建、训练和部署机器学习模型。以下是一些主要的机器学习框架及其详细介绍&#xff1a; 1. TensorFlow TensorFlow 是由Google开发的开源…

基于STM32的智能花盆浇水系统设计

引言 本项目设计了一个基于STM32的智能花盆浇水系统。该系统通过土壤湿度传感器检测土壤湿度&#xff0c;当湿度低于设定阈值时&#xff0c;自动启动水泵进行浇水。它还结合了温湿度传感器用于环境监测。该项目展示了STM32在传感器集成、自动控制和节水智能化应用中的作用。 …

【CKA】十六、监控Pod度量指标

16、监控Pod度量指标 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 题目意思是&#xff1a;找出label有namecpu-user的CPU最高的Pod&#xff0c;然后把它的名字写在已经存在的 /opt/KUTR00401/KUTR00401.txt文件里 3. 官网地址&#xff1a; https://kubernetes.io/zh-…

Python酷库之旅-第三方库Pandas(135)

目录 一、用法精讲 606、pandas.DataFrame.sparse.from_spmatrix方法 606-1、语法 606-2、参数 606-3、功能 606-4、返回值 606-5、说明 606-6、用法 606-6-1、数据准备 606-6-2、代码示例 606-6-3、结果输出 607、pandas.DataFrame.sparse.to_coo方法 607-1、语法…

操作系统 | 学习笔记 | 王道 | 3.1 内存管理概念

3 内存管理 3.1 内存管理概念 3.1.1 内存管理的基本原理和要求 内存可以存放数据&#xff0c;程序执行前需要先放到内存中才能被CPU处理—缓和cpu和磁盘之间的速度矛盾 内存管理的概念 虽然计算机技术飞速发展&#xff0c;内存容量也在不断扩大&#xff0c;但仍然不可能将所有…

DBMS-3.4 SQL(4)——存储过程和函数触发器

本文章的素材与知识来自李国良老师和王珊老师。 存储过程和函数 一.存储过程 1.语法 2.示例 &#xff08;1&#xff09; 使用DELIMITER更换终止符后用于编写存储过程语句后&#xff0c;在下次执行SQL语句时记得再使用DELIMITER将终止符再换回分号。 使用DELIMITER更换终止符…

18732 最短路问题

### 思路 1. **建模问题**&#xff1a;将车站和公交线路建模为图&#xff0c;其中车站是节点&#xff0c;公交线路是带权边。 2. **选择算法**&#xff1a;使用Dijkstra算法求解从车站1到车站n的最短路径问题。 3. **初始化**&#xff1a;创建一个优先队列&#xff08;最小堆&…