【es】elasticsearch 自定义排序-按关键字位置排序

一 背景

要求es查询的结果按关键字位置排序,位置越靠前优先级越高。

es版本7.14.0,项目是thrift,也可以平替springboot,使用easyes连接es。

二 easyes使用

配easyes按官方文档就差不多了

排序 | Easy-Es

主要的一个问题是easyes有与mybatis相同的一套mapper,如果项目也用了mybatis,那需要将mybatis、easyes的mapper分成两个目录

见:避坑指南 | Easy-Es

还有实体类的主键,按ee官方推荐是留个没注解的id自动生成id,而不是指定自己生成的主键,因为会影响数据储存的分区,导致查询效率降低

具体查询:(config、mapper、实体类略)


// 查询构造LambdaEsQueryWrapper<EsSearchDocument> listWrapper = new LambdaEsQueryWrapper<>();
// 查询条件(相等)listWrapper.eq(EsSearchDocument::getType, searchType);
// 查询条件(模糊),与上条是and关系listWrapper.like(EsSearchDocument::getTitle, searchContent);
// 分页偏移量计算int offset = ((pageNum != null ? Integer.parseInt(pageNum) : 1) - 1) * size;
//查询总条数Long count = esMapper.selectCount(listWrapper);
// 设置分页listWrapper.limit(offset, size); // 分页
// 查询结果列表List<EsSearchDocument> esList = esMapper.selectList(listWrapper);//打印System.out.println("count="+count);System.out.println(JSON.toJSONString(esList));

三 自定义排序

es官方排序是按重复次数、内容长度、权重之类,用一个啥公式算出来分数排的

大学也许还能看懂点,现在是完全不懂了

easyes也提供了按字段排序之类(见上面官方文档链接)

回到问题,es、ee都没有按关键字位置排序的。不过es、ee还提供了自定义脚本 painless,可以自己写处理方式。那就好说了,在脚本里获得字段原文,indexof拿到关键字所在位置,根据这个值排序。

大部分网上的文档这么写(包括文心一言):

可以看到取原文的写法是 doc['字段.keyword'].value

经过实测会报错:

1 字段.keyword 不存在。去掉.keyword能取到,但取得是内容片段,比如原文“金坷垃好处都有啥”,这个word/words值是“都有啥”。

2  text类型字段不能拆出来排序,否则报错:

Text fields are not optimised for operations that require per-document field data like aggregations 

意思就是text类型字段被es禁用了聚合、排序操作,要么加注解(fielddata=true)才能解锁,要么改成keyword类型。但加注解会影响效率,有多影响待观察。

这个字段是用了ik分词器的,去掉分词器后(谨慎改变实体类,每次改变都会试es数据清空),word值成了“啥”

到这里已经一整天过去了

然后翻阅es的官方文档,终于发现这么一句:

Field context | Painless Scripting Language [7.14] | Elastic

意思是 doc['字段']写法不适用于text类型字段。想取到原值可以 params['_source']['字段']

试了下还真可以。

param是可以传动态参数的,使脚本避免反复编译提高效率。另外doc、_source、ctx是结合上下文在不同场景用的,比如doc是_search查询用的,但这个问题的查询就用了_source,不能太死板

探究 | Elasticsearch Painless 脚本 ctx、doc、_source 的区别是什么?-腾讯云开发者社区-腾讯云

最后加了这么一段

// 定义脚本String painlessScriptStr = " String word = params['_source']['title'];" + " int position = (word != null && !''.equals(word)) ? word.indexOf(params['searchContent']) : -1; " + " return position; ";// 自定义评分规则Script script = new Script(ScriptType.INLINE, "painless", painlessScriptStr, Collections.singletonMap("searchContent", searchContent));ScriptSortBuilder ssb = new ScriptSortBuilder(script, ScriptSortBuilder.ScriptSortType.NUMBER).order(SortOrder.ASC);listWrapper.sort(ssb);

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

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

相关文章

HTTPServer改进思路2(mudou库核心思想融入)

mudou网络库思想理解 Reactor与多线程 服务器构建过程中&#xff0c;不仅仅使用一个Reactor&#xff0c;而是使用多个Reactor&#xff0c;每个Reactor执行自己专属的任务&#xff0c;从而提高响应效率。 首先Reactor是一种事件驱动处理模式&#xff0c;其主要通过IO多路复用…

ST Stellar-E SR5E1 22KW OBC combo 3KW DC-DC汽车充电器解决方案

对于全球的环境保护意识抬头&#xff0c;全球的汽车产业慢慢步入电动化的时代&#xff0c;以减少碳排放。整车系统主要是由电池、电驱、电控的三电所构成&#xff0c;其中电池系统是整车的动力来源&#xff0c;而对电池充电的OBC系统更甚重要。一具高度安全性且高效的OBC系统&a…

7.23 字符串简单中等 520 125 14 34

520 Detect Capital 思路&#xff1a; 题目&#xff1a;判定word &#xff1a;if the usage of capitals in it is right.遍历所有的string&#xff1a; 两种情况&#xff1a; 首字母capitals–>判定第二个字母是否大写–>所有字母大写 otherwise 除第一个以外全部小写&a…

使用xxl-job执行定时任务

文章目录 使用xxl-job执行定时任务xxl-job原理我们自己的项目里面需要怎么写定时任务呢&#xff1f;如果想要使用xxl-job我们需要在服务器上部署两个项目 使用xxl-job执行定时任务 xxl-job原理 首先xxl-job的全拼是“XiaoXiaoLiang Job”或者“Xu Xue Li”作者的名字&#xf…

华清数据结构day4 24-7-19

链表的相关操作 linklist.h #ifndef LINKLIST_H #define LINKLIST_H #include <myhead.h> typedef int datatype; typedef struct Node {union{int len;datatype data;};struct Node *next; } Node, *NodePtr;NodePtr list_create(); NodePtr apply_node(datatype e); …

从零开始学Java(超详细韩顺平老师笔记梳理)06——面向对象编程基础(上):类与对象、成员方法、传参机制、对象克隆、递归(斐波那契、迷宫、汉诺塔、八皇后)

文章目录 前言一、类与对象1. 类与对象的概述2. 快速入门&#xff08;用面向对象的方式解决问题&#xff09;3. 对象在内存中的存在形式&#xff08;重要&#xff09;4. 属性5. 类与对象的内存分配机制 二、成员方法1. 基本介绍2. 快速入门3. 方法调用机制原理&#xff08;重点…

【HarmonyOS学习】用户文件访问

概述 文件所有者为登录到该终端设备的用户&#xff0c;包括用户私有的图片、视频、音频、文档等。 应用对用户文件的创建、访问、删除等行为&#xff0c;需要提前获取用户授权&#xff0c;或由用户操作完成。 用户文件访问框架 是一套提供给开发者访问和管理用户文件的基础框…

【JavaEE初阶】线程的概念及创建

目录 &#x1f4d5; 前言 &#x1f4d5; 认识线程&#xff08;Thread&#xff09; &#x1f6a9; 概念 &#x1f60a;线程是什么 &#x1f642; 为啥要有线程 &#x1f62d; 进程和线程的区别&#xff08;面试题重点&#xff09; &#x1f92d; Java的线程和操作系统线程…

MyBatis-Plus的基本使用(一)

目录 前言 特性 MyBatis-Plus入门案例 常用注解 小结 前言 这篇文章主要来学习MyBatis-Plus这个非常强大的框架. 在学习MyBatis-Plus之前,需要有MyBatis的学习基础.因为MyBatis -Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#x…

Leetcode3216. 交换后字典序最小的字符串

Every day a Leetcode 题目来源&#xff1a;3216. 交换后字典序最小的字符串 解法1&#xff1a;模拟 找到第一个 s[i] > s[i 1]&#xff0c;且它们奇偶性相同&#xff0c;交换它们。 代码&#xff1a; /** lc appleetcode.cn id3216 langcpp** [3216] 交换后字典序最小…

Efficient and Effective Weakly-Supervised Action Segmentation via ATBA

**基于动作转移感知边界对齐的高效弱监督动作分割**介绍 动作分割的目的是将一个长的未裁剪的视频分割成几个片段&#xff0c;并将每个片段分类为一个动作类别&#xff0c;如下图所示&#xff1a; 弱监督动作分割 现有的训练方法大多需要通过对所有帧和文本进行序列比对来…

JavaScript构造函数小挑战

// 编码挑战 #1 /* 使用构造函数实现一辆汽车。一辆汽车有一个品牌和一个速度属性。speed 属性是汽车当前的速度&#xff0c;单位为 km/h&#xff1b; a. 执行一个 “accelerate ”方法&#xff0c;将汽车的速度提高 10&#xff0c;并将新速度记录到控制台&#xff1b; 3. a.…

笔记小结:现代卷积神经网络之批量归一化

本文为李沐老师《动手学深度学习》笔记小结&#xff0c;用于个人复习并记录学习历程&#xff0c;适用于初学者 训练深层神经网络是十分困难的&#xff0c;特别是在较短的时间内使他们收敛更加棘手。 本节将介绍批量规范化&#xff08;batch normalization&#xff09;&#xf…

Dav_笔记10:Using SQL Plan Management之3

将SQL计划基准与SQL Tuning Advisor一起使用 使用SQL Tuning Advisor调整SQL语句时&#xff0c;如果顾问程序找到调优计划并验证其性能优于从相应SQL计划基准中选择的计划&#xff0c;则建议接受SQL配置文件。 接受SQL配置文件后&#xff0c;数据库会将调整后的计划添加到相应…

群管机器人官网源码

一款非常好看的群管机器人html官网源码 搭建教程&#xff1a; 域名解析绑定 源码文件上传解压 访问域名即可 演示图片&#xff1a; 群管机器人官网源码下载&#xff1a;客户端下载 - 红客网络编程与渗透技术 原文链接&#xff1a; 群管机器人官网源码

云仓如何改变传统仓储模式?

云仓&#xff0c;即云仓储&#xff0c;是一种基于互联网技术的现代仓储模式&#xff0c;与传统的仓储模式相比&#xff0c;它在多个方面进行了创新和优化&#xff0c;包括&#xff1a; ———————————————————— 1、数据管理与实时监控&#xff1a; 云仓储利…

Element-ui :el-table 中表尾合计行

Table 表格 | Element Plus <template><el-table :data"tableData" border show-summary :summary-method"getSummariesss" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…

C++与lua联合编程

C与lua联合编程 一、环境配置二、lua基本语法1.第一个lua和C程序2.基本数据类型和变量2.1 Nil2.2 Booleans2.3 Numbers2.4 String(最常用) 3. 字符串处理3.1 错误处理3.2 字符串长度:string.len3.3 字符串子串 :string.sub3.4 字符串查找: string.find3.5字符串替换: string.gs…

【笔记】ubuntu 误退了搜狗输入法:终端上输入fcitx即可重启

有时候&#xff0c;我们可能嫌弃ubuntu上的搜狗输入法&#xff0c;点击了退出&#xff1a; 但是当我们想开启搜狗输入法时&#xff0c;发现它消失了&#xff0c;此时我们可以打开终端&#xff0c;键入&#xff1a; fcitx 即可成功开启。

一些和颜色相关网站

1.中国传统色 2.网页颜色选择器 3.渐变色网站 4.多风格色卡生成 5.波浪生成 6.半透明磨砂框 7.色卡组合