elasticsearch7.15实现用户输入自动补全

Elasticsearch Completion Suggester(补全建议)

Elasticsearch7.15安装

官方文档
补全建议器提供了根据输入自动补全/搜索的功能。这是一个导航功能,引导用户在输入时找到相关结果,提高搜索精度。
理想情况下,自动补全功能应该和用户输入一样快,以便为用户提供与已输入内容相关的即时反馈。因此,completion建议器针对速度进行了优化。建议器使用的数据结构支持快速查找,但构建成本很高,并且存储在内存中。

拼音分词插件elasticsearch-analysis-pinyin安装

源码地址:https://gitcode.com/medcl/elasticsearch-analysis-pinyin/overview

  • idea通过git(https://gitcode.com/medcl/elasticsearch-analysis-pinyin.git)导入项目

  • 切换到分支7.x

  • 修改pom.xml,elasticsearch.version 版本号为7.15.0
    在这里插入图片描述

  • 执行maven打包命令

    mvn clean package "-Dmaven.test.skip=true"
    

    执行命令以后生成的插件:
    在这里插入图片描述

  • 将elasticsearch-analysis-pinyin-7.15.0.zip上传到服务器elasticsearch安装目录,修改文件权限为elasticsearch用户权限,笔者的用户是hadoop.

    chown  hadoop:hadoop elasticsearch-analysis-pinyin-7.15.0.zip
    
  • 进入elasticsearch安装目录执行命令安装插件

    sh ./bin/elasticsearch-plugin install file:elasticsearch-analysis-pinyin-7.15.0.zip
    

    在这里插入图片描述

  • 重新启动elasticsearch

    # 停止
    kill -9 进程id
    #启动
    sh ./bin/elasticsearch -d
    
  • 查询插件是否安装成功

    GET _cat/plugins
    

    在这里插入图片描述

  • 拼音插件参数说明
    The plugin includes analyzer: pinyin , tokenizer: pinyin and token-filter: pinyin.

    • keep_first_letter 当启用此选项时, eg: 刘德华>ldh, default: true
    • **keep_separate_first_letter ** 当此选项启用时,将单独保留首字母, eg: 刘德华>l,d,h, default: false, NOTE: 由于查询词的频率过高,查询结果可能会过于模糊
    • limit_first_letter_length set max length of the first_letter result, default: 16
    • keep_full_pinyin when this option enabled, eg: 刘德华> [liu,de,hua], default: true
    • keep_joined_full_pinyin when this option enabled, eg: 刘德华> [liudehua], default: false
    • keep_none_chinese 结果中保留非中文字母或数字, default: true
    • keep_none_chinese_together keep non chinese letter together, default: true, eg: DJ音乐家 -> DJ,yin,yue,jia, when set to false, eg: DJ音乐家 -> D,J,yin,yue,jia, NOTE: keep_none_chinese should be enabled first
    • keep_none_chinese_in_first_letter keep non Chinese letters in first letter, eg: 刘德华AT2016->ldhat2016, default: true
    • keep_none_chinese_in_joined_full_pinyin keep non Chinese letters in joined full pinyin, eg: 刘德华2016->liudehua2016, default: false
    • none_chinese_pinyin_tokenize 如果非汉语字母是拼音,则将其拆分成单独的拼音术语, default: true, eg: liudehuaalibaba13zhuanghan -> liu,de,hua,a,li,ba,ba,13,zhuang,han, NOTE: keep_none_chinese and keep_none_chinese_together should be enabled first
    • keep_original 将非中文字母分成单独的拼音词,如果它们是拼音时,此选项启用,将保持原始输入, default: false
    • lowercase lowercase non Chinese letters, default: true
    • trim_whitespace default: true
    • remove_duplicated_term when this option enabled, duplicated term will be removed to save index, eg: de的>de, default: false, NOTE: position related query maybe influenced
    • ignore_pinyin_offset after 6.0, offset is strictly constrained, overlapped tokens are not allowed, with this parameter, overlapped token will allowed by ignore offset, please note, all position related query or highlight will become incorrect, you should use multi fields and specify different settings for different query purpose. if you need offset, please set it to false. default: true.

创建索引

PUT hot_word
{"settings": {"routing": {"allocation": {"include": {"_tier_preference": "data_content"}}},"number_of_shards": "1","max_result_window": "10000","number_of_replicas": "1","analysis": {"analyzer": {"pinyin_analyzer": {"tokenizer": "my_pinyin"}},"tokenizer": {"my_pinyin": {"type": "pinyin","keep_separate_first_letter": true,"keep_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"lowercase": true,"remove_duplicated_term": true}}}},"mappings": {"properties": {"name": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"suggest": {"type": "completion","analyzer": "pinyin_analyzer","preserve_separators": true,"preserve_position_increments": true,"max_input_length": 50}}}
}

类型completion 参数:

参数说明
analyzer要使用的索引分析器默认为simple。
search_analyzer要使用的搜索分析器,默认值为analyzer。
preserve_separators保留分隔符,默认为true。如果禁用,你可以找到一个以Foo Fighters开头的字段,如果你建议使用foof。
preserve_position_increments启用位置增量,默认为true如果禁用并使用停用词分析器,你可以得到一个以The Beatles开头的字段,如果你建议使用b。注意:你也可以通过索引两个输入,Beatles和The Beatles来实现这一点,如果你能够丰富数据,则无需更改简单的分析器。
max_input_length限制单个输入的长度,默认为50个UTF-16代码点。这个限制只在索引时用于减少每个输入字符串的字符总数,以防止大量输入使底层数据结构膨胀。大多数用例都不受默认值的影响,因为前缀补全的长度很少超过几个字符。

添加数据

PUT hot_word/_doc/1?refresh
{"name":"压克力盒","suggest":{"input":["压克力盒"],"weight":10}
}
PUT hot_word/_doc/2?refresh
{"name":"亚克力盒","suggest":{"input":["亚克力盒"],"weight":10}
}
PUT hot_word/_doc/3?refresh
{"name":"刻磨機","suggest":{"input":["刻磨機"],"weight":10}
}
PUT hot_word/_doc/4?refresh
{"name":"刻模机","suggest":{"input":["刻模机"],"weight":10}
}

suggest参数说明:

参数说明备注
input要存储的输入,可以是一个字符串数组,也可以只是一个字符串。该字段是必填字段。此值不能包含以下UTF-16控制字符:\u0000 (null),\u001f (information separator one),\u001f (information separator one)
weight一个正整数或包含一个正整数的字符串,它定义了权重,允许你对建议进行排序。该字段是可选的。

查询

GET hot_word/_search?pretty
{"_source": ["suggest"], "suggest": {"song-suggest": {"prefix": "关键词","completion": {"field": "suggest","size": 10,"skip_duplicates": true}}}
}

参数说明:

  • suggest: suggest类型
  • song-suggest: suggest名称,自定义命名
  • prefix:搜索建议时使用的前缀
  • completion: 建议类型
  • field:搜索建议的字段名称
  • size:返回的建议条数,默认5
  • skip_duplicates:是否应该过滤重复的建议(默认为false)。

测试:

  • 测试中文输入关键词:亚,亚克、亚克力、亚克力盒,正常返回补全结果:

    {"took" : 6,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 0,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"suggest" : {"song-suggest" : [{"text" : "亚克力","offset" : 0,"length" : 3,"options" : [{"text" : "亚克力盒","_index" : "hot_word","_type" : "_doc","_id" : "2","_score" : 10.0,"_source" : {"suggest" : {"input" : ["亚克力盒"],"weight" : 10}}},{"text" : "压克力盒","_index" : "hot_word","_type" : "_doc","_id" : "1","_score" : 10.0,"_source" : {"suggest" : {"input" : ["压克力盒"],"weight" : 10}}}]}]}
    }
  • 测试拼音输入:ya、yake,yakelihe,yakelihe,正常返回补全结果:

    {"took" : 7,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 0,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"suggest" : {"song-suggest" : [{"text" : "yakelihe","offset" : 0,"length" : 8,"options" : [{"text" : "亚克力盒","_index" : "hot_word","_type" : "_doc","_id" : "2","_score" : 10.0,"_source" : {"suggest" : {"input" : ["亚克力盒"],"weight" : 10}}},{"text" : "压克力盒","_index" : "hot_word","_type" : "_doc","_id" : "1","_score" : 10.0,"_source" : {"suggest" : {"input" : ["压克力盒"],"weight" : 10}}}]}]}
    }
  • 测试拼音首字母输入:y、yk、ykl、yklh,正常返回补全结果。支持首字母补全,pinyin需要设置keep_separate_first_letter为true。

  • 测试同音字输入:鸭,鸭课,正常返回补全结果。

  • 测试简繁体输入:刻模机,正常返回简繁体补全结果。

模糊查询

completion建议器还支持模糊查询——这意味着即使你在搜索中输入错误,仍然可以得到结果。

GET hot_word/_search?pretty
{"_source": ["suggest"], "suggest": {"song-suggest": {"prefix": "关键词","completion": {"field": "suggest","size": 10,"skip_duplicates": true,"fuzzy": {"fuzziness": 2,"min_length":4,"prefix_length":4,"transpositions": false,"unicode_aware":true}}}}
}

模糊查询fuzzy参数说明:

  • fuzziness:作用:决定模糊匹配的程度。默认值为AUTO,意味着根据查询项的长度自动调整模糊匹配的严格程度。也可以手动设置为具体的值,如0(精确匹配)、1(允许一个编辑距离内的匹配)等,或者使用其他特定的字符串值(如"AUTO"、“1”、“2”)。
  • transpositions:如果设置为true(默认值),则在计算编辑距离时把字符的交换视为一个变化而不是两个。这对于那些可能因快速打字而产生的常见转置错误(比如"thsi"到"this")非常有用。
  • min_length:只有当查询字符串长度达到这个值时,才会返回模糊建议。默认为3,意味着较短的查询可能不会触发模糊匹配,以减少不相关的匹配结果。
  • prefix_length:指定了查询字符串中从开始部分的多少个字符必须精确匹配,之后的字符才开始应用模糊匹配算法。默认为1,意味着除了最小长度要求外,所有字符都可能被模糊处理。增加这个值可以提高查询的精确度,尤其是在查询字符串较短时。
  • unicode_aware:确定是否在进行模糊匹配计算时考虑Unicode编码。如果设为true,则编辑距离、转置等计算都会基于Unicode码点进行,这使得多语言文本的处理更为准确。但因为涉及到更复杂的计算,所以默认为false以追求更快的性能。

测试输入“亚可爱”,正常返回补全结果:

{"took" : 44,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 0,"relation" : "eq"},"max_score" : null,"hits" : [ ]},"suggest" : {"song-suggest" : [{"text" : "亚可爱","offset" : 0,"length" : 3,"options" : [{"text" : "亚克力盒","_index" : "hot_word","_type" : "_doc","_id" : "2","_score" : 40.0,"_source" : {"suggest" : {"input" : ["亚克力盒"],"weight" : 10}}},{"text" : "压克力盒","_index" : "hot_word","_type" : "_doc","_id" : "1","_score" : 40.0,"_source" : {"suggest" : {"input" : ["压克力盒"],"weight" : 10}}}]}]}
}

Java实现

easy-es实现:https://www.easy-es.cn/,这个框架建议索引设置为手动,自动索引还不是很稳定

  • 添加maven依赖:
        <!-- 引入easy-es最新版本的依赖--><dependency><groupId>org.dromara.easy-es</groupId><artifactId>easy-es-boot-starter</artifactId><!--这里Latest Version是指最新版本的依赖,比如2.0.0,可以通过下面的图片获取--><version>v2.0.0</version></dependency><!-- 排除springboot中内置的es依赖,以防和easy-es中的依赖冲突--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId></exclusion><exclusion><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.14.0</version></dependency><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.14.0</version></dependency>
  • java实体关键代码:
/*** 自动补齐字段*/@IndexField(fieldType = FieldType.NESTED, nestedClass = SearchHotWordV2IDX.HotSuggest.class)private SearchHotWordV2IDX.HotSuggest suggest;@Datapublic static class HotSuggest {@IndexField(fieldType = FieldType.INTEGER)private Integer weight;@IndexField(fieldType = FieldType.KEYWORD)private List<String> input;}
  • 新增
    使用mapper直接调用就可以
  • 查询关键代码:
    private static final String HOT_KEYWORD_SUGGEST_NAME = "hot-suggest";public List<String> autoComplete(String keyword, Boolean fuzzy) {LambdaEsQueryWrapper<SearchHotWordV2IDX> queryWrapper = new LambdaEsQueryWrapper<SearchHotWordV2IDX>();queryWrapper.select(SearchHotWordV2IDX::getSuggest);String newKeyword = Optional.ofNullable(keyword).map(a -> a.toLowerCase()).map(b -> StrUtil.sub(b, 0, 10)).orElseThrow(RuntimeException::new);// 定义建议构造器SuggestBuilder suggestBuilder = new SuggestBuilder();// 自动补全补齐构造器CompletionSuggestionBuilder completionSuggestionBuilder = new CompletionSuggestionBuilder("suggest").size(20).skipDuplicates(true);if (fuzzy) {// 设置模糊查询FuzzyOptions fuzzyOptions = FuzzyOptions.builder().setFuzziness(2).setFuzzyMinLength(4).setFuzzyPrefixLength(4).build();completionSuggestionBuilder.prefix(newKeyword, fuzzyOptions);} else {completionSuggestionBuilder.prefix(newKeyword);}// 自动补全添加到建议构造器suggestBuilder.addSuggestion(HOT_KEYWORD_SUGGEST_NAME, completionSuggestionBuilder);SearchSourceBuilder searchSourceBuilder = searchHotWordV2EsMapper.getSearchSourceBuilder(queryWrapper);// 建议器添加到searchSourceBuildersearchSourceBuilder.suggest(suggestBuilder);// queryWrapper设置searchSourceBuilderqueryWrapper.setSearchSourceBuilder(searchSourceBuilder);// 查询SearchResponse response = searchHotWordV2EsMapper.search(queryWrapper);Suggest suggest = response.getSuggest();// 获取自动补全结果CompletionSuggestion completionSuggestion = suggest.getSuggestion(HOT_KEYWORD_SUGGEST_NAME);return Optional.ofNullable(completionSuggestion.getOptions()).map(a -> a.stream().map(b -> b.getText().string()).collect(Collectors.toList())).orElse(null);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20069.shtml

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

相关文章

02-CSS3基本样式

目录 1. CSS3简介 1.1 CSS3的兼容情况 1.2 优雅降级和渐进增强的开发思想 2. 新增选择器 2.1 选择相邻兄弟 2.2 匹配选择器 2.3 属性选择器(重点) 2.4 结构性伪类选择器&#xff08;重点&#xff09; 2.4.1 整体结构类型 2.4.2 标签结构类型 2.4.3 指定子元素的序号&…

模型训练、结果存储、API 调用的系列优化|ModelWhale 版本更新

蜂飞蝶舞&#xff0c;万物并秀&#xff0c;明媚的春光中 ModelWhale 带来新一轮的版本更新&#xff0c;期待为大家带来更优质的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 新增 IDE 中使用训练记录&#xff08;专业版✓ 团队版✓&…

Ansible04-Ansible Vars变量详解

目录 写在前面6 Ansible Vars 变量6.1 playbook中的变量6.1.1 playbook中定义变量的格式6.1.2 举例6.1.3 小tip 6.2 共有变量6.2.1 变量文件6.2.1.1 变量文件编写6.2.1.2 playbook编写6.2.1.3 运行测试 6.2.2 根据主机组使用变量6.2.2.1 groups_vars编写6.2.2.2 playbook编写6.…

迈的普拉姆利普绘图:深入解析与实战应用

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;matplotlib绘图的基本原理 代码案例 二、深入了解&#xff1a;matplo…

数据结构与算法02-排序算法

介绍 排序算法是计算机科学中被广泛研究的一个课题。历时多年&#xff0c;它发展出了数十种算法&#xff0c;这些 算法都着眼于一个问题&#xff1a;如何将一个无序的数字数组整理成升序&#xff1f;先来学习一些“简单排序”&#xff0c;它们很好懂&#xff0c;但效率不如其他…

闽盾杯 2021 DNS协议分析

今年CISCN的Tough DNS 的前戏就是DNS协议分析 直接可以查找到flag的base64形式Zmxh 发现就是请求的dnslog 携带的数据 过滤器就是 dns tshark -r dns.pcapng -T json -Y "dns" >1.json 字段选择 dns.qry.name tshark -r dns.pcapng -T json -Y "dns"…

内网渗透-隧道搭建ssp隧道代理工具

内网渗透-隧道搭建&ssp隧道代理工具 目录 内网渗透-隧道搭建&ssp隧道代理工具spp隧道代理工具spp工作原理图cs上线主机spp代理通信服务端配置客户端配置CS配置设置CS生成木马的监听器配置CS监听上线的监听器生成木马 spp隧道搭建服务端配置客户端配置CS配置 内网穿透&a…

根据模板和git commit自动生成日·周·月·季报

GitHub - qiaotaizi/dailyreport: 日报生成器 GitHub - yurencloud/daily: 程序员专用的日报、周报、月报、季报自动生成器&#xff01; config.json: { "Author": "gitname", "Exclude": ["update:", "add:", "…

实际测试stm32中断优先级

HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority); void HAL_NVIC_EnableIRQ(IRQn_Type IRQn); void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);第一个函数 HAL_NVIC_SetPriority 是用来设置单个优先级的抢占优先级和响应优先级的值。第二个…

恒压频比开环控制系统Matlab/Simulink仿真分析(SPWM控制方式)

介绍恒压频比的开环控制方法驱动永磁同步电机的转动&#xff0c;首先分析恒压频比的控制原理&#xff0c;然后在Matlab/Simulink中进行永磁同步电机恒压频比开环控制系统的仿真分析&#xff0c;最后将Simulink中的恒压频比控制算法生成代码加载到实际工程中进行工程实现。 一、…

丝绸之路网络安全论坛成功举办,开源网安受邀分享软件供应链安全落地经验

5月23日&#xff0c;2024第八届丝绸之路网络安全论坛在陕西宾馆会议中心成功举办&#xff0c;本次论坛由陕西省信息网络安全协会主办&#xff0c;以“汇聚万千智慧 夯实安全堤坝”为主题&#xff0c;邀请业内专家学者、企业代表、行业代表共计400余人参加。开源网安常务副总王颉…

【PostgreSQL17新特性之-冗余IS [NOT] NULL限定符的处理优化】

在执行一个带有IS NOT NULL或者NOT NULL的SQL的时候&#xff0c;通常会对表的每一行&#xff0c;都会进行检查以确保列为空/不为空&#xff0c;这是符合常理的。 但是如果本身这个列上有非空&#xff08;NOT NULL&#xff09;约束&#xff0c;再次检查就会浪费资源。甚至有时候…

Leetcode3165. 不包含相邻元素的子序列的最大和(Go中的线段树分治包含多类数据使用maintain进行维护)

题目截图 题目分析 不能取相邻的&#xff0c;就是打家劫舍 然后更改某一个值就是单点更新 更新后&#xff0c;需要更新区间的值 需要注意的是&#xff0c;使用分治时需要考虑到一头一尾的问题&#xff0c;所以有4种情况&#xff08;选or不选在两个位置&#xff09; 这四种情况…

编程入门(七)【虚拟机VMware安装Linux系统Ubuntu】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;Ubuntu知多少&#x1f680;安装的前期准备&am…

SQL—DQL之执行顺序(基础)

一、引言 1、编写顺序 2、执行顺序 介绍&#xff1a; DQL语句&#xff08;数据查询语句&#xff09; 1、首先先执行的是 FROM &#xff0c;通过 FROM 来决定我要查询的是哪一张表的数据。 2、紧接着通过 WHERE 来指定查询的条件。 3、第三步就是通过 GROUP BY 以及 HAVING 来…

中国BI步入增长大周期,腾讯云ChatBI加速AI+BI融合

过去十年&#xff0c;大数据技术的快速发展&#xff0c;让数据消费前进一大步&#xff0c;数据价值得到一定程度的挖掘与释放&#xff0c;真正开启了“用数”的大时代。但数据分析繁杂的技术栈、复杂的处理过程以及程式化的交互方式&#xff0c;让“数据消费”的门槛始终降不下…

现在的时代,您必会的“调教”AI技巧

人工智能大行其道&#xff0c;如何借势&#xff1f;始于问询。要得要得预期&#xff0c;精于“提问技巧”&#xff01; (笔记模板由python脚本于2024年05月30日 18:37:27创建&#xff0c;本篇笔记适合有独立编程基础的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#…

基于 Apache Doris 的实时/离线一体化架构,赋能中国联通 5G 全连接工厂解决方案

作者&#xff1a;田向阳&#xff0c;联通西部创新研究院 大数据专家 共创&#xff1a;SelectDB 技术团队 导读&#xff1a; 数据是 5G 全连接工厂的核心要素&#xff0c;为支持全方位的数据收集、存储、分析等工作的高效进行&#xff0c;联通 5G 全连接工厂从典型的 Lambda 架…

Presto 从提交SQL到获取结果 源码详解(3)

物理执行计划 回到SqlQueryExecution.startExecution() &#xff0c;执行计划划分以后&#xff0c; // 初始化连接&#xff0c;获取Connect 元数据&#xff0c;添加会话&#xff0c;初始ConnectId metadata.beginQuery(getSession(), plan.getConnectors()); // 构建物理执行…

AngularJS基础语法(2009版本)

jquery和AngularJS 数据绑定和获取对比&#xff1a; jquery&#xff0c;要操作DOM&#xff1a; angularJS&#xff0c;无需操作DOM就可以进行动态数据变化&#xff1a; 要使用Angularjs就需要在html页面先引入&#xff1a; ng-app&#xff1a; html页面中&#xff0c;需要给…