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对接
介绍 通常用于将文档中的文本数据拆分成易于索引的词项(tokens)。有时,默认的分词器无法满足特定应用需求,这时就可以创建 自定义分词器 来实现定制化的文本分析。 自定义分词器组成 Char Filters(字符过滤器&#x…...

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

RocketMQ消息是如何存储的?
大家好,我是锋哥。今天分享关于【RocketMQ消息是如何存储的?】面试题。希望对大家有帮助; RocketMQ消息是如何存储的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 使用了一个高性能、分布式的消息存储架构…...
Ubuntu 16.04安装Lua
个人博客地址:Ubuntu 16.04安装Lua | 一张假钞的真实世界 在Linux系统上使用以下命令编译安装Lua: 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、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型,以便根据输入特征预测目标变量,在使用 TensorFlow 2.x 实现线性回归模型时&…...

机器人抓取与操作概述(深蓝)——1
工业机器人:① “臂”的形态 ② “手”的形态 ③ 视觉,力和触觉 1 机器人的不同形态 “臂”的形态 “手”的形态 2 常见的操作任务 操作:插入、推和滑 抓取:两指(平行夹爪)抓取、灵巧手抓取 落地-产…...

简单聊聊“DeepSeek”
目录 DeepSeek一夜火爆并受到广泛关注的优势 技术实力与创新 低成本与高效率 开源与免费 市场策略与应用领域 团队与资金优势 行业认可与媒体关注 DeepSeek在推理效率上的特别之处 多头潜在注意力(MLA) 多词元预测(MTP)…...
使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书
使用 Docker Nginx Certbot 实现自动化管理 SSL 证书 在互联网安全环境日益重要的今天,为站点或应用部署 HTTPS 已经成为一种常态。然而,手动申请并续期证书既繁琐又容易出错。本文将以 Nginx Certbot 为示例,基于 Docker 容器来搭建一个…...

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

【C语言】结构体与共用体深入解析
在C语言中,结构体(struct)和共用体(union)都是用来存储不同类型数据的复合数据类型,它们在程序设计中具有重要的作用。 推荐阅读:操作符详细解说,让你的编程技能更上一层楼 1. 结构体…...
es6.7.1分词器ik插件安装-和head插件连接es特殊配置
es6.7.1分词器ik插件安装-和head插件连接es特殊配置 如果对运维课程感兴趣,可以在b站上、A站或csdn上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频 1.查看es6.7.1和es-head安装位置和es插件路径 [ro…...

java求职学习day18
常用的设计原则和设计模式 1 常用的设计原则(记住) 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 (1)开闭原则(Open Close Principle…...
单链表专题(上)
链表的定义与创建 线性表: 1. 物理结构上不一定是线性的 2. 逻辑结构上一定是线性的 链表是一种物理存储结构上非连续,非顺序的存储结构 链表也是线性表的一种,但是在物理结构上不是连续的 链表是由一个一个的节点组成,需要数…...

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

PostGIS笔记:PostgreSQL中表、键和索引的基础操作
创建、查看与删除表 在数据库中创建一个表,使用如下代码: create table streets (id serial not null primary key, name varchar(50));这里的表名是streets,id是主键所以非空,采用serial数据类型,这个数据类型会自动…...

蓝桥杯python语言基础(3)——循环结构
一、for语句 理解range函数 range(start, stop, step) start: 序列开始的数字(默认为0)。stop: 序列结束的数字(不包含stop)。step: 步长(默认为1)。 练习 输出在 l 和 r 之间的所有偶数: pri…...

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

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

jemalloc 5.3.0的tsd模块的源码分析
一、背景 在主流的内存库里,jemalloc作为android 5.0-android 10.0的默认分配器肯定占用了非常重要的一席之地。jemalloc的低版本和高版本之间的差异特别大,低版本的诸多网上整理的总结,无论是在概念上和还是在结构体命名上在新版本中很多都…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...

相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...