Elasticsearch对象映射
Spring Data Elasticsearch对象映射是将Java对象(域实体)映射到存储在Elasticsearchs中的JSON表示形式并返回的过程。内部用于此映射的类是MappingElasticsearchConverter。
元模型对象映射
基于元模型的方法使用域类型信息对Elasticsearch进行读写操作。这允许注册特定域类型映射的Converter实例。
1、映射注释概述
MappingElasticsearchConverter使用元数据来驱动对象到文档的映射。元数据取自可以注释的实体属性。
以下注释可用:
-
@Document
: 在类级别应用,表示该类是映射到数据库的候选对象。最重要的属性是(查看API文档以获取完整的属性列表):-
indexName
: 用于存储此实体的索引的名称。这可以包含SpEL模板表达式,如"log-#{T(java.time.LocalDate).now().toString()}"
-
createIndex
: 标记是否在存储库引导时创建索引。默认值为true。请参阅使用相应映射自动创建索引
-
-
@Id
:在字段级别应用,以标记用于标识目的的字段。 -
@Transient
,@ReadOnlyProperty
,@WriteOnlyProperty
:有关详细信息,请参阅以下“控制向Elasticsearch写入和从Elasticsearchs读取哪些属性”一节。 -
@PersistenceConstructor
: 标记给定的构造函数(甚至是受包保护的构造函数),以便在从数据库实例化对象时使用。构造函数参数按名称映射到检索到的文档中的键值。 -
@Field:
在字段级别应用并定义字段的属性,大多数属性映射到相应的Elasticsearch Mapping定义(以下列表不完整,请查看注释Javadoc以获取完整参考):-
name
: Elasticsearch文档中表示的字段名称,如果未设置,则使用Java字段名称。 -
type
: The field type, can be one of Text, Keyword, Long, Integer, Short, Byte, Double, Float, Half_Float, Scaled_Float, Date, Date_Nanos, Boolean, Binary, Integer_Range, Float_Range, Long_Range, Double_Range, Date_Range, Ip_Range, Object, Nested, Ip, TokenCount, Percolator, Flattened, Search_As_You_Type. 请参阅Elasticsearch映射类型。如果未指定字段类型,则默认为FieldType.auto。这意味着,没有为该属性编写映射条目,并且当存储了该属性的第一个数据时,Elasticsearch将动态添加一个映射条目(有关动态映射规则,请查看Elasticsearch文档)。 -
format
: 一个或多个内置日期格式,请参阅下一节“日期格式映射”。 -
pattern
: 一个或多个自定义日期格式,请参阅下一节“日期格式映射”。 -
store
: 标记原始字段值是否应存储在Elasticsearch中,默认值为false。 -
analyzer
,searchAnalyzer
,normalizer
用于指定自定义分析器和归一化器。
-
-
@GeoPoint
:将字段标记为geo_point数据类型。如果该字段是GeoPoint类的实例,则可以省略。 -
@ValueConverter
:定义一个用于转换给定属性的类。与注册的Spring Converter不同,它只转换带注释的属性,而不是给定类型的每个属性。
映射元数据基础设施是在一个独立的spring data commons项目中定义的,该项目与技术无关。
控制向Elasticsearch写入和从中读取哪些属性
本节详细介绍了定义属性值是写入Elasticsearch还是从Elasticsearchs读取的注释。
@Transient:用此注释注释的属性不会写入映射,它的值不会发送到Elasticsearch,当Elasticsearchs返回文档时,此属性不会在结果实体中设置。
@ReadOnlyProperty:带有此注释的属性不会将其值写入Elasticsearch,但在返回数据时,该属性将填充Elasticsearchs在文档中返回的值。一个用例是在索引映射中定义的运行时字段。
@WriteOnlyProperty:带有此注释的属性将其值存储在Elasticsearch中,但在读取文档时不会设置任何值。例如,这可以用于合成字段,这些字段应该进入Elasticsearch索引,但不会在其他地方使用。
日期格式映射
从TemporalAccessor派生或java.util.类型的属性。日期必须具有FieldType类型的@Field注释。必须为此类型注册日期或自定义转换器。本段介绍FieldType的使用。日期。
@Field注释有两个属性,用于定义将哪种日期格式信息写入映射(另请参阅Elasticsearch内置格式和Elasticsearch-自定义日期格式)
format属性用于定义至少一种预定义格式。如果未定义,则使用默认值_date_optional_time和epoch_millis。
pattern属性可用于添加其他自定义格式字符串。如果只想使用自定义日期格式,则必须将format属性设置为空{}。
下表显示了不同的属性及其值创建的映射:
annotation | format string in Elasticsearch mapping |
---|---|
@Field(type=FieldType.Date) | "date_optional_time||epoch_millis", |
@Field(type=FieldType.Date, format=DateFormat.basic_date) | "basic_date" |
@Field(type=FieldType.Date, format={DateFormat.basic_date, DateFormat.basic_time}) | "basic_date||basic_time" |
@Field(type=FieldType.Date, pattern="dd.MM.uuuu") | "date_optional_time||epoch_millis||dd.MM.uuuu", |
@Field(type=FieldType.Date, format={}, pattern="dd.MM.uuuu") | "dd.MM.uuuu" |
检查org.springframework.data.elasticsearch.annotation的代码。DateFormat枚举,用于预定义值及其模式的完整列表。
范围类型
当一个字段被标注为Integer_Range、Float_Range和Long_Range中的一种类型时,该字段必须是映射到Elasticsearch范围的类的实例,例如:
class SomePersonData {@Field(type = FieldType.Integer_Range)private ValidAge validAge;// getter and setter
}class ValidAge {@Field(name="gte")private Integer from;@Field(name="lte")private Integer to;// getter and setter
}
作为Spring Data的替代方案,Elasticsearch提供了一个Range<T>类,因此前面的示例可以写成:
class SomePersonData {@Field(type = FieldType.Integer_Range)private Range<Integer> validAge;// getter and setter
}
<T>类型支持的类是Integer、Long、Float、Double、Date和实现TemporalAccessor接口的类。
映射字段名称
在没有进一步配置的情况下,Spring Data Elasticsearch将使用对象的属性名作为Elasticsearch中的字段名。可以通过在该属性上使用@field注释来更改单个字段的设置。
也可以在客户端(Elasticsearch客户端)的配置中定义FieldNamingStrategy。例如,如果配置了SnakeCaseFieldNamingStrategy,则对象的属性sampleProperty将映射到Elasticsearch中的sample_property。FieldNaming战略适用于所有实体;可以通过在属性上使用@Field设置特定名称来覆盖它。
Non-field-backed属性
通常,实体中使用的属性是实体类的字段。在某些情况下,属性值是在实体中计算的,应该存储在Elasticsearch中。在这种情况下,getter方法(getProperty())可以用@Field注释进行注释,此外,该方法必须用@AccessType(AccessType.Type.PROPERTY)进行注释。在这种情况下需要的第三个注释是@WriteOnlyProperty,因为这样的值只会写入Elasticsearch。完整示例:
@Field(type = Keyword)
@WriteOnlyProperty
@AccessType(AccessType.Type.PROPERTY)
public String getProperty() {return "some value that is calculated here";
}
其他特性注释
@IndexedIndexName
可以在实体的String属性上设置此注释。该属性不会写入映射,它不会存储在Elasticsearch中,并且不会从Elasticsearch文档中读取其值。在持久化实体后,例如通过调用ElasticsearchOperations.save(T实体),从该调用返回的实体将包含实体保存到该属性中的索引的名称。当bean动态设置索引名时,或者在写入写入别名时,这很有用。
将一些值放入这样的属性中不会设置实体存储到的索引!
2、映射规则
类型注解
映射使用嵌入在发送到服务器的文档中的类型提示来允许泛型类型映射。这些类型提示在文档中表示为_class属性,并为每个聚合根编写。
public class Person { @Id String id;String firstname;String lastname;
}
{"_class" : "com.example.Person", "id" : "cb7bef","firstname" : "Sarah","lastname" : "Connor"
}
可以将类型提示配置为保存自定义信息。使用@TypeAlias注释来执行此操作。
@TypeAlias("human")
public class Person {@Id String id;// ...
}
{"_class" : "human", "id" : ...
}
禁用类型提示
如果应该使用的索引已经存在,但没有在其映射中定义类型提示,并且映射模式设置为strict,则可能需要禁用类型提示的写入。在这种情况下,写入类型提示将产生错误,因为无法自动添加字段。
通过重写从AbstractElasticsearchConfiguration派生的配置类中的方法writeTypeHints(),可以为整个应用程序禁用类型提示(请参阅Elasticsearch客户端)。
或者,可以使用@Document批注为单个索引禁用它们:
@Document(indexName = "index", writeTypeHint = WriteTypeHint.FALSE)
地理空间类型
Point和GeoPoint等地理空间类型转换为lat/lon对。
public class Address {String city, street;Point location;
}
{"city" : "Los Angeles","street" : "2800 East Observatory Road","location" : { "lat" : 34.118347, "lon" : -118.3026284 }
}
GeoJson类型
Spring Data Elasticsearch通过为不同的几何体提供接口GeoJson和实现来支持GeoJson类型。根据GeoJson规范,它们被映射到Elasticsearch文档。当写入索引映射时,实体的相应属性在索引映射中指定为geo_shape。(同时检查Elasticsearch文档)
public class Address {String city, street;GeoJsonPoint location;
}
{"city": "Los Angeles","street": "2800 East Observatory Road","location": {"type": "Point","coordinates": [-118.3026284, 34.118347]}
}
实现了以下GeoJson类型:
-
GeoJsonPoint
-
GeoJsonMultiPoint
-
GeoJsonLineString
-
GeoJsonMultiLineString
-
GeoJsonPolygon
-
GeoJsonMultiPolygon
-
GeoJsonGeometryCollection
Collections
对于集合内的值,当涉及类型提示和自定义转换时,应用与聚合根相同的映射规则。
public class Person {// ...List<Person> friends;}
{// ..."friends" : [ { "firstname" : "Kyle", "lastname" : "Reese" } ]
}
Maps
对于Maps内的值,当涉及类型提示和自定义转换时,应用与聚合根相同的映射规则。然而,Map键需要String才能由Elasticsearch处理。
public class Person {// ...Map<String, Address> knownLocations;}
{// ..."knownLocations" : {"arrivedAt" : {"city" : "Los Angeles","street" : "2800 East Observatory Road","location" : { "lat" : 34.118347, "lon" : -118.3026284 }}}
}
3、自定义转换
查看上一节中的配置ElasticsearchCustomConversions允许注册映射域和简单类型的特定规则。
@Configuration
public class Config extends ElasticsearchConfiguration {@Overridepublic ClientConfiguration clientConfiguration() {return ClientConfiguration.builder() //.connectedTo("localhost:9200") //.build();}@Bean@Overridepublic ElasticsearchCustomConversions elasticsearchCustomConversions() {return new ElasticsearchCustomConversions(Arrays.asList(new AddressToMap(), new MapToAddress())); }@WritingConverter static class AddressToMap implements Converter<Address, Map<String, Object>> {@Overridepublic Map<String, Object> convert(Address source) {LinkedHashMap<String, Object> target = new LinkedHashMap<>();target.put("ciudad", source.getCity());// ...return target;}}@ReadingConverter static class MapToAddress implements Converter<Map<String, Object>, Address> {@Overridepublic Address convert(Map<String, Object> source) {// ...return address;}}
}
{"ciudad" : "Los Angeles","calle" : "2800 East Observatory Road","localidad" : { "lat" : 34.118347, "lon" : -118.3026284 }
}
相关文章:
Elasticsearch对象映射
Spring Data Elasticsearch对象映射是将Java对象(域实体)映射到存储在Elasticsearchs中的JSON表示形式并返回的过程。内部用于此映射的类是MappingElasticsearchConverter。 元模型对象映射 基于元模型的方法使用域类型信息对Elasticsearch进行读写操作…...
Oracle 19c rac 补丁升级,从19.7 to19.22-集群
1. 补丁包概述 数据库环境 角色 数据库 IP地址 数据库版本 主机名 数据库名称 源端 RAC 172.30.21.166/167 19.7 hfcwdb66/hfcwdb67 hfdb 将以下补丁包上传到/soft下 上传到两个节点的soft目录下:p6880880_190000_Linux-x86-64.zip (更新o…...

机器学习--Kaggle的使用
机器学习–Kaggle的使用 打开Kaggle: Your Machine Learning and Data Science Community并点击Sign In登录账号 kaggle中自带了很多的数据集 在点击Datasets之后,单点Notebook,如果有适用的数据集可以单击Copy and Edit复制其Notebook,之后…...

客户服务新突破,天润融通助力电动车企业实现数智化转型
近年来,两轮电动车成为年轻人喜爱的出行新方式,借着这种潮流,许多新兴品牌迅速发展,并跻身行业头部。 但问题也随之而来,由于业务快速发展,各类服务问题也开始增多。 比如天润融通服务的一家头部两轮电动…...
力扣题目 - 2931.购买物品的最大开销
题目 还需要你前往力扣官网查看详细的题目要求 地址 思路 这边需要你去力扣官网详细查看题目看了题目提供的示例 已经有了解法, 先把values转成1维数组,排序之后进行累加即可 代码 var maxSpending function (values) {let list values.flat();list.sort((a, b) > a - …...

智慧化工园区自动化在线监测,建立产业链路数字安全网
智慧化工升级国家政策推动安全风险频发 化工园区作为化工产业的核心集聚地,在全球经济中占据重要地位。为推动行业的高质量发展,国家相继发布了《“十四五”危险化学品安全生产规划方案》、《石化化工行业数字化转型实施指南》和《化工园区安全风险智能化…...

在Docker中运行MySQL的思考:挑战与解决方案
引言 在云计算和容器化技术日益普及的今天,Docker作为一种轻量级的容器化平台,已经成为开发和部署应用的首选工具之一。其提供的便携性、可扩展性和环境一致性对于无状态微服务来说无疑是巨大的福音。然而,并非所有应用都适合在Docker容器中…...
Linux中所有和$有关的操作
prog < file 命令在 Shell 编程中用于 输入重定向,它将文件的内容作为程序的输入。即,程序 prog 会从文件 file 中读取数据,而不是从标准输入(通常是键盘)读取数据。 基本语法: prog < file 解释&…...

github操作学习笔记(杂乱版)
git开源的分布式版本控制系统: 每次修改文件提交后,都会自动创建一个项目版本 查看git版本看有没有安装成功:git --version 把默认编辑器设置成vim:git config --global core.editor "vim" 1、设置昵称和邮箱ÿ…...

学习思考:一日三问(思考篇)之路由表
学习思考:一日三问(思考篇)之路由表 学了什么(是什么)Destination/Mask(最终目标,寻路必须)Proto(择优可选)Pre(择优可选)Cost&#x…...

多个NVR同时管理EasyNVR:设置了“按需拉流超时”配置但没反应的解决方法
视频监控这一技术在当今社会的应用已然愈发广泛,其影响力渗透至我们生活的方方面面。它不仅为我们带来了更为坚固的安全防线,还在诸多行业领域中发挥着不可替代的作用。 在广泛的应用领域中,NVR录像机汇聚管理EasyNVR凭借其卓越的技术实力与前…...

基于Springboot的实验室管理系统【附源码】
基于Springboot的实验室管理系统 效果如下: 系统登录页面 实验室信息页面 维修记录页面 轮播图管理页面 公告信息管理页面 知识库页面 实验课程页面 实验室预约页面 研究背景 在科研、教育等领域,实验室是进行实验教学和科学研究的重要场所。随着实验…...
【Oracle11g SQL详解】常用字符串函数:`CONCAT`、`SUBSTR`、`LENGTH`、`INSTR` 等
常用字符串函数:CONCAT、SUBSTR、LENGTH、INSTR 等 字符串函数在 SQL 中被广泛用于处理文本数据,例如拼接字符串、提取子串、查找字符位置等。Oracle 11g 提供了强大的字符串函数,可以简化对字符串的操作。 一、CONCAT:拼接字符串…...

某养老产业公司管理诊断项目成功案例纪实
某养老产业公司管理诊断项目成功案例纪实 ——从短期和长期出发,提供转型改革建议 【客户行业】养老行业 【问题类型】问题诊断 【客户背景】 某养老产业公司是一家主要从事养老服务为主的企业,主营业务包括社区养老服务、居家养老、康复训练服务等…...
自然语言处理基础及应用场景
自然语言处理定义 让计算机理解人所说的文本 语音 Imitation Game 图灵测试 行为主义 鸭子理论 自然语言处理的基本任务 词性标注:区分每个词名词、动词、形容词等词性命名实体的识别:名词的具体指代是哪一类事物共指消解:代词指代的是前面…...

网页爬虫技术全解析:从基础到实战
引言 在当今信息爆炸的时代,互联网上的数据量每天都在以惊人的速度增长。网页爬虫(Web Scraping),作为数据采集的重要手段之一,已经成为数据科学家、研究人员和开发者不可或缺的工具。本文将全面解析网页爬虫技术&…...
数据仓库-查看表和数据库的信息
查询表信息 使用系统表pg_tables查询数据库所有表的信息。 SELECT * FROM pg_tables;使用gsql的\d命令查询表结构。 示例:先创建表customer_t1并插入数据。 CREATE TABLE customer_t1 ( c_customer_sk integer, c_customer_id char(5)…...

【JVM】JVM基础教程(四)
上一章:【JVM】JVM基础教程(三)-CSDN博客 目录 自动垃圾回收 方法区的回收 方法区回收条件 手动触发回收 堆回收 如何判断堆上的对象可以回收? 可以给对象引用赋值null,切断引用 引用计数法 循环引用缺点 查…...

深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna)
深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna) 前言1.Chat2DB2.SQL Chat3.Wren AI4.Vanna 前言 在数据驱动决策的时代,将自然语言查询转化为结构化查询语言(SQL)的能力变得日益重要。无论是小型创业…...
websocket 服务 pinia 全局配置
websocket 方法类 // stores/webSocketStore.ts import { defineStore } from "pinia";interface WebSocketStoreState {ws: WebSocket | null; // WebSocket 实例callbacks: ((message: string) > void)[]; // 消息回调函数列表connected: boolean; // 连接状态…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...