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; // 连接状态…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...