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

news2024/12/26 16:47:00

文档目标:

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

方案概述:

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

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

        方式三:语言检测处理器

目录:

        * elasticsearch docker-compose部署

        * 中日韩分词插件的安装

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

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

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

        * 结论

elasticsearch docker-compose部署

version: "3.1"
# 服务配置
services:
  elasticsearch:
    container_name: es01
    image: elasticsearch:8.12.2
    # restart: unless-stopped
    environment:
      - "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/plugins
    networks:
      - elastic_net
  kibana:
    container_name: kibana01
    image: kibana:8.12.2
    # restart: unless-stopped
    environment:
      - "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.yml
    networks:
      - elastic_net
    depends_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   es01

docker exec -it es01 bash

bin/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.coloradmin.cn/o/1892612.html

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

相关文章

Chirp信号生成(FPGA、基于cordic IP核)

一、Chirp生成模块介绍 采用Verilog 生成Chirp,实现输入使能电平,模块输出Chirp信号,Chirp信号频率范围,时间宽度,连续Chirp信号数量可配置。 二、模块例化方法示例 parameter FL d20_000 ; parameter FH…

如何在忘记密码的情况下重置Realme手机?

欢迎阅读我们关于如何在有或没有密码的情况下重置Realme手机的综合指南。无论您是忘记了密码,还是只是需要将设备恢复到出厂设置,我们都会为您提供所需的专业提示和技术专长。 发现分步说明、专家提示和行之有效的方法,轻松重新控制您的 Rea…

如何搭建10万个H100 GPU的集群:电力、并行化、网络拓扑与成本优化

引言 在现代人工智能的发展中,构建大规模GPU集群是提升计算能力的关键手段。今天我们探讨如何搭建一个包含10万个H100 GPU的集群。这个项目不仅涉及巨大的资本支出,还面临电力供应、并行化处理、网络拓扑结构以及可靠性和恢复等多方面的挑战。通过深入分…

zabbix 配置企业微信告警

1、申请一个企业微信, 官网链接 2、群内申请一个机器人 下载电脑版企业微信,登录后,在要接收群消息的群里,点击右上角三个点,添加机器人后,保存机器人的webhook地址 上传应用logo,填写应用名称…

破解电脑卡顿难题,将数据优化,5分钟提升运行速度

当电脑变得缓慢且反应迟钝时,工作效率和娱乐体验都会大打折扣。而电脑卡顿是由于系统资源占用过多、磁盘空间不足等原因引起的。因此,我们经常需要寻找优化措施,提升电脑的运行速度。文章整理了4个优化方法,帮助你破解卡顿难题&am…

5月1日起,《碳排放权交易管理暂行条例》正式施行

2024年5月1日,《碳排放权交易管理暂行条例》(以下简称《条例》)正式施行,作为我国应对气候变化领域的第一部专门法规,《条例》首次以行政法规的形式明确了碳排放权市场交易制度。 作为碳排放权交易市场的重要补充&…

将KVM虚拟机迁移为Virtualbox虚拟机

1、在KVM宿主机上把qcow2格式磁盘转成vdi格式 [rootkvm ~]# cd /kvm-data [rootkvm kvm-data]# qemu-img convert -f qcow2 wind30.qcow2 -O vdi wind30.vdi 注:把vdi转qcow2命令qemu-img convert -f vdi wind30.vdi -O qcow2 wind30.qcow2 2、把转换成功vdi磁盘…

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——新建工程

一、介绍 ​ 蓝桥杯嵌入式使用的单片机是STM32G431RBT6,内核ARM Cortex - M4,MCU+FPU,170MHz/213DMIPS,高达128KB Flash,32KB SRAM,其余的外设就不多介绍了,参照数据芯片数据手册 ​ CT117E-M4开发板资源:微控制器STM32G431RBT6、一路USB转串口、2.4寸TFT-LCD、4个功…

如何策划交互设计创意?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声,互动答疑环节往往反映了高校师生当前最普遍的运营困境,特此计老师在现场即兴答疑之外,会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

微信小程序一键打造专业简历

在这个竞争激烈的时代,一份出色的简历往往能成为你职业道路上的敲门砖。然而,对于大多数人来说,如何设计一份既美观又专业的简历却是一大难题。为了解决这一痛点,我们团队精心研发了一款微信小程序——“简历君”,它将…

【Qt之·类QVariant·数据类型】

系列文章目录 文章目录 前言一、概述二、操作及用法1.1 存储数据1.2 获取数据1.3 设置数据1.4 数据类型判断1.5 判断数据是否有效 三、实例演示总结 前言 QVariant是Qt开发中非常重要的一部分,它是Qt的一个核心类,用于处理不同数据类型之间的转换和传递。…

中伟视界:新疆维吾尔自治区矿山智能化案例揭秘——政策文件对AI算法模型的要求与平台功能详解

今天我们来剖析一下新疆维吾尔自治区矿山智能化的一个案例,重点讲解了一下新疆维吾尔自治区政策文件对矿山智能化的要求,矿山智能化案例针对政策文件要求做了哪些AI算法功能,其次讲讲新疆维吾尔自治区政策文件对平台及APP的要求和试点项目所完…

红酒与时尚秀场:品味潮流新风尚

在时尚与品味的交汇点上,红酒总是以其不同的方式,为每一次的时尚盛宴增添一抹诱人的色彩。当红酒遇上时尚秀场,不仅是一场视觉的盛宴,更是一次心灵的触动。今天,就让我们一起走进红酒与时尚秀场的世界,感受…

surfer做等值线图笔记

surfer等值线图及其白化 **grd文件的制作****白化的边界文件的制作****白化****绘图****逆转坐标轴** grd文件的制作 单击格网,选择x,y,z的数据,选择克里金插值方法,让后确定,保存grd文件 白化的边界文件的制作 surfer新建表&am…

实验四 SQL的数据定义语句

题目 通过SQL语句创建名为ecommerce1的数据库:CREATE DATABASE ecommerce1 2、在数据库ecommerce1中练习模式的创建和删除语句(如给用户li创建一个学生管理模式“S-T”)(需要先添加一个用户li) 3、在数据库ecommerce1中…

苏东坡传-读书笔记九

我们论到苏东坡,我们就不能避免“气”这个字。因为每个文学批评家综括苏东坡的个性,必用孟子所说的这个“气”字。 在《孟子》里,“气”是哲学的概念,类似柏格森所说的“生气勃勃”,是人格上的“元气”。使伟人和匹夫显…

jvm 03 JVM的运行时数据区域 ,(类常量池,运行时常量池,字符串常量池这个三个的区别),操作系统内存模型JMM和JVM的内存模型联系

方法区在jdk8后,改成元空间 JVM内存模型: JMM 主内存:本地方法区和堆 工作内存:私有的工作栈 其实一个JVM内存模型(主要就是运行时数据区域)一个Java进程的JMM,工作内存JVM中线程的内存区域…

路由LLM:优化模型调用的成本与效率

引言 在最近的一些视频和讨论中,我们经常提到使用较便宜和较快的模型来替代一些昂贵的大型语言模型(LLM)。这种方法的一个主要原因是看到许多人在不必要的场合调用如GPT-4或Claude Opus等高级模型,从而浪费了大量资金。而事实上&…

利用Arcgis绘制克吕金插值图

工作中我们常用到克吕金插值图,下面简单介绍下使用Arcmap绘制克吕金插值图的方法及注意事项,希望能帮到大家。 一、准备工作 软件:Arcgis 数据:点图层、研究范围 二、操作步骤 1 添加数据 打开Arcmap,从添加位置将…

springboot酒店管理系统-计算机毕业设计源码93190

目 录 摘 要 1 绪论 1.1 选题背景与意义 1.2开发现状 1.3论文结构与章节安排 2 酒店管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析…