Es elasticsearch 二十 站内搜索示例 高亮内容 java springboot 实现

这篇具有很好参考价值的文章主要介绍了Es elasticsearch 二十 站内搜索示例 高亮内容 java springboot 实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

实现思路

代码

全依赖

参数对象

搜索实现代码全代码

日志

重点

权重

分页

入参高亮数据处理

返回出参数据处理


实现思路

构建请求

请求体设置搜索字段

返回数据解析获取高亮 高亮通过设置标签和class  前端设置class字体颜色 也可直接写在后端


 

代码

全依赖

package com.esbase.fintech.ais;

import lombok.Data;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.xcontent.ToXContent;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.histogram.*;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.*;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.jupiter.api.Test;
import org.junit.platform.commons.util.StringUtils;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

参数对象

/**
 * 根据站内规则设置参数对象
 * @author jianghaoyu
 */
@Data
@ToString
static class CourseSearchParam{
    String keyword;//关键词
    String mt; //一级分类
    String st;//二级分类
    String grade;//难度等级
    Float priceMin;//价格区间
    Float priceMax;
    String sort;//排序字段
    String filter;//过滤字段
}

搜索实现代码全代码


@Test
public void jh6() throws IOException {
    CourseSearchParam courseSearchParam = new CourseSearchParam();
    courseSearchParam.setKeyword("红色");
    query(1, 20, courseSearchParam);

}

public void query(int page, int size, CourseSearchParam courseSearchParam) throws IOException {
    if (courseSearchParam == null) {
        courseSearchParam = new CourseSearchParam();
    }
    SearchRequest searchRequest = new SearchRequest("tvs");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

    //过滤字段
    String[] sArr = "brand,color,price,sold_date".split(",");
    searchSourceBuilder.fetchSource(sArr, new String[]{});

    //查询
    BoolQueryBuilder bqb = QueryBuilders.boolQuery();
    if (StringUtils.isNotBlank(courseSearchParam.getKeyword())) {//如果关键词存在进入
        //如果这几个字段中匹配达到70%  如果name中有提升10倍
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(courseSearchParam.getKeyword(),
                "brand", "color").minimumShouldMatch("20%").field("brand", 10);//如果name 中有提示10倍
        bqb.must(multiMatchQueryBuilder);
    }
    //增加字段级别条件
    if (StringUtils.isNotBlank(courseSearchParam.getMt())) {//一级分类
        bqb.filter(QueryBuilders.termQuery("mt", courseSearchParam.getMt()));
    }
    if (StringUtils.isNotBlank(courseSearchParam.getSt())) {//二级分类
        bqb.filter(QueryBuilders.termQuery("st", courseSearchParam.getSt()));
    }
    if (StringUtils.isNotBlank(courseSearchParam.getGrade())) {//难度等级
        bqb.filter(QueryBuilders.termQuery("grade", courseSearchParam.getGrade()));
    }

    searchSourceBuilder.query(bqb);

    //分页
    searchSourceBuilder.from((page - 1) * size);
    searchSourceBuilder.size(size);

    //设置 高亮 前端使用对应的class
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.preTags("<font class='esLight'>");
    highlightBuilder.postTags("</font>");
    //高亮字段
    highlightBuilder.fields().add(new HighlightBuilder.Field("color"));
    searchSourceBuilder.highlighter(highlightBuilder);

    searchRequest.source(searchSourceBuilder);

    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    //

    //看结果
    SearchHits hits = searchResponse.getHits();
    log.info(hits.getTotalHits().value + "");
    for (SearchHit key : hits.getHits()) {
        Map<String, Object> sourceAsMap = key.getSourceAsMap();
        log.info(key.getId() + key.getSourceAsMap().get("brand") + key.getSourceAsMap().get("color"));

        String brand = (String) sourceAsMap.get("brand");

        //设置高亮
        //取出高亮字name
        Map<String, HighlightField> highlightFields = key.getHighlightFields();
        if (highlightFields != null) {
            HighlightField hfn = highlightFields.get("color");
            if (hfn != null) {
                Text[] fragments = hfn.fragments();
                StringBuffer stringBuffer = new StringBuffer();
                for (Text text : fragments) {
                    stringBuffer.append(text);
                }
                log.info("高亮:"+stringBuffer.toString());
                brand = stringBuffer.toString();
            }
        }
        log.info("brand = " + brand);
    }
}

日志


23-06-07.16:29:07.024 [main            ] INFO  SpringBootEsApplicationTestsGj  - 3
23-06-07.16:29:07.038 [main            ] INFO  SpringBootEsApplicationTestsGj  - 1天虹红色
23-06-07.16:29:07.038 [main            ] INFO  SpringBootEsApplicationTestsGj  - 高亮:<font class='esLight'>红色</font>
23-06-07.16:29:07.038 [main            ] INFO  SpringBootEsApplicationTestsGj  - brand = <font class='esLight'>红色</font>
23-06-07.16:29:07.038 [main            ] INFO  SpringBootEsApplicationTestsGj  - 3天虹红色
23-06-07.16:29:07.038 [main            ] INFO  SpringBootEsApplicationTestsGj  - 高亮:<font class='esLight'>红色</font>
23-06-07.16:29:07.038 [main            ] INFO  SpringBootEsApplicationTestsGj  - brand = <font class='esLight'>红色</font>
23-06-07.16:29:07.038 [main            ] INFO  SpringBootEsApplicationTestsGj  - 4天虹红色
23-06-07.16:29:07.038 [main            ] INFO  SpringBootEsApplicationTestsGj  - 高亮:<font class='esLight'>红色</font>
23-06-07.16:29:07.038 [main            ] INFO  SpringBootEsApplicationTestsGj  - brand = <font class='esLight'>红色</font>


 

重点

权重

BoolQueryBuilder bqb = QueryBuilders.boolQuery();
if (StringUtils.isNotBlank(courseSearchParam.getKeyword())) {//如果关键词存在进入
    //如果这几个字段中匹配达到70%  如果name中有提升10倍
    MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(courseSearchParam.getKeyword(),
            "brand", "color").minimumShouldMatch("20%").field("brand", 10);//如果name 中有提示10倍
    bqb.must(multiMatchQueryBuilder);
}

分页


//分页
searchSourceBuilder.from((page - 1) * size);
searchSourceBuilder.size(size);

 

 

入参高亮数据处理


//设置 高亮 前端使用对应的class
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<font class='esLight'>");
highlightBuilder.postTags("</font>");
//高亮字段
highlightBuilder.fields().add(new HighlightBuilder.Field("color"));
searchSourceBuilder.highlighter(highlightBuilder);

返回出参数据处理

 

String brand = (String) sourceAsMap.get("brand");

//设置高亮
//取出高亮字name
Map<String, HighlightField> highlightFields = key.getHighlightFields();
if (highlightFields != null) {
    HighlightField hfn = highlightFields.get("color");
    if (hfn != null) {
        Text[] fragments = hfn.fragments();
        StringBuffer stringBuffer = new StringBuffer();
        for (Text text : fragments) {
            stringBuffer.append(text);
        }
        log.info("高亮:"+stringBuffer.toString());
        brand = stringBuffer.toString();
    }
}
log.info("brand = " + brand);

ok

持续更新文章来源地址https://www.toymoban.com/news/detail-784173.html

到了这里,关于Es elasticsearch 二十 站内搜索示例 高亮内容 java springboot 实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 了解基于Elasticsearch 的站内搜索,及其替代方案

    对于一家公司而言,数据量越来越多,如果快速去查找这些信息是一个很难的问题,在计算机领域有一个专门的领域IR(Information Retrival)研究如何获取信息,做信息检索。在国内的如百度这样的搜索引擎也属于这个领域,要自己实现一个搜索引擎是非常难的,不过通过Elas

    2024年02月03日
    浏览(26)
  • 【独家深度】Gitlab基于Elasticsearch的站内搜索设计

    通过分析Gitlab的站内搜索设计,借鉴其设计经验,来改进自己的站内搜索方案,包括领域对象划分,索引设计,权限控制设计。 这可能是国内第一篇详细解剖Gitlab站内搜索设计实现的文章。 Gitlab的免费版本采用的是Postgresql的FTS(full text search)进行搜索。 Gitlab的白金版本才支

    2024年02月03日
    浏览(26)
  • 基于 ElasticSearch 实现站内全文搜索,写得太好了

    搜索引擎服务使用ElasticSearch 提供的对外web服务选则springboot web 1.1 ElasticSearch Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企

    2024年04月27日
    浏览(17)
  • 【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

    在 Elasticsearch 中,通过 RestAPI 进行 DSL 查询语句的构建通常是通过 HighLevelRestClient 中的 resource() 方法来实现的。该方法包含了查询、排序、分页、高亮等所有功能,为构建复杂的查询提供了便捷的接口。 RestAPI 中构建查询条件的核心部分是由一个名为 QueryBuilders 的工具类提供

    2024年01月16日
    浏览(50)
  • ElasticSearch实战之项目搜索高亮

    为满足 ElasticSearch 可在项目中实现搜索高亮,我们需要先做一些前情配置 导入 ElasticSearch 依赖 修改 propertise 配置 构建一个搜索类对象,这里假设我们存在一个搜索对象为 Content ,其中我们要进行查询的字段是 title 同时,假设我们拥有 ListContent 数据集合,至此,我们做好了

    2024年04月22日
    浏览(25)
  • 用ES搜索关键字并且返回模糊字段高亮

       一般来说,各个网站,首页的搜索,都会有进行全文搜索的示例,并且把模糊匹配的多个数据进行标记(高亮),这样便于全局检索关键的数据,便于客户进行浏览。基于此,本文简单介绍这种功能基本java 的 实现    由于公司页面此功能隐藏了,本文就以接口调用返回看具

    2024年02月14日
    浏览(36)
  • elasticsearch搜索关键字高亮显示

    使用 elasticsearch 时,有一个很常见的需求是,能在页面上将搜索出的结果中属于的文字,进行高亮显示。 elasticsearch 对这个做了一定的支持,它能查询结果的基础上,额外返回需要高亮显示的整个文本,至于具体你想怎么用它,需要根据业务自行实现。 使用 k

    2023年04月08日
    浏览(36)
  • Vue中实现自动匹配搜索框内容 关键字高亮文字显示

    实现效果如下:  1.首先需要给输入框进行双向绑定  2.拿到搜索的结果去渲染页面  将返回的结果和搜索的进行比对 如果相同的 就变红 上代码 html部分 js部分

    2024年02月12日
    浏览(33)
  • ElasticSearch系列七:ElasticSearch搜索技术深入讲解之高亮

    1.高亮显示         在搜索中,经常需要对搜索做高亮显示,高亮显示也有其常用的参数,在这个案例中做一些常用参数的介绍。假如现在搜索cars索引中remark字段中包含“大众”的document。并对“XX”做高亮显示,高亮效果使用html标签span,并设定字体为红色

    2023年04月09日
    浏览(52)
  • Elasticsearch:RestHighLevelClient实现搜索、分页、排序、高亮

    1.引入依赖 2.自定义搜索DTO 3.封装工具类、实现 分页、高亮、排序 反射工具类 ReflectUtil 是我自定义的,原理是反射,可以引入hutool的工具包,同样也可以实现该结果

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包