使用Elasticsearch映射定义索引结构

ops/2024/11/20 9:34:41/

在Elasticsearch中,**映射(Mapping)**是用于定义索引中文档字段的结构、类型及属性的重要组成部分。它相当于数据库表结构的设计,决定了如何对文档中的数据进行解析、存储和检索。本文将详细介绍映射的概念、支持的常规字段类型、如何忽略映射中不合法的数据、实现字段复制与字段存储,以及动态映射的运用。

映射概念与使用

映射定义了索引中每个字段的名称、类型及其特定属性。在创建索引或向索引中添加文档时,Elasticsearch会自动或手动应用映射规则。以下是一个简单的索引创建示例:

PUT first-index
{"settings": {"number_of_shards": "5","number_of_replicas": "1"},"mappings": {"properties": {"content": {"type": "text"}}}
}

在这个例子中,我们创建了一个名为first-index的索引,并指定了其分片数和副本数。在mappings部分,定义了一个名为content的字段,类型为text。这样,当我们向该索引添加文档时,Elasticsearch会根据映射规则正确解析和处理content字段的内容。

常规字段类型

Elasticsearch支持多种字段类型以适应不同的数据需求。以下是一些常见的字段类型:

  • text: 用于全文本搜索的字符串类型,会被分词器进行分词处理。
  • keyword: 不分词的字符串类型,用于精确值匹配、排序或聚合。
  • date: 存储日期和时间数据,支持各种格式指定。
  • boolean: 存储布尔值。
  • geo_point: 存储地理坐标信息。
  • integerfloatdouble: 存储数值类型数据。
  • binary: 存储二进制数据。
  • object: 定义嵌套结构,包含多个子字段。
  • array: 存储一组相同类型的值。

例如,定义一个包含userid(text类型)、visittime(date类型,指定时间格式)和sex(boolean类型)的索引映射:

PUT mysougoulog
{"mappings": {"properties": {"userid": {"type": "text"},"visittime": {"type": "date","format": "yyyy-MM-dd HH:mm:ss ||epoch_millis"},"sex": {"type": "boolean"}}}
}

忽略映射中不合法的数据

在某些场景下,可能需要对索引中某些字段的非法数据进行忽略而非导致整个文档插入失败。可以通过设置ignore_malformed属性来实现这一功能:

PUT ignore-test
{"mappings": {"properties": {"age": {"type": "integer"},"born": {"type": "date","format": "yyyy-MM-dd HH:mm:ss","ignore_malformed": true}}}
}

在上述映射中,born字段被设置为忽略不合法数据。当插入包含非法born值的文档时,Elasticsearch会忽略该字段的错误值并继续处理其他字段。

字段复制与字段存储

字段复制

通过copy_to属性,可以将一个或多个字段的值复制到另一个字段,便于进行全局搜索或其他复杂查询。例如,创建一个索引,将titleauthorabstract字段的值复制到full_text字段:

PUT copy-field
{"mappings": {"properties": {"title": {"type": "text","copy_to": "full_text"},"author": {"type": "text","copy_to": "full_text"},"abstract": {"type": "text","copy_to": "full_text"},"full_text": {"type": "text"}}}
}

现在,可以通过查询full_text字段来同时搜索titleauthorabstract的内容:

POST copy-field/_search
{"query": {"match": {"full_text": "smith"}}
}

字段存储

默认情况下,Elasticsearch只存储原始文档的源数据和用于搜索的倒排索引。如果需要在搜索结果中直接返回某个字段的值,可以设置store属性为true,使字段值被持久化存储到磁盘:

PUT copy-store-field
{"mappings": {"properties": {"title": {"type": "text","copy_to": "full_text"},"author": {"type": "text","copy_to": "full_text"},"abstract": {"type": "text","copy_to": "full_text"},"full_text": {"type": "text","store": true}}}
}

查询时,使用stored_fields参数指定要返回的已存储字段:

POST copy-store-field/_search
{"stored_fields": ["full_text"]
}

动态映射

Elasticsearch具有动态映射功能,当索引中出现未事先定义的字段时,会自动为其创建映射。这在处理未知结构或快速迭代的数据时非常有用。例如,尝试向一个新索引date-test中添加一条包含create_date字段的文档:

PUT date-test/_doc/1
{"create_date": "2015/09/02 00:00:00"
}

查询映射信息,可以看到Elasticsearch已自动为create_date字段创建了映射:

GET date-test/_mapping

若需要自定义动态映射的行为,如指定日期格式,可以在创建索引时设置dynamic_date_formats属性:

PUT date-test2
{"mappings": {"dynamic_date_formats": ["yyyy-MM-dd HH:mm:ss","yyyy-MM-dd"]}
}

总结起来,Elasticsearch的映射机制为索引结构提供了强大的灵活性和控制力。通过合理设计映射,可以优化数据存储、提升搜索性能,并确保数据的一致性和完整性。


http://www.ppmy.cn/ops/17215.html

相关文章

【QT进阶】Qt http编程之websocket的简单介绍

往期回顾 【QT进阶】Qt http编程之用户登录注册功能实现-CSDN博客 【QT进阶】Qt http编程之json解析的简单介绍-CSDN博客 【QT进阶】Qt http编程之nlohmann json库使用的简单介绍-CSDN博客 【QT进阶】Qt http编程之websocket的简单介绍 一、什么是websocket 1、简介 websock…

07.JAVAEE之线程5

与面试相关 1.常见的锁策略 不是一把具体的锁,而是一类锁 1.1 乐观锁 vs 悲观锁 悲观乐观,是对后续锁冲突是否激烈(频繁)给出的预测 如果预测接下来锁冲突的概率不大,就可以少做一些工作. 就称为 乐观锁 如果预测接下来锁冲突的概率很大,就应该多做一些工作. …

ruoyi-cloud-plus添加一个不要认证的公开新页面

文章目录 一、前端1. 组件创建2. src/router/index.ts3. src/permission.ts 二、后端1. 设计思想2. ruoyi-gateway.yml3. 开发Controller 版本RuoYiCloudPlusv2.1.2plus-uiVue3 ts 以新增一个公开的课程搜索页面为例。 一、前端 1. 组件创建 在view目录下创建一个页面的vue…

Kotlin语法快速入门--条件控制和循环语句(2)

Kotlin语法入门–条件控制和循环语句(2) 文章目录 Kotlin语法入门--条件控制和循环语句(2)二、条件控制和循环语句1、if...else2、when2.1、常规用法2.2、特殊用法--并列:2.3、特殊用法--类型判断:2.4、特殊…

virtio-wayland

CrosVM是Chrome操作系统中,用于创建虚拟机的应用。是一个Rust编写的轻量级的虚拟机。借助于CrosVM 用户可以很容易的在ChromeOS中运行Linux、Android以及Windows应用程序 概述 目前crosvm实现了virtio wayland协议,实现了对linux虚拟机wayland协议支持 …

idea上传项目到gitee(码云)

1、打开码云,新建仓库 2、创建 3、这就是创建成功的页面 4、复制仓库地址,后面需要用到 2、打开我们的项目:例如我现在的项目 1、idea创建git仓库 2、选择我们项目文件夹的目录 3、查看文件是否变色,变色表示成功了 4、添加到缓…

typescript中声明新的对象类型

在 TypeScript 中声明新的对象类型主要有两种方式:使用 interface 和 type 关键字。这两种方法在很多情况下都可以互换使用,但它们也有一些不同的特性和用法。下面将介绍如何使用这两种方法来声明新的对象类型。 使用 interface 声明对象类型 interfac…

数字化革新:可视化墨水屏引领基板工艺MSAP贴膜阶段迈向无纸化高端制造应用背景

随着科技的飞速发展和环境保护意识的日益增强,制造印刷电路板(PCB)行业正面临着提升生产效率、降低资源消耗和推动绿色制造的迫切需求。 问题: PCB生产过程对洁净度要求高,传统打印的纸张会有粉尘,纸屑&am…