ES推荐搜索、自动补全,并且springBoot集成

server/2024/10/21 22:19:42/

推荐搜索

在搜索过程中,因为单词的拼写错误,没有得到任何的结果,希望ES能够给我们一个推荐搜索。

java">GET movies/_search
{"suggest": {# title_suggestion为我们自定义的名字"title_suggestion": {"text": "drema","term": {"field": "title","suggest_mode": "popular"}}}
}

suggest_mode,有三个值:popular、missing、always

1. popular 是推荐词频更高的一些搜索。

2. missing 是当没有要搜索的结果的时候才推荐。

3. always无论什么情况下都进行推荐。

自动补全

自动补全应该是我们在日常的开发过程中最常见的搜索方式了,如百度搜索和京东商品搜索。

自动补全的功能对性能的要求极高,用户每发送输入一个字符就要发送一个请求去查找匹配项。

ES采取了不同的数据结构来实现,并不是通过倒排索引来实现的;需要将对应的数据类型设置为

completion ; 所以在将数据索引进ES之前需要先定义 mapping 信息。

1.定义mapping

java">PUT /test-completion
{"mappings": {"properties": {"name": {"type": "completion","analyzer": "ik_smart"}}}
}

添加数据

java">POST test-completion/_bulk
{"index": {}}
{"name": "刘德华"}
{"index": {}}
{"name": "张学友"}
{"index": {}}
{"name": "柳岩"}
{"index": {}}
{"name": "柳菲菲"}
{"index": {}}
{"name": "刘备"}

2.前缀搜索

java">GET test-completion/_search
{"suggest": {"prefix_suggestion": {"prefix": "刘","completion": {"field": "name","skip_duplicates": true,"size": 10}}}
}

java">
GET test-completion/_search
{"suggest": {"prefix_suggestion": {"prefix": "刘德","completion": {"field": "name","skip_duplicates": true,"size": 10}}}
}

3.同一个字段可能既是搜索字段又是补全,则可以建立子字段

java">PUT /test-completion1
{"mappings": {"properties": {"name": {"type": "text","analyzer": "ik_smart","fields": { "nameCompletion": {"type": "completion"}}}}}
}

查询

java">GET test-completion1/_search
{"suggest": {"prefix_suggestion": {"prefix": "刘","completion": {"field": "name.nameCompletion","skip_duplicates": true,"size": 10}}}
}

结果

springboot集成实现自动补全

java"> @Autowiredprivate ElasticsearchClient client;public List<String> suggest(String title) throws IOException {List<String> result = new ArrayList<>();//构建FiledSuggestMapMap<String,FieldSuggester> filedSuggestMap = new HashMap<>();FieldSuggester nameFiledSuggest = FieldSuggester.of(f -> f.prefix(title).completion(c -> c.field("name.nameCompletion").skipDuplicates(true).size(10)));filedSuggestMap.put("pre_suggest",nameFiledSuggest);//构建SearchRequestSearchRequest searchRequest = SearchRequest.of(s -> s.index("suggest").suggest(s1 -> s1.suggesters(filedSuggestMap)));SearchResponse<Object> search = client.search(searchRequest, Object.class);Map<String, List<Suggestion<Object>>> suggest = search.suggest();if (CollectionUtils.isEmpty(suggest)){return result;}List<CompletionSuggestOption<Object>> preSuggest = search.suggest().get("pre_suggest").get(0).completion().options();for (CompletionSuggestOption<Object> suggestOption : preSuggest) {result.add(suggestOption.text());}return result;}

http://www.ppmy.cn/server/133736.html

相关文章

SpringBoot启动web项目的最少依赖

1、pom.xml 文件&#xff1a;启动web项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"htt…

PetaLinux工程的常用命令——petalinux-config

petalinux-config&#xff1a;使用菜单配置项目或指定组件。 注&#xff1a;有些命令我没用过&#xff0c;瞎翻译有可能会翻译错了。 用法: petalinux-config [options] {--component <COMPONENT> |--get-hw-description[SRC]} 可选参数: -h, --help 显示函数用法…

Flutter 学习资料

官网&#xff1a;https://flutter.dev/ # 教程类 a. Flutter官方文档&#xff1a; [https://docs.flutter.dev/get-started](https://docs.flutter.dev/get-started) (中文&#xff1a;文档 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter) 从最初的环境配置到开发…

安卓逆向之- 小程序逆向

PC 调试工具。静态分析工具安卓,ios 所在目录JS 加密VMP引言: 今天讲下逆向中遇到小程序逆向怎么取解决问题。我们有静态分析,动态分析两种方法。 静态分析1.1 小程序文件来源。 PC 不建议,因为是加密后的,还得解密有点麻烦。 说下安卓所在目录: /data/data/com.tencent…

复制文件到U盘提示:对于目标文件系统,文件过大

查看U盘属性的文件系统是否为FAT32&#xff0c;需将其改为NTFS 方法一 Win R 输入cmd打开命令行&#xff0c;输入以下命令&#xff08;注&#xff1a;f为U盘盘符&#xff09; convert f: /fs:ntfs /x方法二 格式化U盘&#xff0c;右键点击U盘进行格式化&#xff0c;文件系…

线性可分支持向量机的原理推导 线性分隔超平面关于任意样本点 (x_i,y_i)的几何间隔 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式 9-3 进一步明确了如何计算分类间隔的大小&#xff0c;公式形式如下&#xff1a; d i y i w T x i b ∥ w ∥ d_i y_i \frac{\mathbf{w}^T \mathb…

CDGA|数据治理:如何让传统行业实现数据智能

在当今这个数字化时代&#xff0c;数据已成为推动各行各业转型升级的关键力量。对于传统行业而言&#xff0c;如何从海量、复杂的数据中挖掘价值&#xff0c;实现“数据智能”&#xff0c;成为了提升竞争力、优化运营效率、创新业务模式的重要途径。本文将探讨数据治理如何助力…

RHCE的学习(3)

第三章 远程登录服务 简介 概念 远程连接服务器通过文字或图形接口方式来远程登录系统&#xff0c;让你在远程终端前登录linux主机以取得可操作主机接口&#xff08;shell&#xff09;&#xff0c;而登录后的操作感觉就像是坐在系统前面一样 功能: 分享主机的运算能力 服务…