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的低版本和高版本之间的差异特别大,低版本的诸多网上整理的总结,无论是在概念上和还是在结构体命名上在新版本中很多都…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...