Elasticsearch二次开发:实现实时定时同步同义词、近义词与停用词

Elasticsearch二次开发:实现实时定时同步同义词、近义词与停用词

引言

Elasticsearch(ES)作为开源搜索引擎的典范,以其强大的全文搜索、结构化搜索以及分析能力,在各个领域得到了广泛应用。在复杂的搜索场景中,同义词、近义词和停用词的处理对于提升搜索的准确性和用户体验至关重要。为了满足动态变化的业务需求,实现同义词、近义词与停用词的定时同步成为了一项关键任务。本文将详细介绍如何在Elasticsearch中实现这一功能,并给出具体的操作方案和业务场景说明。

一、业务场景说明

在电商平台的搜索场景中,用户输入的搜索关键词往往具有多样性。例如,用户可能搜索“电脑”或“计算机”,实际上这两者指的是同一类产品。此外,一些无意义的停用词如“的”、“了”等,在搜索时应该被忽略,以提高搜索效率。同时,随着业务的不断发展,新的同义词和近义词不断涌现,停用词列表也可能需要更新。因此,实现同义词、近义词与停用词的定时同步,对于提升搜索体验至关重要。

二、定时同步同义词、近义词与停用词的实现方案
1. 准备工作
  • 安装Elasticsearch:确保Elasticsearch已正确安装并运行。
  • 配置分词器:选择合适的中文分词器,如IK分词器,以支持中文文本的分词处理。
2. 创建同义词、近义词与停用词词典
  • 同义词词典:创建一个文本文件(如synonym.txt),每行包含一个词汇及其同义词,用逗号或制表符分隔。例如:

    电脑,计算机,PC
    高兴,快乐,愉悦
    
  • 近义词词典(可选):根据需要创建近义词词典,格式与同义词词典类似。

  • 停用词词典:创建一个文本文件(如stopword.txt),每行包含一个需要忽略的停用词。例如:

    的
    了
    是
    
3. 配置Elasticsearch索引

在Elasticsearch的索引设置中,定义同义词、近义词与停用词过滤器,并应用到相应的字段上。例如:

PUT /my_index
{"settings": {"analysis": {"filter": {"my_synonym_filter": {"type": "synonym","synonyms_path": "analysis/synonym.txt"},"my_stop_filter": {"type": "stop","stopwords_path": "analysis/stopword.txt"}},"analyzer": {"my_analyzer": {"tokenizer": "ik_smart","filter": ["my_synonym_filter", "my_stop_filter", "lowercase"]}}}},"mappings": {"properties": {"product_name": {"type": "text","analyzer": "my_analyzer"}}}
}
4. 实现定时同步

为了实现同义词、近义词与停用词的定时同步,可以采用以下几种方案:

  • 使用脚本或定时任务:编写脚本(如Shell脚本、Python脚本等),定期从远程服务器或数据库下载最新的词典文件,并替换Elasticsearch节点上的相应文件。然后,通过Elasticsearch的API触发索引的刷新操作,使新的词典生效。

    例如,使用Python脚本实现定时同步:

    import requests
    import os
    import timedef download_synonyms():url = "http://example.com/synonym.txt"response = requests.get(url)if response.status_code == 200:with open("analysis/synonym.txt", "w", encoding="utf-8") as file:file.write(response.text)def refresh_index():url = "http://localhost:9200/my_index/_flush"requests.post(url)def main():while True:download_synonyms()refresh_index()time.sleep(3600)  # 每隔一小时同步一次if __name__ == "__main__":main()
    
  • 使用Elasticsearch插件:利用一些第三方插件(如Dynamic Synonym for Elasticsearch)实现同义词词典的定时更新。这些插件通常支持从本地或远程服务器加载同义词词典,并定时自动更新,无需重启Elasticsearch服务。

    例如,配置Dynamic Synonym插件:

    PUT _cluster/settings
    {"persistent": {"dynamic_synonym.path": "http://example.com/synonym.txt","dynamic_synonym.interval": "3600000"  # 每隔一小时更新一次}
    }
    
5. 验证与测试
  • 验证词典同步:在定时任务或插件配置完成后,手动触发一次同步操作,检查Elasticsearch节点上的词典文件是否已更新。
  • 测试搜索功能:使用新的同义词、近义词与停用词进行测试搜索,确保搜索结果符合预期。
三、总结

通过实现同义词、近义词与停用词的定时同步,可以确保Elasticsearch的搜索功能始终与业务需求保持一致,提升搜索的准确性和用户体验。在实施过程中,需要根据具体的业务场景和需求选择合适的同步方案,并进行充分的验证与测试。

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

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

相关文章

LeetCode_438.找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 示例 1: 输入: s "cbaebabacd", p "abc" 输出: [0,6] 解释: 起始索引等于 0 的子串是 "cba", 它是 "a…

服务器迁移MySQL

由于公司原有的服务器不再使用,需要将老的服务器上的MySQL迁移到新的服务器上,因此需要对数据进行备份迁移,前提是两台服务器已安装相同版本的MySQL,这里就不再讲解MySQL的安装步骤了,可以安装包、可以在线下载、可以容…

前端【3】--CSS布局,CSS实现横向布局,盒子模型

盒子分类 1、块级盒子 2、内联级盒子 3、内联块级盒子 4、弹性盒子 5、盒子内部分区 方法一:使用 float 普通盒子实现横向布局 方法二:使用 display: inline-block 内联块级元素实现横向布局 方法三:使用弹性盒子 flexbox&#xff0…

uni-simple-router史上最全使用方法教程

在 uni-app 项目中,随着应用的复杂度增加,传统的路由管理方式可能无法满足需求,尤其是在多页面和权限控制等场景下。这时,使用像 uni-simple-router 这样的路由管理库可以简化开发流程👍,如权限控制、路由守…

Android SystemUI——NavigationBar导航栏(七)

前面的文章我们分析了状态栏 StatusBar 的构建流程,而导航栏 NavigationBar 其实是状态栏的一种,也是在 StatusBar 中被创建的,这里我们来看一下与其相近的导航栏 NavigationBar 的窗口的创建过程。 一、导航栏窗口 对于导航栏 NavigationBar 窗口创建,前面的流程与 Statu…

Mockito+PowerMock+Junit单元测试

一、单元测试用途 1、日常开发团队要求规范,需要对开发需求代码进行单元测试并要求行覆盖率达到要求,DevOps流水线也会开设相关门禁阀值阻断代码提交,一般新增代码行覆盖率80%左右。 二、Mock测试介绍 1、Mock是为了解决不同的单元之间由于…

分频器code

理论学习 数字电路中时钟占有非常重要的地位。时间的计算都依靠时钟信号作为基本单元。一般而言,一块板子只有一个晶振,即只有一种频率的时钟,但是数字系统中,经常需要对基准时钟进行不同倍数的分频,进而得到各模块所需…

Ubuntu上,ffmpeg如何使用cuda硬件解码、编码、转码加速

本文使用 Ubuntu 环境。Ubuntu 直接使用 APT 安装的就支持 CUDA 加速。本文使用这样下载的版本进行演示,你自己编译或者其他源的版本可能会不同。 ffmpeg 的一些介绍,以及 macOS 版本的 ffmpeg 硬件加速请见《macOS上如何安装(不需要编译安装…

WPS计算机二级•高效操作技巧

听说这里是目录哦 斜线表头 展示项目名称🍋‍🟩横排转竖排🍐批量删除表格空白行🍈方法一方法二建辅助列找空值 能量站😚 斜线表头 展示项目名称🍋‍🟩 选中单元格,单击右键➡️“设…

【Linux系列】查看服务器是否使用了 SSD 的多种方法

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

unity2022以上导出到AndroidStudio后更新步骤

1、unity里面Export出unityLibrary 2、导出apk,里面才包含libil2cpp(新版unity无法直接导出libil2cpp 3、注释AS项目app下的build.gradle里面包含unityLibrary的代码 4、注释AS项目settings.gradle包含unityLibrary的代码 5、删除AS项目里面的unityLibrary文件夹 6、…

Bash语言的函数实现

Bash语言的函数实现 Bash(Bourne Again SHell)是一种流行的命令行解释器,用于Unix和类Unix操作系统。它不仅支持命令行操作,还能通过脚本语言进行编程。函数是Bash脚本编程中的一个重要概念,可以帮助我们组织代码、提…

挖掘机检测数据集,准确识别率91.0%,4327张原始图片,支持YOLO,COCO JSON,PASICAL VOC XML等多种格式标注

挖掘机检测数据集,准确识别率91.0%,4327张图片,支持YOLO,COCO JSON,PASICAL VOC XML等多种格式标注 数据集详情 数据集分割 训练组70% 3022图片 有效集20% 870图片 测试集10&…

Android15源码编译问题处理

最近想在Raspberry Pi5上面运行自己编译的Android15镜像,参考如下链接来处理: GitHub - raspberry-vanilla/android_local_manifest GitHub - raspberry-vanilla/android_kernel_manifest 代码同步完后,编译就出问题了,总是提示: FAILED: analyzing Android.bp files and…

【框架篇】Spring MVC 介绍及使用(详细教程)

Spring MVC 介绍 1,MVC 设计模式 MVC(Model-View-Controller)是一种常见的软件设计模式,用于将应用程序的逻辑分离成三个独立的组件: 模型(Model):模型是应用程序的数据和业务逻辑…

Spring Boot中的自动配置原理是什么

Spring Boot 自动配置原理 Spring Boot 的自动配置机制基于 条件化配置,通过 EnableAutoConfiguration 注解来启用。自动配置的核心原理是 基于类路径和环境条件来推断所需要的配置,Spring Boot 会根据项目中引入的依赖和当前环境来自动装配相关的配置项…

管理口令安全和资源(一)

学习目标 Manage passwords using profiles: 使用配置文件(profiles)来管理密码。这意味着你应该能够设置和修改密码策略,比如密码的复杂性、有效期、尝试次数限制等。在Oracle数据库中,配置文件是一组可以应用于所有用户的预定义…

qt vs ios开发应用环境搭建和上架商店的记录

qt 下载链接如下 https://download.qt.io/new_archive/qt/5.14/5.14.2/qt-opensource-mac-x64-5.14.2.dmg 安装选项全勾选就行,这里特别说明下qt5.14.2/qml qt5.14.2对qml支持还算成熟,但很多特性还得qt6才行,这里用qt5.14.2主要是考虑到服…

windows 极速安装 Linux (Ubuntu)-- 无需虚拟机

1. 安装 WSL 和 Ubuntu 打开命令行,执行 WSL --install -d ubuntu若报错,则先执行 WSL --update2. 重启电脑 因安装了子系统,需重启电脑才生效 3. 配置 Ubuntu 的账号密码 打开 Ubuntu 的命令行 按提示,输入账号,密…

AI编程工具使用技巧——通义灵码

活动介绍通义灵码1. 理解通义灵码的基本概念示例代码生成 2. 使用明确的描述示例代码生成 3. 巧妙使用注释示例代码生成 4. 注意迭代与反馈原始代码反馈后生成优化代码 5. 结合生成的代码进行调试示例测试代码 其他功能定期优化生成的代码合作与分享结合其他工具 总结 活动介绍…