当前位置: 首页 > news >正文

Elasticsearch 自定义分成器 拼音搜索 搜索自动补全 Java对接

介绍

通常用于将文档中的文本数据拆分成易于索引的词项(tokens)。有时,默认的分词器无法满足特定应用需求,这时就可以创建 自定义分词器 来实现定制化的文本分析。

自定义分词器组成

  • Char Filters(字符过滤器):
    字符过滤器在文本被传给分词器之前,先对字符进行预处理。常见的处理包括去除特殊字符、替换字符、转换字符等。
    例如:html_strip 字符过滤器可以去除 HTML 标签,mapping 字符过滤器可以将某些字符映射为其他字符。

  • Tokenizer(分词器):
    将输入的文本拆分成一个个词项(tokens)。
    常见的分词器有 standard、keyword、pattern、whitespace 等,也可以自定义一个分词器来根据特定规则进行分割。

  • Token Filters(词项过滤器):
    词项过滤器用于对分词后的词项进行进一步的处理,如小写化、去除停用词、词干提取等。
    例如,lowercase 过滤器将所有词项转为小写,stop 过滤器会去除常见的无意义词(如 “a”, “the” 等)。

注意事项

  • 倒排索引:在构建倒排索引时,拼音分词器可以将每个词语转化为拼音,并为每个拼音索引相关的文档。这种方法依赖于拼音本身,因此在创建索引时,拼音是一个便于检索和存储的统一标准。然而,这种方法并不考虑具体的字或词的实际含义。
  • 搜索时的查询:在搜索过程中,用户通常会直接输入汉字(而不是拼音),而且搜索时往往依赖的是汉字的实际语义。如果使用拼音进行搜索,可能会出现同音字或多音字的歧义,导致用户查询无法准确匹配目标内容。例如,拼音 “mā” 可以代表“妈”、“马”或“麻”,但用户搜索的汉字可能是“马”而不是“妈”,此时拼音搜索就会产生误差。

这时候搜索和创建应该使用不同的分词器。所以就需要使用自定义分词器。自定义分词器在创建索引库的时候就应该创建。

创建自定义分词器的索引库

PUT http://172.23.4.130:9200/goods

{"settings": {"analysis": {"analyzer": {"mx_analyzer": {  // 定义自定义分析器名称为 mx_analyzer"tokenizer": "ik_max_word",  // 使用 "ik_max_word" 分词器,进行中文最大化分词"filter": "py"  // 使用拼音过滤器 "py" 进行拼音转换}},"filter": {"py": {  // 配置拼音过滤器"type": "pinyin",  // 设置为拼音类型的过滤器"keep_full_pinyin": false,  // 不保留完整拼音(仅保留简拼)"keep_joined_full_pinyin": true,  // 保留拼音连在一起(例如“北京”变为“bj”)"keep_original": true,  // 保留原始中文词汇"limit_first_letter_length": 16,  // 限制拼音首字母的长度为16"remove_duplicated_term": true,  // 删除重复的拼音词项"none_chinese_pinyin_tokenize": false  // 不进行非中文拼音的分词处理}}}},"mappings": {"properties": {"title": {  // title字段配置"type": "text",  // 使用 "text" 类型,适合进行分词的文本字段"analyzer": "mx_analyzer",  // 使用自定义的 mx_analyzer 分析器进行分词"search_analyzer": "ik_smart"  // 搜索时使用 "ik_smart" 分析器进行分析(简化分词)},"transport": {  // transport字段配置"type": "double"  // 使用 "double" 类型,用于数值数据(浮动小数)}}}
}

拼音分词库文档:https://github.com/medcl/elasticsearch-analysis-pinyin

添加测试数据

POST http://172.23.4.130:9200/goods/_doc/n

{"title": "广东梅州盐焗鸡中翅客家特产盐局鸡翅中网红零食小吃熟食"
}

测试搜索

GET http://172.23.4.130:9200/goods/_search
不管使用中文还是英文 全拼还是简写 都可以正常搜索出该商品

{"query":{"match":{"title":"yjj"}}
}

在这里插入图片描述

搜索的自动补全

Elasticsearch 提供了Completion suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回。为了提高补全查询的效率,对于文档中字段的类型有一些约束。

  • 参与补全查询的字段必须是completion类型
  • 字段的内容一般是用来补全的多个词条形成的数组,也就是提示词语
{"settings": {"analysis": {"analyzer":{"mx_analyzer":{"tokenizer":"ik_max_word","filter":"py"},"completion_analyzer":{ //自定义分词器"tokenizer":"keyword","filter":"py"}},"filter": {"py": {"type": "pinyin","keep_full_pinyin":false,"keep_joined_full_pinyin":true,"keep_original":true,"limit_first_letter_length":16,"remove_duplicated_term":true,"none_chinese_pinyin_tokenize":false}}} },"mappings":{"properties":{"title": {"type": "text","analyzer": "mx_analyzer","search_analyzer":"ik_smart"},"suggestion":{ //搜索的自动补全"type":"completion","analyzer":"completion_analyzer"}}}
}

创建搜索关键字
PUT http://172.23.4.130:9200/goods/_doc/1

{"title": "客家散养土猪原味腊肠香肠广东梅州特产咸香","suggestion":["土猪","腊肠","香肠","散养"] 
}

自动补全查询
GET http://172.23.4.130:9200/goods/_search

{"suggest": {"title_suggest": {  // title_suggest 自定义名称"text": "l",  // 搜索的文本"completion": {  // 使用"completion" 进行自动补全"field": "suggestion",  // 指定用于自动补全的字段名"skip_duplicates": true,  // 跳过重复的建议"size": 15  // 返回的最大数量}}}
}

对应Java代码

SearchRequest request =new SearchRequest(GOODS_INDEX);
request.source().suggest(new SuggestBuilder().addSuggestion("title_suggest",SuggestBuilders.completionSuggestion("suggestion").prefix(text).skipDuplicates(true).size(15)));

依赖

版本7.12.1

   <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></dependency>

配置文件

application.yaml

es:ip: 172.23.4.130port: 9200user: elasticpassword: qwertyuiop

配置类

@Component
@ConfigurationProperties(prefix = "es")
@Data
public class ElasticsearchProperties {private String ip;private int port;private String user;private String password;}

配置连接

@Configuration
@RequiredArgsConstructor
public class ElasticsearchConfig {private final ElasticsearchProperties elasticsearchProperties;@Beanpublic RestHighLevelClient restHighLevelClient() {// 配置基本认证CredentialsProvider credentialsProvider = new BasicCredentialsProvider();credentialsProvider.setCredentials(new AuthScope(elasticsearchProperties.getIp(), elasticsearchProperties.getPort()),new UsernamePasswordCredentials(elasticsearchProperties.getUser(), elasticsearchProperties.getPassword()));RestClientBuilder builder = RestClient.builder(new HttpHost(elasticsearchProperties.getIp(), elasticsearchProperties.getPort(), "http"));builder.setHttpClientConfigCallback(httpClientBuilder -> {return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);});// 创建并返回 RestHighLevelClient 实例return new RestHighLevelClient(builder);}
}

JSON格式化

将JSON转成实体类

public class EsUtils {public static <T>List<T>  toList(SearchHit[] hits, Class<T> clazz) {List<T> retList = new ArrayList<>();for (SearchHit item : hits) {String json = item.getSourceAsString();  // 获取 JSON 字符串T obj = JSONUtil.toBean(json, clazz);    // 使用 Hutool 将 JSON 转换为对象retList.add(obj);}return retList;  // 返回结果列表}
}

搜索自动补全API

/*** 商品搜索框的自动补全* @param text* @return*/
@Override
@SneakyThrows
public List<String> suggestion(String text) {String Custom_Name ="title_suggest";List<String> list =new ArrayList<>();SearchRequest request =new SearchRequest(GOODS_INDEX);request.source().suggest(new SuggestBuilder().addSuggestion(Custom_Name,SuggestBuilders.completionSuggestion("suggestion").prefix(text).skipDuplicates(true).size(15)));SearchResponse response= client.search(request,RequestOptions.DEFAULT);Suggest suggest =response.getSuggest();CompletionSuggestion suggestion =suggest.getSuggestion(Custom_Name);List<CompletionSuggestion.Entry.Option> options =suggestion.getOptions();for (CompletionSuggestion.Entry.Option option :options){list.add(option.getText().toString());}return list;
}

在这里插入图片描述

相关文章:

Elasticsearch 自定义分成器 拼音搜索 搜索自动补全 Java对接

介绍 通常用于将文档中的文本数据拆分成易于索引的词项&#xff08;tokens&#xff09;。有时&#xff0c;默认的分词器无法满足特定应用需求&#xff0c;这时就可以创建 自定义分词器 来实现定制化的文本分析。 自定义分词器组成 Char Filters&#xff08;字符过滤器&#x…...

基于物联网设计的疫苗冷链物流监测系统

一、前言 1.1 项目开发背景 随着全球经济的发展和物流行业的不断创新&#xff0c;疫苗和生物制品的运输要求变得越来越高。尤其是疫苗的冷链物流&#xff0c;温度、湿度等环境因素的控制直接关系到疫苗的质量和效力&#xff0c;因此高效、可靠的冷链监控系统显得尤为重要。冷…...

RocketMQ消息是如何存储的?

大家好&#xff0c;我是锋哥。今天分享关于【RocketMQ消息是如何存储的&#xff1f;】面试题。希望对大家有帮助&#xff1b; RocketMQ消息是如何存储的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 使用了一个高性能、分布式的消息存储架构…...

Ubuntu 16.04安装Lua

个人博客地址&#xff1a;Ubuntu 16.04安装Lua | 一张假钞的真实世界 在Linux系统上使用以下命令编译安装Lua&#xff1a; curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz tar zxf lua-5.3.3.tar.gz cd lua-5.3.3 make linux test 安装make 编译过程如果提示以下信息…...

【JavaSE】String类常用字符串方法总结

目录 1. length() 求字符串长度 2. isEmpty() 判断字符串是否为空 3. String对象的比较 3.1 equals() 判断字符串是否相同 3.2 compareTo() 比较字符串大小 3.3 compareToIgnoreCase 忽略大小写比较 4. 字符串查找 4.1 charAt() 返回指定索引处的字符 4.2 indexOf() 4…...

python3+TensorFlow 2.x(二) 回归模型

目录 回归算法 1、线性回归 (Linear Regression) 一元线性回归举例 2、非线性回归 3、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型&#xff0c;以便根据输入特征预测目标变量&#xff0c;在使用 TensorFlow 2.x 实现线性回归模型时&…...

机器人抓取与操作概述(深蓝)——1

工业机器人&#xff1a;① “臂”的形态 ② “手”的形态 ③ 视觉&#xff0c;力和触觉 1 机器人的不同形态 “臂”的形态 “手”的形态 2 常见的操作任务 操作&#xff1a;插入、推和滑 抓取&#xff1a;两指&#xff08;平行夹爪&#xff09;抓取、灵巧手抓取 落地-产…...

简单聊聊“DeepSeek”

目录 DeepSeek一夜火爆并受到广泛关注的优势 技术实力与创新 低成本与高效率 开源与免费 市场策略与应用领域 团队与资金优势 行业认可与媒体关注 DeepSeek在推理效率上的特别之处 多头潜在注意力&#xff08;MLA&#xff09; 多词元预测&#xff08;MTP&#xff09;…...

使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书

使用 Docker Nginx Certbot 实现自动化管理 SSL 证书 在互联网安全环境日益重要的今天&#xff0c;为站点或应用部署 HTTPS 已经成为一种常态。然而&#xff0c;手动申请并续期证书既繁琐又容易出错。本文将以 Nginx Certbot 为示例&#xff0c;基于 Docker 容器来搭建一个…...

粒子群算法 笔记 数学建模

引入: 如何找到全局最大值&#xff1a;如果只是贪心的话&#xff0c;容易被局部最大解锁定 方法有&#xff1a;盲目搜索&#xff0c;启发式搜索 盲目搜索&#xff1a;枚举法和蒙特卡洛模拟&#xff0c;但是样例太多花费巨量时间 所以启发式算法就来了&#xff0c;通过经验和规…...

【C语言】结构体与共用体深入解析

在C语言中&#xff0c;结构体&#xff08;struct&#xff09;和共用体&#xff08;union&#xff09;都是用来存储不同类型数据的复合数据类型&#xff0c;它们在程序设计中具有重要的作用。 推荐阅读&#xff1a;操作符详细解说&#xff0c;让你的编程技能更上一层楼 1. 结构体…...

es6.7.1分词器ik插件安装-和head插件连接es特殊配置

es6.7.1分词器ik插件安装-和head插件连接es特殊配置 如果对运维课程感兴趣&#xff0c;可以在b站上、A站或csdn上搜索我的账号&#xff1a; 运维实战课程&#xff0c;可以关注我&#xff0c;学习更多免费的运维实战技术视频 1.查看es6.7.1和es-head安装位置和es插件路径 [ro…...

java求职学习day18

常用的设计原则和设计模式 1 常用的设计原则&#xff08;记住&#xff09; 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 &#xff08;1&#xff09;开闭原则&#xff08;Open Close Principle…...

单链表专题(上)

链表的定义与创建 线性表&#xff1a; 1. 物理结构上不一定是线性的 2. 逻辑结构上一定是线性的 链表是一种物理存储结构上非连续&#xff0c;非顺序的存储结构 链表也是线性表的一种&#xff0c;但是在物理结构上不是连续的 链表是由一个一个的节点组成&#xff0c;需要数…...

【stm32学习】STM32F103相关特性

| 名称 | 缩写 | 频率 | 外部连接 | 功能 | 用途 | 特性 | |--------------------|------|----------------|---------------|------------|--------------|----------------| | 外部高速晶体振荡器 | HSE | 4~16MHz …...

PostGIS笔记:PostgreSQL中表、键和索引的基础操作

创建、查看与删除表 在数据库中创建一个表&#xff0c;使用如下代码&#xff1a; create table streets (id serial not null primary key, name varchar(50));这里的表名是streets&#xff0c;id是主键所以非空&#xff0c;采用serial数据类型&#xff0c;这个数据类型会自动…...

蓝桥杯python语言基础(3)——循环结构

一、for语句 理解range函数 range(start, stop, step) start: 序列开始的数字&#xff08;默认为0&#xff09;。stop: 序列结束的数字&#xff08;不包含stop&#xff09;。step: 步长&#xff08;默认为1&#xff09;。 练习 输出在 l 和 r 之间的所有偶数&#xff1a; pri…...

微服务网关鉴权之sa-token

目录 前言 项目描述 使用技术 项目结构 要点 实现 前期准备 依赖准备 统一依赖版本 模块依赖 配置文件准备 登录准备 网关配置token解析拦截器 网关集成sa-token 配置sa-token接口鉴权 配置satoken权限、角色获取 通用模块配置用户拦截器 api模块配置feign…...

23【进制的理解】

很多人可能听过计算机的最底层是2进制执行&#xff0c;但是原理并不知道&#xff0c;我们今天先不讨论那么复杂的问题&#xff0c;先讨论什么是进制 1910&#xff0c;10并不是1个字符&#xff0c;而是2个字符&#xff0c;也就是说在10进制里面没有“10”这个字符&#xff0c;1…...

jemalloc 5.3.0的tsd模块的源码分析

一、背景 在主流的内存库里&#xff0c;jemalloc作为android 5.0-android 10.0的默认分配器肯定占用了非常重要的一席之地。jemalloc的低版本和高版本之间的差异特别大&#xff0c;低版本的诸多网上整理的总结&#xff0c;无论是在概念上和还是在结构体命名上在新版本中很多都…...

信号与线性系统分析(吴大正第5版)自学避坑指南:这些印刷错误和公式笔误你遇到了吗?

信号与线性系统分析&#xff08;吴大正第5版&#xff09;自学避坑指南&#xff1a;这些印刷错误和公式笔误你遇到了吗&#xff1f; 当你独自面对《信号与线性系统分析》这本经典教材时&#xff0c;是否曾因某个公式推导卡壳数小时&#xff1f;是否反复检查自己的计算步骤&#…...

UE5《Electric Dreams》项目PCG技术解析 之 基于PCGSettings的模块化关卡构建

1. PCG技术为何成为UE5开发者的新宠 第一次在UE5.2中接触到PCG框架时&#xff0c;那种感觉就像从手动挡汽车换成了自动驾驶。以前用Houdini做程序化生成时&#xff0c;光是处理插件兼容性和资源导入问题就能耗掉大半天。现在原生集成的PCG框架直接把开发效率提升了至少三倍&…...

stm32 FOC从学习开发(七)SVPWM算法MATLAB仿真进阶:从模型搭建到代码生成

1. SVPWM算法仿真与代码生成全流程 搞电机控制的朋友都知道&#xff0c;SVPWM&#xff08;空间矢量脉宽调制&#xff09;是FOC&#xff08;磁场定向控制&#xff09;的核心算法之一。前几期我们聊过Clark变换、Park变换&#xff0c;也讲过SVPWM的基本原理&#xff0c;今天咱们就…...

MAA明日方舟小助手:让游戏回归乐趣的智能伙伴

MAA明日方舟小助手&#xff1a;让游戏回归乐趣的智能伙伴 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gitcode.com…...

开源AI中间人代理工具深度解析:从MITM原理到AI API调试实践

1. 项目概述&#xff1a;一个开源中间人代理工具的深度解析最近在开源社区里&#xff0c;一个名为nsampre/openclaw-anthropic-mitm的项目引起了我的注意。光看这个标题&#xff0c;可能很多朋友会有点懵&#xff0c;这串字符组合到底意味着什么&#xff1f;简单来说&#xff0…...

无电池RF无线供电电子货架标签系统设计

1. 项目概述在零售和物流行业中&#xff0c;电子货架标签&#xff08;ESL&#xff09;正逐步取代传统的纸质标签。传统ESL通常依赖纽扣电池供电&#xff0c;但电池更换带来的维护成本和环境影响日益凸显。我们团队基于商用现成组件&#xff08;COTS&#xff09;设计了一套完全无…...

终极指南:如何使用webSpoon快速构建企业级数据集成平台

终极指南&#xff1a;如何使用webSpoon快速构建企业级数据集成平台 【免费下载链接】pentaho-kettle webSpoon is a web-based graphical designer for Pentaho Data Integration with the same look & feel as Spoon 项目地址: https://gitcode.com/gh_mirrors/pen/pent…...

V-REP/CoppeliaSim机器人仿真进阶:Graph模块3D轨迹可视化与数据导出实战解析

1. Graph模块基础与3D轨迹可视化原理 在机器人仿真中&#xff0c;轨迹可视化就像给机械臂装上了"运动摄像机"。V-REP/CoppeliaSim的Graph模块就是这个摄像机的核心部件&#xff0c;它能记录机械臂末端执行器在三维空间中的每一个细微动作。我刚开始用这个功能时&…...

告别反复拔插!STM32F103 USB Device(CDC/MSC)上电自动重枚举的两种实现方法

STM32F103 USB设备免拔插重枚举技术深度解析 引言 在嵌入式开发领域&#xff0c;STM32F103系列微控制器因其出色的性价比和丰富的外设资源&#xff0c;成为众多工程师的首选。其中&#xff0c;USB接口的开发应用尤为广泛&#xff0c;从虚拟串口(CDC)到大容量存储设备(MSC)&…...

ITK-SNAP医学图像分割:精准医疗影像分析的利器

ITK-SNAP医学图像分割&#xff1a;精准医疗影像分析的利器 【免费下载链接】itksnap ITK-SNAP medical image segmentation tool 项目地址: https://gitcode.com/gh_mirrors/it/itksnap 面对复杂的医学影像数据&#xff0c;如何快速准确地进行三维解剖结构分割&#xff…...