使用elasticsearch完成多语言搜索的三种方式

文档目标:

        基于elasticsearch,实现不同语言搜索特定语言的文档数据;比如输入中文的内容,搜索中文文档数据,输入英文搜索英文文档数据,日韩文类似

方案概述:

        方式一:不同的语言使用不同的索引

        方式二:使用多字段处理不同语言

        方式三:语言检测处理器

目录:

        * elasticsearch docker-compose部署

        * 中日韩分词插件的安装

        * 使用不同的索引保存不同语言文档,并进行搜索

        * 使用多字段处理不同语言进行搜索

        * 使用语言检测处理器处理文档并进行搜索

        * 结论

elasticsearch docker-compose部署

version: "3.1"
# 服务配置
services:elasticsearch:container_name: es01image: elasticsearch:8.12.2# restart: unless-stoppedenvironment:- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"- "TZ=Asia/Shanghai"- "discovery.type=single-node"- "ELASTIC_PASSWORD=123456"ports:- "9200:9200"  - "9300:9300"volumes:# - ./config:/usr/share/elasticsearch/config- elastic-data:/usr/share/elasticsearch/data- ./plugins:/usr/share/elasticsearch/pluginsnetworks:- elastic_netkibana:container_name: kibana01image: kibana:8.12.2# restart: unless-stoppedenvironment:- "TZ=Asia/Shanghai"- "I18N_LOCALE=zh-CN"- "ELASTICSEARCH_HOSTS=http://elasticsearch:9200"- "ELASTICSEARCH_USERNAME=test"- "ELASTICSEARCH_PASSWORD=123456"ports:- "5601:5601"#volumes:#- ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.ymlnetworks:- elastic_netdepends_on:- elasticsearch
# 网络配置
networks:elastic_net:driver: bridge# docker 卷
volumes:elastic-data:

注:启动后需要登录es01容器进行添加用户角色操作:

docker exec -it es01 bash
elasticsearch-users useradd test
elasticsearch-users roles -a superuser test
elasticsearch-users roles -a kibana_system test

中日韩分词插件的安装(默认是英文分词器)

分在线安装和离线安装,下面提供一个在线安装方式:

# 中文插件ik安装
./bin/elasticsearch-plugin install https://github.com/infinilabs/analysis-ik/releases/download/v8.12.2/elasticsearch-analysis-ik-8.12.2.zip# 日语分词器安装
bin/elasticsearch-plugin install analysis-kuromoji# 韩语分词器
bin/elasticsearch-plugin install analysis-nori

使用不同的索引保存不同语言文档,并进行搜索

这里提供一个python代码示例,日韩分词器类似:

#coding=utf-8
from elasticsearch import Elasticsearch# 创建Elasticsearch客户端
# es = Elasticsearch()
# 实例化一个ip为localhost,端口为9200,允许超时一小时的es对象
es = Elasticsearch(hosts="localhost", port=9200, timeout=3600, http_auth=('test', '123456'))# 创建一个中文索引,并指定分词器
chinese_index = es.indices.create(index="my_chinese_index", body={"settings": {"analysis": {"analyzer": {"my_chinese_analyzer": {"tokenizer": "ik_smart"}}}}
})# 创建一个英文索引,并指定分词器
english_index = es.indices.create(index="my_english_index", body={"settings": {"analysis": {"analyzer": {"my_english_analyzer": {"tokenizer": "standard"}}}}
})# 创建一个中文文档
chinese_document = {"title": "中文文档","content": "这是一个中文文档"
}# 创建一个英文文档
english_document = {"title": "English Document","content": "This is an English document"
}# 将中文文档添加到中文索引
es.index(index="my_chinese_index", body=chinese_document)# 将英文文档添加到英文索引
es.index(index="my_english_index", body=english_document)# 搜索中文文档
chinese_result = es.search(index="my_chinese_index", body={"query": {"match": {"content": "中文文档"}}
})# 搜索英文文档
english_result = es.search(index="my_english_index", body={"query": {"match": {"content": "English Document"}}
})print(chinese_result)
print(english_result)

使用多字段处理不同语言进行搜索

该方式将文本存储在四个字段内并使用四种分析工具进行分析,这可能会浪费我们的宝贵时间和存储空间

创建索引:

# 登录kibana控制台操作
PUT /test
{"mappings": {"properties": {"body": {"type": "text","fields": {"korean_field": {"analyzer": "nori","type": "text"},"japanese_field": {"analyzer": "kuromoji","type": "text"},"chinese_field": {"analyzer": "ik_smart","type": "text"}}}}}
}

插入语言数据:

POST /test/_doc
{"body" : "세계인의 축제, 제23회 동계올림픽대회는 대한민국 강원도 평창에서 2018년 2월 9일부터 25일까지 17일간 개최됩니다. 대한민국 평창은 세 번의 도전 끝에 지난 2011년 7월 6일 열린 제123차 IOC 총회에서 과반 표를 획득하며 2018년 동계올림픽 개최지로 선정되었습니다. 이로써 대한민국에서는 1988년 서울 올림픽 이후 30년 만에, 평창에서 개∙폐회식과 대부분의 설상 경기가 개최되며, 강릉에서는 빙상 종목 전 경기가, 그리고 정선에서는 알파인 스키 활강 경기가 개최될 예정입니다."
}
POST /test/_doc
{"body" : "The XXIII Olympic Winter Games will be held for 17 days from 9 to 25 February 2018 in PyeongChang, Gangwon Province, the Republic of Korea. PyeongChang was selected as the host city of the 2018 Olympic Winter Games after receiving a majority vote at the 123rd IOC Session held on 6 July 2011 after three consecutive bids. The Olympic Winter Games will be held in Korea for the first time in 30 years after the Seoul Olympic Games in 1988. PyeongChang will be the stage for the Opening and Closing Ceremonies and most snow sports. Alpine speed events will take place in Jeongseon, and all ice sports will be competed in the coastal city of Gangneung."
}
POST /test/_doc
{"body" : "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123届国际奥委会全会上被选定为2018年冬季奥运会的主办地。由此,韩国自1988年举办首尔夏季奥运会以后,时隔30年,将首次举办冬季奥运会。该届冬奥会的开·闭幕式以及大部分的雪上运动将在平昌进行,而所有冰上运动将在江陵、高山滑雪滑降比赛则将在旌善进行。"
}
POST /test/_doc
{"body" : "世界の人々の祝祭、第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17日間、開催されます。大韓民国・平昌は三度の挑戦の末、2011年7月7日に開かれた第123回IOC総会で過半数票を獲得し、2018年冬季オリンピック及びパラリンピックの開催地に選ばれました。これにより1988年ソウルオリンピック開催後30年の時を経てついに、大韓民国で最初の冬季パラリンピックの舞台が繰り広げられます。平昌で開・閉会式とほぼ全ての雪上競技が開催され、江陵では氷上種目全競技が、そして旌善ではアルペンスキー滑降競技が開催される予定です。"
}

搜索测试:

# 英文搜索
GET /test/_search
{"query": {"multi_match": {"query": "Olympic Games","fields": ["body"]}}
}
POST /test/_search
{"query": {"multi_match": {"query": "Olympic Games","fields": ["body","body.korean_field","body.chinese_field","body.japanese_field"]}}
}# 韩文搜索
POST /test/_search
{"query": {"multi_match": {"query": "올림픽대회","fields": ["body","body.korean_field","body.chinese_field","body.japanese_field"]}}
}# 使用 multi_match 查询,所以主字段(英语)或针对具体语言的子字段会进行匹配
# 日文和中文文本都可能会包含汉字,所以查询可能会返回两种文本。 您既可以显示所有结果,也可以挑选分数最高的结果。
# 日文搜索
POST /test/_search
{"query": {"multi_match": {"query": "オリンピック大会","fields": ["body","body.korean_field","body.chinese_field","body.japanese_field"]}}
}# 中文搜索
POST /test/_search
{"query": {"multi_match": {"query": "奥运会","fields": ["body","body.korean_field","body.chinese_field","body.japanese_field"]}}
}

使用语言检测处理器处理文档并进行搜索

利用可检测语言的摄取插件 来节省时间和存储空间,摄取管道会检测“正文”字段的语言并且会通过语言检测处理器将检测到的语言放到“语言”字段中,而非将其索引至主字段和三个子字段中

环境问题:需要安装语言检测插件安装,切换成es 8.4.0版本测试(es版本不能高于8.5.0,插件版本比较低,所以需要查看支持的最高版本es来进行安装部署):

docker ps |grep es
ec75175a5302   elasticsearch:8.4.0   "/bin/tini -- /usr/l…"   About an hour ago   Up 27 minutes      0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp   es01docker exec -it es01 bashbin/elasticsearch-plugin install https://github.com/spinscale/elasticsearch-ingest-langdetect/releases/download/8.4.0.1/ingest-langdetect-8.4.0.1.zip

配置管道:

PUT _ingest/pipeline/langdetect-pipeline
{"description": "A pipeline to do whatever","processors": [{"langdetect": {"field": "body","target_field": "language"}},{"script": {"lang": "painless","source": "if (ctx.language == 'ko') ctx.korean_field = ctx.body; if (ctx.language == 'ja') ctx.japanese_field = ctx.body; if (ctx.language == 'zh-cn') ctx.chinese_field = ctx.body; if (ctx.language == 'en') ctx.english_field = ctx.body;"}}]
}

创建索引:

DELETE test2
PUT /test2
{"mappings": {"properties": {"body": {"type": "text"},"english_field": {"type": "text"},"korean_field": {"analyzer": "nori","type": "text"},"japanese_field": {"analyzer": "kuromoji","type": "text"},"chinese_field": {"analyzer": "ik_smart","type": "text"}}}
}

插入文档时,指定语言检测管道

PUT /test2/_doc?pipeline=langdetect-pipeline
{"body" : "The XXIII Olympic Winter Games will be held for 17 days from 9 to 25 February 2018 in PyeongChang, Gangwon Province, the Republic of Korea. PyeongChang was selected as the host city of the 2018 Olympic Winter Games after receiving a majority vote at the 123rd IOC Session held on 6 July 2011 after three consecutive bids. The Olympic Winter Games will be held in Korea for the first time in 30 years after the Seoul Olympic Games in 1988. PyeongChang will be the stage for the Opening and Closing Ceremonies and most snow sports. Alpine speed events will take place in Jeongseon, and all ice sports will be competed in the coastal city of Gangneung."
}
PUT /test2/_doc?pipeline=langdetect-pipeline
{"body" : "제23회 동계올림픽대회는 대한민국 강원도 평창에서 2018년 2월 9일부터 25일까지 17일간 개최됩니다. 대한민국 평창은 세 번의 도전 끝에 지난 2011년 7월 6일 열린 제123차 IOC 총회에서 과반 표를 획득하며 2018년 동계올림픽 개최지로 선정되었습니다. 이로써 대한민국에서는 1988년 서울 올림픽 이후 30년 만에, 평창에서 개∙폐회식과 대부분의 설상 경기가 개최되며, 강릉에서는 빙상 종목 전 경기가, 그리고 정선에서는 알파인 스키 활강 경기가 개최될 예정입니다."
}
PUT /test2/_doc?pipeline=langdetect-pipeline
{"body" : "第23届冬季奥运会将于2018年2月9日-25日在韩国江原道平昌展开。韩国平昌在第三次申奥之后,于2011年7月6日召开的第123届国际奥委会全会上被选定为2018年冬季奥运会的主办地。由此,韩国自1988年举办首尔夏季奥运会以后,时隔30年,将首次举办冬季奥运会。该届冬奥会的开·闭幕式以及大部分的雪上运动将在平昌进行,而所有冰上运动将在江陵、高山滑雪滑降比赛则将在旌善进行。"
}
PUT /test2/_doc?pipeline=langdetect-pipeline
{"body" : "第23回冬季オリンピック大会は大韓民国江原道平昌で2018年2月9日から25日までの17日間、開催されます。大韓民国・平昌は三度の挑戦の末、2011年7月7日に開かれた第123回IOC総会で過半数票を獲得し、2018年冬季オリンピック及びパラリンピックの開催地に選ばれました。これにより1988年ソウルオリンピック開催後30年の時を経てついに、大韓民国で最初の冬季パラリンピックの舞台が繰り広げられます。平昌で開・閉会式とほぼ全ての雪上競技が開催され、江陵では氷上種目全競技が、そして旌善ではアルペンスキー滑降競技が開催される予定です。"
}

搜索测试:

韩语
POST /test2/_search
{"query": {"multi_match": {"query": "올림픽대회","fields": ["english_field","korean_field","chinese_field","japanese_field"]}},"_source": "body"
}英语
POST /test2/_search
{"query": {"multi_match": {"query": "Olympic Games","fields": ["english_field","korean_field","chinese_field","japanese_field"]}},"_source": "body"
}日语
POST /test2/_search
{"query": {"multi_match": {"query": "オリンピック大会","fields": ["english_field","korean_field","chinese_field","japanese_field"]}},"_source": "body"
}中文
POST /test2/_search
{"query": {"multi_match": {"query": "奥运会","fields": ["english_field","korean_field","chinese_field","japanese_field"]}},"_source": "body"
}

注:输入日文测试是,还是会返回日文和韩文,所以还是得根据评分高低来获取指定数据

结论

        推荐使用第一种,能隔离不同语言文档的搜索结果;方案二的缺点:会将文本存储在四个字段内并使用四种分析工具进行分析,这可能会浪费的大量时间和存储空间;第三方案是第二方案的优化

参考文档:

如何使用 Elasticsearch 6.2 搜索中文、日语和韩语文本 - 第 3 部分:语言检测工具 | Elastic Blog

Japanese (kuromoji) analysis plugin | Elasticsearch Plugins and Integrations [8.14] | Elastic

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

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

相关文章

使用Ubuntu 22.04安装Frappe-Bench【二】

系列文章目录 第一章 使用VMware创建Ubuntu 22.04【一】 文章目录 系列文章目录前言什么是Frappe-Bench?使用安装ERPNext能实现什么效果? 官网给了一个说明 一、使用Ubuntu 22.04安装Frappe-Bench一、安装要求二、安装命令三、 可能出现问题 总结 前言 …

【计算机毕业设计】026基于微信小程序的原创音乐

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

MySQL触发器-插入-修改-删除和储存过程

1、商品表修改语句添加触发器,要求在修改商品售价时不允许上下浮动超过10%。 BEGINDECLARE old_price DECIMAL(10,2);DECLARE new_price DECIMAL(10,2);DECLARE price_change DECIMAL(10,2);-- 获取新旧价格SET old_price OLD.price;SET new_price NEW.price;-- …

Linux多进程和多线程(五)进程间通信-消息队列

多进程(五) 进程间通信 消息队列 ftok()函数创建消息队列 创建消息队列示例 msgctl 函数示例:在上⼀个示例的基础上,加上删除队列的代码 发送消息 示例: 接收消息示例 多进程(五) 进程间通信 消息队列 消息队列是一种进程间通信机制,它允许两个或多个…

LCD显示从电路IC 到 驱动编写调试

文章目录 LCD驱动电路IC简述Panel 模块驱动图示含义接口与连接 Panel内部驱动驱动原理框图TCON(Timing Controller):时序控制器。一、控制屏幕时序与信号驱动二、提升图像质量三、接口支持与兼容性四、市场应用广泛 Gate控制信号工作时序Source Driver IC原理框图 LCD驱动应该怎…

JAVA—图形化“登录,注册”界面

前言:学习了一段时间JAVA的swing组件,心血来潮写了一个登录,注册界面。 知道大伙喜欢美女,所以把用户登录界面背景设置成了beauty! 所用知识基本上都属于swing组件: javax.siwng.JFrame; //窗体类 javax.sw…

【第四套】华为 2024 年校招-硬件电源岗

1、 其他参数不变,当 LLC 谐振电路的 Lm 增⼤时,描述错误的是 A.⼯作频率范围变⼩ B.关断电流减⼩ C.关断损耗减⼩ D.谐振电感减⼩ 2、 五类双绞线带宽可达 A. 10MHZ B. 20 MHZ C. 1GHZ D. 100MHZ 3、 当⽇照条件达到⼀定程度时,太阳能电池由于⽇照的变化⽽引起较明…

MyBatis 插入数据库生成id问题

核心代码 Mapper配置文件 <!-- 批量插入标签并返回主键 --> <insert id"insertBatch" parameterType"list" useGeneratedKeys"true" keyProperty"tagId">INSERT INTO tag (label)VALUES<foreach collection"lis…

c++习题08-计算星期几

目录 一&#xff0c;问题 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 首先&#xff0c;需要注意到的是3^2000这个数值很大&#xff0c;已经远远超过了long long 数据类型能够表示的范围&#xff0c;如果想要使用指定的数据类型来保存…

14-18 2024 年影响企业 GenAI 的关键技术趋势

现在&#xff0c;大多数 .com 公司已于 2023 年更名为 .ai&#xff0c;那么价值万亿美元的问题是&#xff1a;接下来会发生什么&#xff1f;哪些关键障碍、工具、技术和方法将重塑格局 企业 AI 的不同之处在于&#xff0c;它专注于可衡量、可管理的输出&#xff0c;企业可以控…

Docker容器基础:Docker的安装与基本使用

Docker容器基础&#xff1a;Docker的安装与基本使用 前言 Docker是一种开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux机器上&#xff0c;也可以实现虚拟化。本文将介绍Docker的安装…

前端Web开发HTML5+CSS3+移动web视频教程 Day4 CSS 第2天

P44 - P 四个知识点&#xff1a; 复合选择器 CSS特性 背景属性 显示模式 复合选择器 复合选择器仍然是选择器&#xff0c;只要是选择器&#xff0c;作用就是找标签。复合选择器就是把基础选择器进行组合使用。组合了之后就可以在大量的标签里面更快更精准地找标签了。找…

redis实现简单分布式锁

1.redisTemplate实现简单分布式锁 AutowiredRedisTemplate redisTemplate;/*** redis分布式锁演示案例&#xff0c;此处使用redisTemplate* param stockId 此处以扣减库存为例子&#xff0c;stockId代表要扣减库存的商品id,库存数据是提前存在redis的&#xff0c;并和数据库进…

Qt中线程的使用

目录 1 .QThread重要信号和函数 1.1 常用共用成员函数 1.2信号和槽函数 1.3静态函数 1.4 任务处理函数 2.关于QThread的依附问题&#xff1a; 3.关于connect连接 4.QThread的使用 5.线程池QThreadPool 5.1. 线程池的原理 5.2&#xff0e;QRunable类 5.3. QThreadPoo…

Java8新特性常见用法

Java8新特性 示例类Stream API 使用示例forEach:遍历Stream:创建流map:转换元素filter:过滤元素collect(收集元素) 和 Collectors(分组、连接)sorted 和 comparing(搭配排序)toMap:转换Map元素collectingAndThen:过滤掉相同数据toUpperCase:转大写distinct:去重c…

安装维修制氮设备的注意指南

制氮设备在许多工业领域都发挥着重要作用&#xff0c;无论是确保生产过程中的氮气供应&#xff0c;还是维持设备的稳定运行&#xff0c;正确的安装和维修都是关键。以下是一些重要的注意事项&#xff0c;帮助您顺利完成制氮设备的安装与维修工作。 一、安装注意事项 (一)选址与…

独孤思维:你自己都不相信的副业,怎么能赚钱

要明白&#xff0c;你做副业的目的是什么&#xff1f; 如果你打心眼里&#xff0c;看不上这个项目&#xff0c;或者心不甘情不愿的被动推进项目的实操。 那么我建议你直接放弃。 不要不情愿地去做。 不要当成任务去完成。 如果抱着这份心态去做副业。 你的副业&#xff0…

VUE自定义新增、复制、删除dom元素

功能需求&#xff0c;能灵活新增或删除一个dom元素&#xff0c;在此dom元素中还存在能灵活新增、删除的dom元素。实现后功能图如下&#xff1a; 点击新增策略&#xff0c;能新增整个策略dom 实现思路&#xff1a;定义一个数量和一个数组&#xff0c;然后使用循环遍历展示内容&a…

一种特殊的二叉树 哈夫曼树(Huffman Tree)

哈夫曼树(Huffman Tree)是一种特殊的二叉树,它在信息编码领域有着广泛的应用,特别是在数据压缩技术中。下面我将通过图文结合的方式,详细介绍哈夫曼树的概念、构建方法以及应用场景。 哈夫曼树的概念 哈夫曼树是一种特殊的二叉树,由David Huffman于1952年提出。它主要用…

将iStoreOS部署到VMware ESXi变成路由器

正文共&#xff1a;888 字 19 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面把iStoreOS部署到了VMware workstation上&#xff08;将iStoreOS部署到VMware Workstation&#xff09;。如果想把iStoreOS直接部署到ESXi上&#xff0c;你会发现转换镜像不能直接生成OVF或者OV…