Spring Data访问Elasticsearch----脚本和运行时字段Scripted and runtime fields

Spring Data访问Elasticsearch----脚本和运行时字段Scripted and runtime fields

  • 一、person 实体
  • 二、存储库接口
  • 三、service类
  • 四、脚本化字段Scripted fields
  • 五、运行时字段Runtime fields

Spring Data Elasticsearch支持脚本(scripted)字段和运行时(runtime)字段。有关此方面的详细信息,请参阅有关脚本的 Elasticsearch文档和 运行时字段。在Spring Data Elasticsearch的上下文中,你可以使用

  • 脚本化字段(scripted fields),用于返回在结果文档上计算并添加到返回文档中的字段。
  • 在存储的文档上计算的运行时字段(runtime fields),可以在查询中使用和在搜索结果中返回。
    以下代码片段将展示你可以做什么(这些代码片段展示了命令式代码,但反应式reactive实现的工作原理类似)。

一、person 实体

在这些例子中使用的enity是一个Person实体。此实体具有birthDate和age属性。虽然出生日期是固定的,但年龄取决于发出查询的时间,需要动态计算。

@Document(indexName = "persons")
public record Person(@Id@NullableString id,@Field(type = Text)String lastName,@Field(type = Text)String firstName,@Field(type = Keyword)String gender,@Field(type = Date, format = DateFormat.basic_date)LocalDate birthDate,@Nullable@ScriptedField Integer age       --------1            
) {public Person(String id,String lastName, String firstName, String gender, String birthDate) {this(id,                         --------2            lastName,firstName,LocalDate.parse(birthDate, DateTimeFormatter.ISO_LOCAL_DATE),gender,null);}
}1. age属性将被计算并填充在搜索结果中。
2. 一个方便的构造函数来设置测试数据。

注意,age属性是用@ScriptedField注解的。这将禁止在索引映射中写入相应的条目,并将属性标记为目标,以便从搜索响应中放置计算字段。

二、存储库接口

本例中使用的存储库:

public interface PersonRepository extends ElasticsearchRepository<Person, String> {SearchHits<Person> findAllBy(ScriptedField scriptedField);SearchHits<Person> findByGenderAndAgeLessThanEqual(String gender, Integer age, RuntimeField runtimeField);
}

三、service类

服务类注入了一个存储库和一个ElasticsearchOperations实例,以展示填充和使用age属性的几种方法。我们将代码分成不同的部分,以便将解释放入其中

@Service
public class PersonService {private final ElasticsearchOperations operations;private final PersonRepository repository;public PersonService(ElasticsearchOperations operations, SaRPersonRepository repository) {this.operations = operations;this.repository = repository;}public void save() { --------1List<Person> persons = List.of(new Person("1", "Smith", "Mary", "f", "1987-05-03"),new Person("2", "Smith", "Joshua", "m", "1982-11-17"),new Person("3", "Smith", "Joanna", "f", "2018-03-27"),new Person("4", "Smith", "Alex", "m", "2020-08-01"),new Person("5", "McNeill", "Fiona", "f", "1989-04-07"),new Person("6", "McNeill", "Michael", "m", "1984-10-20"),new Person("7", "McNeill", "Geraldine", "f", "2020-03-02"),new Person("8", "McNeill", "Patrick", "m", "2022-07-04"));repository.saveAll(persons);}1.Elasticsearch中存储一些数据的utility方法。

四、脚本化字段Scripted fields

下一部分将展示如何使用脚本字段来计算和返回人员的年龄。脚本字段只能向返回的数据添加一些内容,不能在查询中使用年龄(请参阅运行时字段)。

    public SearchHits<Person> findAllWithAge() {var scriptedField = ScriptedField.of("age",                            --------1   ScriptData.of(b -> b.withType(ScriptType.INLINE).withScript("""Instant currentDate = Instant.ofEpochMilli(new Date().getTime());Instant startDate = doc['birth-date'].value.toInstant();return (ChronoUnit.DAYS.between(startDate, currentDate) / 365);""")));// version 1: use a direct queryvar query = new StringQuery("""{ "match_all": {} }""");query.addScriptedField(scriptedField);                                 --------2   query.addSourceFilter(FetchSourceFilter.of(b -> b.withIncludes("*"))); --------3   var result1 = operations.search(query, Person.class);                  --------4   // version 2: use the repositoryvar result2 = repository.findAllBy(scriptedField);                     --------5   return result1;}1. 定义计算一个人年龄的ScriptedField2. 使用Query时,将脚本字段添加到查询中。
3. 将脚本化字段添加到查询时,还需要一个额外的源filter来从文档源检索普通字段。
4. 获取Person实体,现在在其age属性中设置了值。
5. 在使用存储库时,所需要做的就是添加脚本字段作为方法参数。

五、运行时字段Runtime fields

使用运行时字段时,可以在查询本身中使用计算值。在以下代码中,它用于对给定的gender和最大age的人员运行查询:

    public SearchHits<Person> findWithGenderAndMaxAge(String gender, Integer maxAge) {var runtimeField = new RuntimeField("age", "long", """                    --------1Instant currentDate = Instant.ofEpochMilli(new Date().getTime());Instant startDate = doc['birth-date'].value.toInstant();emit (ChronoUnit.DAYS.between(startDate, currentDate) / 365);""");// variant 1 : use a direct queryvar query = CriteriaQuery.builder(Criteria.where("gender").is(gender).and("age").lessThanEqual(maxAge)).withRuntimeFields(List.of(runtimeField))                         --------2.withFields("age")                                                --------3.withSourceFilter(FetchSourceFilter.of(b -> b.withIncludes("*"))) --------4.build();var result1 = operations.search(query, Person.class);                     --------5// variant 2: use the repository                                          --------6var result2 = repository.findByGenderAndAgeLessThanEqual(gender, maxAge, runtimeField);return result1;}
}1. 定义用于计算人员年龄的运行时字段。//有关内置属性,请参阅(https://docs.asciidoctor.org/asciidoc/latest/attributes/document-attributes-ref/)
2. 使用Query时,添加运行时字段。
3. 将脚本化字段添加到查询时,需要额外的字段参数才能返回计算值。
4. 将脚本化字段添加到查询时,还需要一个额外的源filter来从文档源检索普通字段。
5. 获取使用查询筛选的数据,返回的实体设置了age属性。
6. 当使用存储库时,所需要做的就是添加运行时字段作为方法参数。

除了在查询上定义运行时字段外,还可以通过设置@Mapping注解的runtimeFieldsPath属性来在索引中定义它们,以指向包含运行时字段定义的JSON文件。

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

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

相关文章

浅谈大模型“幻觉”问题

大模型的幻觉大概来源于算法对于数据处理的混乱&#xff0c;它不像人类一样可以by the book&#xff0c;它没有一个权威的对照数据源。 什么是大模型幻觉 大模型的幻觉&#xff08;Hallucination&#xff09;是指当人工智能模型生成的内容与提供的源内容不符或没有意义的现象。…

SpringCloud Gateway工作流程

Spring Cloud Gateway的工作流程 具体的流程&#xff1a; 用户发送请求到网关 请求断言&#xff0c;用户请求到达网关后&#xff0c;由Gateway Handler Mapping&#xff08;网关处理器映射&#xff09;进行Predicates&#xff08;断言&#xff09;&#xff0c;看一下哪一个符合…

windows docker

写在前面的废话 最近在学习riscv的软件相关内容&#xff0c;倒是有别人的sg2042机器可以通过ssh使用&#xff0c;但是用起来太不方便了&#xff0c;经常断掉&#xff0c;所以想着在自己的机器上跑一跑riscv的操作系统。最常见的有两种方法吧&#xff0c;第一个就是qemu&#xf…

数据库运行状况和性能监控工具

数据库监控是跟踪组织中数据库的可用性、安全性和性能的过程&#xff0c;它涉及通过跟踪各种关键指标来分析数据库的性能&#xff0c;确保数据库的正常运行并具有深入的可见性&#xff0c;并在出现潜在问题时触发即时警报&#xff0c;以采取主动措施来确保数据库的高可用性。 …

制定工业物联网战略? 成功的5个关键考虑因素

随着越来越多的公司争夺注意力和收入&#xff0c;成功和创造、建设和创新的压力也在增加&#xff0c;这导致了对工业物联网战略的更大需求。 随着越来越多的公司争夺注意力和收入&#xff0c;成功和创造、建设和创新的压力也在增加&#xff0c;这导致了对工业物联网战略的更大需…

Win11专业工作站版系统密钥

Windows 11 专业工作站版是 Windows 11 专业版的加强版本&#xff0c;专为满足高性能工作负载的需求而设计。它在专业版的基础上增加了以下功能&#xff1a; 更高的硬件支持: 支持多达 4 个 CPU 和 6 TB 内存&#xff0c;支持最新的服务器级处理器和图形卡。增强的存储性能: 支…

一招让你的Mac重获新生,CleanMyMac助你轻松清理无用垃圾!

一招让你的Mac重获新生&#xff0c;CleanMyMac助你轻松清理无用垃圾&#xff01; 告别卡顿&#xff0c;让你的Mac跑得更快更稳&#xff01; 在当今这个快节奏的生活中&#xff0c;我们的工作和生活早已离不开电脑。特别是对于Mac用户来说&#xff0c;一台轻巧、快捷、稳定的Mac…

java算法第28天 | 93.复原IP地址 78.子集 90.子集II

93.复原IP地址 思路&#xff1a; 这里startIndex为插入‘.’的位置&#xff0c;使用回溯法遍历所有插入的位置&#xff0c;直接在原始字符串上操作。要注意的是开闭区间的规定&#xff08;这里我规定的是左闭右闭区间&#xff09;。还要明确什么时候能return。 class Solution…

HTML中的常用标签用法总结(持续更新...)

&#x1f31f; 欢迎来到 我的博客&#xff01; &#x1f308; &#x1f4a1; 探索未知, 分享知识 !&#x1f4ab; 本文目录 1. 标题标签2. 段落标签3. 链接标签4. 列表标签5. 图像标签6. 表格标签 1. 标题标签 <h1>至<h6>用于定义标题。<h1>是最大的标题&am…

模型部署——RKNN模型量化精度分析及混合量化提高精度

模型部署——RKNN模型量化精度分析及混合量化提高精度&#xff08;附代码&#xff09;-CSDN博客 3.1 量化精度分析流程 计算不同情况下&#xff0c;同一层网络输入值的余弦距离&#xff0c;来近似的查看每一层精度损失的情况。具体量化精度分析的流程如下&#xff1a; 3.2 量…

ONNX @riscv+OpenKylin

安装onnxruntime-riscv 下载软件: git clone https://github.com/ucb-bar/onnxruntime-riscv apt install unzip cd onnxruntime-riscv && sh build.sh 报错... 改了g环境变量部分还是不行&#xff0c;放弃。 安装onnxruntime 使用这个库 git clone https://g…

数据结构大合集03——栈的相关函数运算算法

函数运算算法合集03 顺序栈的结构体顺序栈的基本运算的实现1. 初始化栈2. 销毁栈3. 判断栈是否为空4. 进栈5. 出栈6. 取栈顶元素 链栈的结构体链栈的基本运算的实现1. 初始化栈2. 销毁栈3. 判断是否为空4. 进栈5. 出栈6. 取栈顶元素 注&#xff1a; 本篇文章的概念合集 数据结构…

RocketMQ的重试机制

RocketMQ的重试机制是指:当消费者消费消息失败时,RocketMQ会在一定时间后重新将消息发送给消费者进行消费,以确保消息的可靠消费。 RocketMQ的重试机制主要体现在: 1.自动重试:Consumer在消费失败后,会在一定重试策略下定期重试消费失败的消息,直到成功或达到最大重试次数。 …

边缘检测-Tiny and Efficient Model for the Edge Detection Generalization

源代码: https://github.com/xavysp/TEED 论文地址&#xff1a;https://arxiv.org/pdf/2308.06468.pdf 大多数高级计算机视觉任务依赖于低级图像操作作为其初始过程。边缘检测、图像增强和超分辨率等操作为更高级的图像分析提供了基础。在这项工作中&#xff0c;我们考虑三个…

帮助读者掌握C语言编程基础知识的书籍

帮助读者掌握C语言编程的基础知识&#xff0c;了解如何将人工智能技术应用于自己的编程项目。 人工智能编程&#xff08;赋能C语言&#xff09; 作者&#xff1a; 黄箐、廖云燕、曾锦山、邢振昌 ISBN号&#xff1a; 9787302648796 出版日期&#xff1a; 2023-11-01 本书以C…

刷题DAY26 | LeetCode 39-组合总和 40-组合总和II 131-分割回文串

39 组合总和&#xff08;medium&#xff09; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates…

小程序绕过 sign 签名

之前看到了一篇文章【小程序绕过sign签名思路】之前在做小程序渗透时也遇到了这种情况&#xff0c;但是直接放弃测试了&#xff0c;发现这种思路后&#xff0c;又遇到了这种情况&#xff0c;记录下过程。 并没有漏洞分享&#xff0c;仅仅是把小程序也分享出来&#xff0c;方便…

什么是数组流

字节数组流 1.ByteArrayInputStream和ByteArrayOutputStream分别使用字节数组作为流的源和目标。 2.ByteArrayInputStream构造方法 •ByteArrayInputStream (byte[] buf) •ByteArrayInputStream (byte[] buf,int offset,int length) 3.ByteArrayInputStream常用方法 • public…

如何建立数字化招标采购(系统)评价体系?

前言 长期以来&#xff0c;采购的经济目标占据了主导地位&#xff0c;采购人、采购代理机构或出于“经济人”的本性&#xff0c;或迫于采购资金的限制&#xff0c;极易采购便宜的产品、工程和服务&#xff0c;而忽略了采购的价值。 有效的采购制度&#xff0c;不仅仅以控制成…

【以图搜图】GPUNPU适配万物识别模型和Milvus向量数据库

目录 以图搜图介绍项目地址Milvuscv_resnest101_general_recognition 代码使用流程结果展示模型部署环境Milvus部署及使用docker安装docker-compose安装Milvus可视化工具Attu进入网页端 Data数据示例点个赞再走呗&#xff01;比心&#x1f49e;️ 以图搜图 • &#x1f916; Mo…