成功解决ES高亮内容引起的字段显示不一致问题

在处理搜索引擎(如Elasticsearch)结果时,常见需求之一是对用户搜索的关键词进行高亮显示,这有助于用户快速识别搜索结果为何与其查询相关。但在实际应用中,如果处理不当,直接使用高亮片段可能会导致原始数据的部分内容丢失。

问题描述,不同检索条件检索出同一内容, 显示的内容不一致问题

在搜索结果中,通常需要将用户搜索的关键词高亮显示。搜索API(如Elasticsearch)通常会返回一个高亮字段,其中相关的搜索关键词被特定的HTML标签包围。如果简单地将这些高亮字段替换到原始文本中,那么未被高亮的原始文本部分可能会被覆盖丢失。

问题截图

在这里插入图片描述
在这里插入图片描述

原因截图

在这里插入图片描述

原因分析

此问题通常发生在只将高亮字段作为完整字段内容插入到结果中时。由于高亮数组仅包含匹配的部分,直接替换可能会覆盖整个字段,导致原始文本中的非匹配内容被丢弃。

解决方案

正确的处理方式是将高亮文本与原始文本合并,确保原始数据的完整性。以下是具体实现的步骤和代码:

private String mergeHighlightedText(String field, Map<String, HighlightField> highlightFields, Map<String, Object> originalData) {// 获取高亮字段HighlightField highlightField = highlightFields.get(field);if (highlightField != null) {// 构建高亮文本字符串Text[] fragments = highlightField.getFragments();StringBuilder highlightedTextBuilder = new StringBuilder();for (Text fragment : fragments) {highlightedTextBuilder.append(fragment.string());}String highlightedText = highlightedTextBuilder.toString();// 获取原始数据String originalText = originalData.getOrDefault(field, "").toString();// 替换原始文本中被高亮的部分,同时保留原始文本中未被高亮的部分// 假设高亮文本已经适当处理了原始文本中的文本片段String regex = "\\Q" + highlightedText.replaceAll("<span style='color: red;'>|</span>", "") + "\\E";originalText = originalText.replaceAll(regex, highlightedText);return originalText;} else {// 如果没有高亮字段,使用原始数据return originalData.getOrDefault(field, "").toString();}
}
应用示例

以下是如何在实际应用中使用上述方法:

Map<String, Object> originalData = hit.getSourceAsMap();
Map<String, HighlightField> highlightFields = hit.getHighlightFields();// 对每个需要处理的字段执行上述方法
String title = mergeHighlightedText("title", highlightFields, originalData);
String abstractX = mergeHighlightedText("abstract", highlightFields, originalData);
// 继续处理其他字段...
优点
  • 完整性保障:此方法确保了原始数据的完整性,不会因高亮处理而丢失。
  • 用户体验提升:通过高亮显示,用户可以更快地理解搜索结果的相关性。
  • 代码灵活性:可以根据实际需求调整正则表达式和替换逻辑,适应不同的搜索引擎和标记。
结论

正确处理搜索结果中的高亮显示与原始数据的整合对于提供清晰、全面的用户体验至关重要。上述方法提供了一种有效的方式来确保即使在内容以集合形式存在时,用户也能获得完整且准确的搜索结果显示。这种方法不仅增强了信息的可读性,还确保了数据的完整性。

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

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

相关文章

A股站不稳3000点让人稀罕不已啊

今天的A股&#xff0c;让人稀罕不已&#xff0c;你知道是为什么吗&#xff1f;盘面出现2个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市冲了下3000点&#xff0c;第一个主题炒作的热点终于出现了&#xff0c;税改方向的行情发酵&#xff0c;并带动着其他改革相关方…

【JavaScript脚本宇宙】从Cypress到Nightwatch.js:全面解析前端自动化测试工具

深度剖析&#xff1a;各大前端测试框架的特点与优劣势 前言 本文将介绍六种流行的前端测试工具&#xff0c;包括Cypress、TestCafe、Selenium、Puppeteer、Playwright和Nightwatch.js。每种工具都有其独特的功能特点和优缺点&#xff0c;并在不同的使用场景中发挥作用。通过本…

echarts的折线图实现部分虚线部分实线

场景&#xff1a; 折线图一般都是实线为准&#xff0c;但是由于最后一个数据是预测。所以想要实现最后一段为虚线。 效果图&#xff1a; 具体实现&#xff1a; series:[{name: "销售总金额",type: "line",smooth: true,barWidth: 10,stack: Total,itemSty…

Ubuntu下反弹shell的思考

目录 Ubuntu的命令执行环境 bash (Bourne Again SHell): sh (Bourne SHell): dash (Debian Almquist SHell): 它们之间的关系&#xff1a; 可能遇到的问题 一、脚本权限问题 二、命令执行环境(shell解释器)问题 如何解决&#xff1f; 1.修改/bin/sh软连接的指向为bas…

【PYG】Planetoid()加载数据集中的预定义的属性和数据归一化

文章目录 Planetoid数据集属性访问这些属性示例输出解释使用数据集属性在模型中 NormalizeFeatures为什么要归一化特征NormalizeFeatures 变换示例代码整体示例总结 在 PyTorch Geometric 中&#xff0c; Planetoid 类加载的数据集具有一些预定义的属性&#xff0c;用于访问有…

Java中的服务注册与发现原理与实现

Java中的服务注册与发现原理与实现 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨Java中的服务注册与发现的原理及其实现方式。在现代分布式…

ESP32CAM物联网教学01

ESP32CAM物联网教学01 拍照 视频 这么小的一个开发板都带上摄像头了&#xff0c;能拍照&#xff1f;能视频吗&#xff1f;现在就跟着我做起来。 初识ESP32CAM 我们到淘宝搜索“ESP32Cam”&#xff0c;就能买到这样一块开发板。 ESP32Cam是双核处理器&#xff0c;提供WIFI和…

Cyuyanzhong的内存函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、memcpy函数的使用与模拟实现二、memmove函数的使用和模拟实现三、memset函数与memcmp函数的使用&#xff08;一&#xff09;、memset函数&#xff08;内存块…

白骑士的C语言教学基础篇 1.4 函数与递归

系列目录 上一篇&#xff1a;白骑士的C语言教学基础篇 1.3 控制流 在这一篇内容中&#xff0c;我们将介绍C语言中的函数及其用法&#xff0c;包括函数的定义与调用、函数参数与返回值&#xff0c;以及递归函数。函数是C语言中最重要的结构之一&#xff0c;它允许我们将代码组织…

Linux shell编程学习笔记59: ps 获取系统进程信息,类似于Windows系统中的tasklist 命令

0 前言 系统进程信息是电脑网络信息安全检查中的一块重要内容&#xff0c;对于使用Linux和基于Linux作为操作系统的电脑来说&#xff0c;可以使用ps命令。 1 ps命令 的功能、格式和选项说明 1.1 ps命令 的功能 Linux 中的ps&#xff08;意为&#xff1a;process status&…

Chrome导出cookie的实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

leetcode刷题:vector刷题

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;leetcode刷题 1.只出现一次的数字 这道题很简单&#xff0c;我们只需要遍历一次数组即可通过异或运算实现。(一个数与自身异或结果为0&#xff0c;任何数与0异或还是它本身) class Solut…

GitHub每日最火火火项目(7.2)

Asabeneh / 30 - Days - Of - Python&#xff1a;这是一个为期30天的Python编程挑战项目&#xff0c;旨在通过逐步引导的方式帮助学习者在30天内掌握Python编程语言。然而&#xff0c;实际完成这个挑战可能需要超过100天&#xff0c;学习者可以根据自己的节奏进行。该项目还提供…

WPF UI 3D 基本概念 点线三角面 相机对象 材质对象与贴图 3D地球 光源 变形处理 动作交互 辅助交互插件 系列三

WPF UI交互专题 平面图形 Path Drawing 绘图 渐变 Brush 矩阵 Transform 变形 阴影效果 模糊效果 自定义灰度去色效果 系列二-CSDN博客 1软件中的3D基本概念 WPF 中 3D 功能的设计初衷并非提供功能齐全的游戏开发平台。 WPF 中的 3D 图形内容封装在 Viewport3D 元素中&#x…

2024年华为OD机试真题-分披萨-C++-OD统一考试(C卷D卷)

2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述: “吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数扇形小块。但是粗心服务员将披萨切成了每块大小都完全不同奇数块,且…

【linux命令】文件拷贝工具scp

scp是secure copy的缩写&#xff0c;用于linux之间复制文件和目录&#xff0c;基于ssh登录进行安全的远程文件拷贝命令。这个尤其在一些自动化活动中非常有用。 一、从本地复制到远程 # 语法 # scp -r -P remote_port local_folder remote_userremote_ip:remote_folder# 把本…

1+X 老年照护实训室:老年心理护理的重要性

随着人口老龄化的加剧&#xff0c;老年人口比例不断增加&#xff0c;老年心理健康问题日益凸显。老年心理护理作为老年照护的重要组成部分&#xff0c;对于老年人的身心健康具有重要意义。本文从老年心理护理的定义、重要性和实践意义等方面进行探讨&#xff0c;并提出了提高老…

WPF自定义模板--Button

属性&#xff1a; TemplateBinding&#xff1a;用于在ControlTemplate中绑定到控件的属性&#xff0c;例如Background、BorderBrush等。TargetType&#xff1a;指定该模板应用于哪种控件类型。在这个例子中&#xff0c;是Button。 标准的控件模板代码&#xff1a; <Style…

C# 实现 Modbus TCP 服务端客户端寄存器

以下是一个使用 C# 实现 Modbus TCP 服务端的示例代码。这个示例使用了 NModbus4 库&#xff0c;这是一个开源的 Modbus 库&#xff0c;支持 Modbus TCP 和 Modbus RTU 协议。 首先&#xff0c;您需要安装 NModbus4 库。您可以通过 NuGet 包管理器来安装&#xff1a; Install…

.NETCORE JWT 二

1.自动续期 using **.**.Common.Helper; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using New…