当前位置: 首页 > 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;无论是在概念上和还是在结构体命名上在新版本中很多都…...

【Convex Optimization Stanford】Lec3 Function

【Convex Optimization Stanford】Lec3 Function 前言凸函数的定义对凸函数在一条线上的限制增值扩充&#xff1f; 一阶条件二阶条件一些一阶/二阶条件的例子象集和sublevel set关于函数凸性的扩展&#xff08;Jesen Inequality)保持函数凸性的操作非负加权和 & 仿射函数的…...

深入 Rollup:从入门到精通(三)Rollup CLI命令行实战

准备阶段&#xff1a;初始化项目 初始化项目&#xff0c;这里使用的是pnpm&#xff0c;也可以使用yarn或者npm # npm npm init -y # yarn yarn init -y # pnpm pnpm init安装rollup # npm npm install rollup -D # yarn yarn add rollup -D # pnpm pnpm install rollup -D在…...

wangEditor富文本编辑器,Laravel上传图片配置和使用

文章目录 前言步骤1. 构造好前端模版2. 搭建后端存储3. 调试 前言 由于最近写项目需要使用富文本编辑器&#xff0c;使用的是VUE3.0版本所以很多不兼容&#xff0c;实际测试以后推荐使用wangEditor 步骤 构造好前端模版搭建后端存储调试 1. 构造好前端模版 安装模版 模版安…...

chrome源码剖析—进程通信

Chrome 浏览器采用多进程架构&#xff08;multi-process architecture&#xff09;&#xff0c;这种架构使得每个浏览器标签、扩展、插件、GPU 渲染等都在独立的进程中运行。为了确保不同进程之间的高效通信&#xff0c;Chrome 使用 进程间通信&#xff08;IPC, Inter-Process …...

JJJ:linux时间子系统相关术语

文章目录 墙上时间内核管理的各种时间无时钟滴答模式&#xff08;tickless mode 或 no-tick mode&#xff09;简要介绍具体实现动态时钟滴答 Dynamic Ticks完全无时钟滴答&#xff08;Full Tickless&#xff09; nohz sleep单触发模式 oneshot mode 墙上时间 真实世界的真实时…...

0 基础学运维:解锁 K8s 云计算运维工程师成长密码

前言&#xff1a;作为一个过来人&#xff0c;我曾站在技术的门槛之外&#xff0c;连电脑运行内存和内存空间都傻傻分不清&#xff0c;完完全全的零基础。但如今&#xff0c;我已成长为一名资深的k8s云计算运维工程师。回顾这段历程&#xff0c;我深知踏上这条技术之路的艰辛与不…...

大一计算机的自学总结:位运算的应用及位图

前言 不仅异或运算有很多骚操作&#xff0c;位运算本身也有很多骚操作。&#xff08;尤其后几个题&#xff0c;太逆天了&#xff09; 一、2 的幂 class Solution { public:bool isPowerOfTwo(int n) {return n>0&&n(n&-n);} }; 根据二进制表示数的原理&#…...

计算机毕业设计Django+Tensorflow音乐推荐系统 机器学习 深度学习 音乐可视化 音乐爬虫 知识图谱 混合神经网络推荐算法 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

AI 图片涌入百度图库

在这个信息爆炸的时代&#xff0c;我们习惯了通过搜索引擎来获取各种想要的信息和图片。然而&#xff0c;现在打开搜索引擎看到的却是许多真假难辨的信息——AI图片&#xff0c;这部分数据正以惊人的速度涌入百度图库&#xff0c;让小编不禁想问&#xff1a;未来打开百度图库不…...

可爱狗狗的404动画页面HTML源码

源码介绍 可爱狗狗的404动画页面HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果 效果预览 源码获取 可爱狗狗的404动画页面HTML源码...