SpringBoot实现ES简单搜索和推荐

28.java如何进行multi_match查询? 嘻哈的简写笔记——Elastic Search 此时我们已经把重复的部分给封装成了一个方法,我们只需要调用传参就可以了; 测试方法: @Test //multi_match查询 public void test14() throws IOException { QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("第三方","name","author"); ClientUtils.queryTemplate(indextName,typeName,queryBuilder) 阅读详情

1 ES7.6的高级客户端

// ES高级客户端
public RestHighLevelClient restHighLevelClient(){
    RestClientBuilder restClientBuilder = RestClient.builder(
            new HttpHost("127.0.0.1", 9200, "http"),
            new HttpHost("192.168.128.11", 9200, "http"));
    return new RestHighLevelClient(restClientBuilder);
}

2 ES简单搜索数据

public List<Map<String, Object>> query() {
    String keyword = "中国";
    // 1 建立搜索规则

    // 建立多字段查询,字段名称是content和title
    MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyword);
    multiMatchQueryBuilder.field("content");
    multiMatchQueryBuilder.field("title");

    /*
    // 单字段查询
    MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", keyword);
    sourceBuilder.query(matchQueryBuilder);
    */

    // Bool查询
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    boolQueryBuilder.must(multiMatchQueryBuilder);

    // 过滤器,过滤含有“绿色”的数据
    boolQueryBuilder.filter(QueryBuilders.matchQuery("content", "绿色"));

    // 过滤器,过滤日期在2016-01-01到2020-01-01之间的数据,注意日期格式必须是“yyyy-MM-dd HH:mm:ss”或“yyyy-MM-dd”,字段的type是date,format是yyyy-MM-dd,如果格式错误搜索出的数据有问题
    boolQueryBuilder.filter(QueryBuilders.rangeQuery("date").gte("2016-01-01").lte("2020-01-01"));

    // 2 建立查询
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(boolQueryBuilder);

    // 设置起始页
    sourceBuilder.from(0);
    // 设置一页的数据量,默认是10条数据
    sourceBuilder.size(100);
    // 设置超时
    sourceBuilder.timeout(new TimeValue(6, TimeUnit.SECONDS));

    // 设置高亮
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.requireFieldMatch(false);
    highlightBuilder.field("content");
    highlightBuilder.field("title");
    highlightBuilder.preTags("<em>");
    highlightBuilder.postTags("</em>");
    sourceBuilder.highlighter(highlightBuilder);

    // 设置SearchRequest,可以指定多个索引,默认是所有索引
    SearchRequest request = new SearchRequest("website", "article");
    request.source(sourceBuilder);

    // 获取返回值
    List<Map<String, Object>> data = new ArrayList<>();
    try {
        SearchResponse response = this.restHighLevelClient.search(request, RequestOptions.DEFAULT);
        for (SearchHit hit: response.getHits().getHits()) {
            // 获取得SourceMap
            Map<String, Object> sourceMap = hit.getSourceAsMap();

            // 获取高亮
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField title = highlightFields.get("title");

            StringBuilder highlightTitle = new StringBuilder();
            if (title != null) {
                Text[] fragment = title.fragments();
                for (Text text : fragment) {
                    highlightTitle.append(text);
                }
            }
            // Replace the title
            if (highlightTitle.length() > 0) {
                sourceMap.put("title", highlightTitle.toString());
            }

            HighlightField content = highlightFields.get("content");
            StringBuilder highlightSummary = new StringBuilder();
            if (content != null) {
                Text[] fragment = content.fragments();
                for (Text text : fragment) {
                    highlightSummary.append(text);
                }
            }

            // 将highlightSummary替换sourceMap的content即可
            if (highlightSummary.length() > 0) {
                sourceMap.put("content", highlightSummary.toString());
            }

            // Add the list
            data.add(sourceMap);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    return data;
}


3 CompletionSuggest推荐

// title的类型是"type": "completion",index不能是true(索引功能关闭)
// 完整推荐, 例如:keyword=中国,则会推荐“中国经济不断发展,中国进入世贸组织”(title的整个字段的内容)
public Set<String> completionSuggestData(String keyword){
    // 设置CompletionSuggestion
    CompletionSuggestionBuilder completionSuggestion = SuggestBuilders.completionSuggestion("title").prefix(keyword).size(20);
    SuggestBuilder suggestBuilder = new SuggestBuilder();
    suggestBuilder.addSuggestion("suggest_user", completionSuggestion);

    // 将completionSuggestion添加到searchSourceBuilder中
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    // 设置超时时间
    searchSourceBuilder.timeout(new TimeValue(2, TimeUnit.SECONDS));
    searchSourceBuilder.suggest(suggestBuilder);

    // 将searchSourceBuilder添加到searchRequest中
    SearchRequest searchRequest = new SearchRequest("paper_db");
    searchRequest.source(searchSourceBuilder);    
    
    // 存储suggest
    HashSet<String> data = new HashSet<String>();
    try {
        // 读取suggest
        SearchResponse searchResponse = this.restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        Suggest suggest = searchResponse.getSuggest();

        if(suggest != null){
            CompletionSuggestion result = suggest.getSuggestion("suggest_user");
            for ( CompletionSuggestion.Entry entrys : result.getEntries()) {
                for(Suggest.Suggestion.Entry.Option option: entrys.getOptions()){
                    if(option != null){
                        // Remove special char and repeat data
                        data.add(option.getText().toString());
                    }
                }
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return data;
}

4 TermSuggest推荐

// 推荐相似的词和短语
// 例如:keyword=中国人民,则会推荐“中国企业, 中国经济, 中国移动, 中国国际”(数据库里必须有相关的字段数据)
public Set<String> termSuggestData(String keyword){
    // 建立 TermSuggestionBuilder
    TermSuggestionBuilder termSuggestionBuilder = SuggestBuilders.termSuggestion("title").text(keyword).size(100);
    SuggestBuilder suggestBuilder = new SuggestBuilder();
    suggestBuilder.addSuggestion("suggest_user", termSuggestionBuilder);

    // 建立SearchSourceBuilder,添加suggest
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder.timeout(new TimeValue(2, TimeUnit.SECONDS));
    searchSourceBuilder.suggest(suggestBuilder);

    // 将searchSourceBuilder添加到searchRequest中
    SearchRequest searchRequest = new SearchRequest("paper_db");
    searchRequest.source(searchSourceBuilder);

    // 存储suggest
    HashSet<String> data = new HashSet<String>();
    try {
        // 读取suggest
        SearchResponse searchResponse = this.restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        Suggest suggest = searchResponse.getSuggest();

        if (suggest != null) {
            TermSuggestion result = suggest.getSuggestion("suggest_user");
            for (TermSuggestion.Entry entry : result.getEntries()) {
                for (Suggest.Suggestion.Entry.Option option : entry.getOptions()) {
                    if (option != null) {
                        // Remove special char and repeat data
                        data.add(option.getText().toString());
                    }
                }
            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    return data;
}

elasticsearch搜素关键字自动补全(suggest) elasticsearch搜素关键字自动补全顾名思义 在搜索框搜索时能有提示列表可供选择。 最终效果如下: 该搜索优化功能是elasticsearch自带的即suggest,suggest即存储一个词库,每次搜索发送请求去词库中检索,匹配到即返回。 接下来我们一步一步实现上述功能。 1.建立索引 我这预先准备了一个房屋信息的索引house { "settings": { ... 阅读详情

相关推荐

web搜索引擎(二)-- springboot+lucene

目录 一:springboot整合lucenne 二:整合代码 1.实现简单的查询 2.实现分页以及排序 三:测试工具 1.使用luke查看索引文件中的数据内容 一:springboot整合lucenne 在springboot中整合lucenne实现搜索。实则分为俩个步骤:第一步,读取数据在内存或者硬盘中建立索引。第二步,对索引 文件实现搜索并返回结果。 第一步...

qq_35755863的博客 959

ES multiMatchQuery 短语精确匹配多个字段

ES multiMatchQuery 短语精确匹配多个字段

jessDL的博客 3275

SpringBoot结合Elasticsearch实现个性化搜索推荐模型-01

对于我们传统的应用来说, 常见的搜索无非是用户通过前端发起请求给后端, 后端去DataBase中比如MySQL, Oracle 中完成查询,并返回,这个查询可能是精确匹配,模糊匹配等等,但是这样的搜索功能可以被称之为搜索引擎吗?

ZPJ优快云的博客 1899

elasticsearch -- 使用QueryBuilders进行查询

/** * 系统环境: vm12 下的centos 7.2 * 当前安装版本: elasticsearch-2.4.0.tar.gz */ QueryBuilder 是es中提供的一个查询接口, 可以对其进行参数设置来进行查用擦还训 package com.wenbronk.javaes; import java.net.InetSocketAddress; import ja...

qq_40107342的博客 1393

springboot之集成Elasticsearch

网上 springboot 集成 Elasticsearch 的文章很多,但随着 springboot 和 Elasticsearch 版本的不断升级,绝大多数文章使用的集成方式和调用的方法已经过时,几乎找不到能真正适用最新 springboot 版本和最新 Elasticsearch 版本的文章。本文正是基于最新 springboot 版本和最新 Elasticsearch 版本实现了集成。

rita_0567的博客 2186

springboot整合全文搜索引擎Elasticsearch | Spring Boot 28

???? Java学习路线配套文章:Java学习路线总结,搬砖工逆袭Java架构师(全网最强) ???? 基础推荐:Java基础教程系列 ???? 实战推荐:Spring Boot基础教程 ???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 目录一、Elasticsearch简介二、下载与安装1、Elasticsearch官网下载地址2、下

学Java,找哪吒 1万+

学成在线-第11天-讲义-搜索服务 五

4.4 ServiceService方法代码复杂,这里分三步完成。4.4.1按关键字搜索1)在appliction.yml中配置source_fifield elasticsearch: hostlist: 127.0.0.1:9200 #多个结点中间用逗号分隔 course: index: xc_course type: doc source_field: id,name,grad...

qq_40208605的博客 639

Theil-Sen Median斜率估计和Mann-Kendall趋势分析:以多年NPP数据为例

一、理论 Theil-Sen Median方法又称为Sen斜率估计,是一种稳健的非参数统计的趋势计算方法。该方法计算效率高,对于测量误差和利群数据不敏感,适用于长时间序列数据的趋势分析。其计算公式为: Mann-Kendall(MK)检验是一种非参数的时间序列趋势性检验方法,其不需要测量值服从正太分布,不受缺失值和异常值的影响,适用于长时间序列数据的趋势显著检验。其过程如下:对 于 序 列Xt = x1,x2,⋯xn,先确定所有对偶值( xi , xj ,...

丑唐的修炼之旅 8万+

SpringBoot整合Elasticsearch实现商品搜索

本文主要介绍在Elasticsearch中实现商品搜索功能 中文分词器 Elasticsearch有默认的分词器,默认分词器只是将中文逐词分隔,并不符合我们的需求。 get hanzo/_analyze { "text": "小米手机", "tokenizer": "standard" } 需要安装与Elasticsearch版本相同的ik分词器,ik分词器将小米手机分为小米和手机,符合我们的要求。 get hanzo/_analyze { "text": "小米手机", .

在无人区看超市的博客 1802

【vivado PG学习】1 PG168:7 Series FPGAs Transceivers官方配置方法学习笔记

介绍: The 7 series FPGAs Transceivers Wizard LogiCORE™ IP 自动创建配置7系列fpga 收发器的HDL封装。向导可以配置一个或多个支持行业主流标准的高速串行收发器。或者从零开始支持各种自定义协议。 功能: 创建配置7系列fpga 收发器的HDL封装。 自动对模拟设置进行配置。 预定义了提供Aurora 8B/10B, Aurora 64B/66B, CEI-6G,DisplayPort, Interlaken, Open Base StationAr..

w0shishabi的博客 5万+

人大金仓V8R3企业版License更新全攻略:从查看到重启一步到位

本文详细解析了人大金仓V8R3企业版License更新的完整运维流程,涵盖从诊断当前授权状态、获取与验证新文件、精准定位旧文件路径,到安全替换文件及服务重启验证的全过程。重点针对更新流程中常见的版本匹配、文件定位、权限与服务重启等关键环节提供了实战解决方案和避坑指南,帮助运维人员高效、平稳地完成授权续期。

redis7keeper的博客 899

ik分词器实现原理_SpringBoot整合Elasticsearch实现商品搜索

本文主要介绍在Elasticsearch中实现商品搜索功能中文分词器Elasticsearch有默认的分词器,默认分词器只是将中文逐词分隔,并不符合我们的需求。 get hanzo/_analyze { "text": "小米手机", "tokenizer": "standard" } 需要安装与Elasticsearch版本相同的ik分词器,ik分词器将小米手机...

weixin_30596433的博客 516

深入解析ffmpeg编码错误:avcodec_send_frame()返回-22的排查与修复

本文深入解析FFmpeg编码中avcodec_send_frame()返回-22(AVERROR(EINVAL))错误的根本原因与系统排查方法。核心问题通常在于编码器未正确打开或上下文传递错误。文章提供了从检查编码器查找、确认avcodec_open2()调用,到验证上下文传递的完整修复指南,并附有可运行的代码示例,帮助开发者快速定位并解决这一常见编码障碍。

weixin_28049429的博客 390

SpringBoot结合Elasticsearch实现个性化搜索推荐模型-02

试想一下,假设一个商家的评分是5分,距离用户却有20公里远,在基于位置打分的时候我们明明已经给了它一个极低的分值,但是由于他是5分商家,单个因子的权重过高了,导致它综合的分数名列前茅,直接被优先推荐了出来,这是不合理的,所以我们在带入评分的时候,会有一个归一化处理,也就是说我不管你的评分是几分,统一在1分的前提下开始计算,尽量不让评分干扰过多的综合打分的结果。上一篇文章中,我们在构建索引的时候,有一个location字段,是将经纬度以逗号拼接的方式进行了存储,这个location字段将是关键所在。

ZPJ优快云的博客 1063

Transformer实战(40)——Transformer时间序列数据建模

Transformer 因其在自然语言处理 (Natural Language Processing, NLP) 任务中的优异表现而被广泛应用,其主要优势在于能够有效建模时间序列数据。这些数据可以是文本,也可以是非文本。本节将介绍如何使用 Transformer 进行时间序列数据建模和预测,将学习时间序列的基本概念,并在此基础上使用一个简单的模型,用以初步了解时间序列数据,并为各种预测任务奠定基础。

盼小辉丶的博客 2364

ROCm rocr-libhsakmt分析系列9-3: queue的内核创建流程

KFD队列是用户空间与GPU通信的核心机制,通过多种队列类型(计算、DMA、调试等)实现命令流管理。核心数据结构包括描述队列属性的queue_properties、内核调度对象queue、进程级管理器process_queue_manager,以及跨进程设备的qcm_process_device等。这些结构通过ring buffer、doorbell机制和MQD硬件描述符协同工作,支持队列全生命周期管理、资源调度、异常处理和上下文保存/恢复功能。

图形/计算GPU的驱动与虚拟化技术分享园地 2129

ElasticSearch(超详细解说)[springBoot整合ES并简单实现增删改查]

ElasticSearch简介 ElasticSearch:智能搜索,分布式搜索引擎。 是ELK的一个组成。是一个产品,而且是非常完善的产品,ELK代表的是:E就是ElasticSearch,L就是Logstach,K即使Kibana E:ElasticSearch 搜索和分析的功能; L:Logstach 搜索数据的功能,类似于flume(使用方法几乎跟flume一模一样)。是日志收集系统 K:Kibana 数据可视化(分析),可以用图标的方式来去展示,文不如表,表不如图,是可视化平台。 ElasticS

qq_45039852的博客 1万+

Xilinx平台SRIO介绍(一)RapidIO协议介绍

菜鸟到老鸟:会用工具; 老鸟到大佬:深入理解原理。 ——FPGA大叔·沃自己硕得

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

ElasticSearch全文搜索引擎概述、使用Kibana和JAVA的简单操作

狭义的理解主要针对文本数据的搜索。数据可分为“结构化”数据(关系数据库表形式管理的数据),半结构化数据(XML文档、JSON文档),和非结构化数据(WORD、PDF),通常而言在结构化的数据中搜索性能是比较高的,全文搜索的目的就是把非结构化的数据变成有结构化的数据进行搜索,从而提高搜索效率。Lucene是apache下的一个开源的全文检索引擎工具包(一堆jar包)。它为软件开发人员提供一个简单易用的工具包(类库),以方便的在小型目标系统中实现全文检索的功能。

weixin_60359542的博客 1456

【笔记】1.1 拉伸力-伸长(延伸)曲线和应力-应变曲线

过了B点后,由于颈缩导致的截面半径迅速减小,导致真应力迅速上升,切线斜率明显提高。假设试样原长为ε,在力的作用下伸长了dε,那么根据应变的定义,瞬时的应变为dε/ε,总的应变为瞬时应变的累计,假设在瞬时的条件下,试样受载荷变化量为 ΔF ,变化的截面积为 ΔA ,而且ΔA→0,那么瞬时的。由于原始的截面积和原始的标距长度为常数,故得到的曲线长相和拉伸力-伸长(延伸)曲线没啥区别。因为用的都是原始的截面积和原始的标距长度,故称为公称应力和公称应变。如果拉伸力→应力,伸长长度→应变,就会得到应力-应变曲线。

m0_73676887的博客 5270

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

搜索引擎之ElasticSearch(es)入门学习、ELK 和 beats

好记星不如烂笔头,这里记录平时工作中用到的东西,不喜可以留言。 ElasticSearch为啥要用 ElasticSearch简称es是一个ElasticSearch是一个分布式,高性能、高可用、可伸缩的搜索和分析系统 。可以当做一个上层数据库来使用和关系数据库和Nosql有一定区别和相似性。使用es的几个原因: 关系型数据库模糊搜索不足索引,会全表扫描非常慢。%关键词%这种搜索会非常慢。主...

dazer的专栏 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ES(Elasticsearch)的基本使用

elasticsearch的基本认识,以及springboot整合es的内容

学习笔记 6251

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SpringBoot+Mybatis-Plus+Elasticsearch + RabbitMQ实现关键字搜索高亮展示及数据同步到ES

一、概述&介绍 **Elasticsearch: ** Elasticsearch 是基于Lucense 技术的搜索引擎(服务器),将数据进行缓存再进行查询。 ​ 与数据库查询的比较: ​ (1)相当于sql查询的 like 模糊查询,但Elasticsearch支持分词模糊查询,比如字符串 “abcdef你 好abdcd” ,通过数据库查询 [select * from user where user_name like ‘%你 好%’; ]只能查询仅限于以“你 好”为整体得到相关

郭靖宇的个人博客 4274

Springboot基于ElasticSearch全文搜索引擎策略实现

ElasticSearch是一个基于Lucene的开源搜索引擎,具有分布式、多租户能力的全文搜索引擎。ElasticSearch的设计目标是实现分布式、可扩展和速度快的搜索架构,使得用户在数据量较大的情况下依然能够快速高效地对数据进行搜索和分析。ElasticSearch使用RESTful API进行操作,支持结构化、非结构化数据的索引和搜索,适合用来解决大量数据的全文搜索、数据分析、日志查询等问题。

LQzhang_11的博客 1546

SpringBoot整合ElasticSearch(ES)

值得注意的一点因为es存储的数据是json形式的,所以需要采用JsonObject,Json,Gson,ObjectMapper等json解析工具进行java对象的转换。官方有两个整合方式,一种是Spring封装的,一种是原生的(官方推荐),本人工作时用的也是原生的,原因是spring封装的使用起来有点局限性,反正我认为不好用。通过强大的查询和分析功能,可以帮助用户快速定位和解决问题。推荐系统:Elasticsearch可以通过基于内容的推荐算法,根据用户的历史行为和偏好,为用户推荐相关的内容或产品。

qq_50930205的博客 1550

SpringBoot结合Elasticsearch实现个性化搜索推荐模型-04【推荐模型训练】

当用户在进行关键词搜索时,我们可以通过关键词找出对应的特征,然后将根据特征将数据进行召回,但是用户如果什么关键词都没有输入怎么办呢?

ZPJ优快云的博客 1562
上一篇: 使用kibana实现ES简单搜索
下一篇: Ubuntu18.4离线安装docker
MasonYyp
博客等级 码龄9年 301粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值