springboot集成elasticsearch,实现搜索提示补全功能

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

springboot集成elasticsearch,通过实体类创建索引,实现搜索提示补全功能


注:在此之前需要下载elasticsearch以及拼音分词器。可以查看这篇文章,免费下载,下载完直接解压就行。https://download.csdn.net/download/weixin_47874230/86514890

一、引入pom依赖

spring-data-elasticsearch版本需要与springboot版本对应,此处使用springboot版本为2.2.13.RELEASE

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.2.12.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

二、修改yml文件

server:
  port: 8080
spring:
  elasticsearch:
    rest:
      uris:
        - http://localhost:9200

三、创建实体类GoodsDoc.java

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;
import org.springframework.data.elasticsearch.core.completion.Completion;
import java.util.Date;


@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "goods", shards = 1, replicas = 0)  //type = "_doc" ,
public class GoodsDoc {

    @Id
    @Field(type = FieldType.Keyword)
    private String id;

    @CompletionField(analyzer = "ik_smart", searchAnalyzer = "ik_smart", maxInputLength = 100)
    private Completion title;

    @Field(type = FieldType.Text)       //测试用,当name和title值相同时,检索结果区别,title查出结果数据较少,name为正常查询
    private String name;

    @Field(type = FieldType.Float)
    private float price;

    @Field(type = FieldType.Text)
    private String desc;

    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createdTime;

    @Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date modifiedTime;
}

四、创建GoodsMapper.java

import com.example.elasticsearch7demo.entity.GoodsDoc;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface GoodsMapper extends ElasticsearchRepository<GoodsDoc, String> {

}

五、创建GoodsController.java

包含创建索引,添加数据,测试功能

import com.example.elasticsearch7demo.mapper.GoodsMapper;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.search.suggest.Suggest;
import org.elasticsearch.search.suggest.SuggestBuilder;
import org.elasticsearch.search.suggest.SuggestBuilders;
import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.completion.Completion;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@RestController
@RequestMapping
public class GoodsController {

    @Autowired
    private ElasticsearchRestTemplate restTemplate;
    @Autowired
    private GoodsMapper goodsMapper;


    //创建索引和映射
    @GetMapping("/create")
    public void testCreateIndex(){
        restTemplate.createIndex(GoodsDoc.class);
        restTemplate.putMapping(GoodsDoc.class);

    }

    //添加数据
    @GetMapping("/insert")
    public void addData() throws Exception {
        List<GoodsDoc> orderDocs = new ArrayList<>();

        List<String> suggestList =  new ArrayList<>();
        String title = "笔记本电脑";
        suggestList.add(title); //可以把多个内容作为suggest的数据源
        Completion suggest = new Completion(suggestList.toArray(new String[suggestList.size()]));
        GoodsDoc orderDoc = new GoodsDoc("1", suggest,title, 100,"笔记本电脑非常方便",new Date(),new Date());
        orderDocs.add(orderDoc);

        suggestList =  new ArrayList<>();
        title = "笔记本";
        suggestList.add(title);
        suggest = new Completion(suggestList.toArray(new String[suggestList.size()]));
        orderDoc = new GoodsDoc("2", suggest,title, 100,"笔记本电脑非常方便",new Date(),new Date());
        orderDocs.add(orderDoc);

        suggestList =  new ArrayList<>();
        title = "笔记本支架";
        suggestList.add(title);
        suggest = new Completion(suggestList.toArray(new String[suggestList.size()]));
        orderDoc = new GoodsDoc("3",  suggest,title, 100,"笔记本电脑非常方便",new Date(),new Date());
        orderDocs.add(orderDoc);

        suggestList =  new ArrayList<>();
        title = "笔记本内存条";
        suggestList.add(title);
        suggest = new Completion(suggestList.toArray(new String[suggestList.size()]));
        orderDoc = new GoodsDoc("4",  suggest,title, 100,"笔记本电脑非常方便",new Date(),new Date());
        orderDocs.add(orderDoc);

        suggestList =  new ArrayList<>();
        title = "联想笔记本";
        suggestList.add(title);
        suggest = new Completion(suggestList.toArray(new String[suggestList.size()]));
        orderDoc = new GoodsDoc("5",  suggest,title, 100,"笔记本电脑非常方便",new Date(),new Date());
        orderDocs.add(orderDoc);



        suggestList =  new ArrayList<>();
        title = "华硕笔记本";
        suggestList.add(title);
        suggest = new Completion(suggestList.toArray(new String[suggestList.size()]));
        orderDoc = new GoodsDoc("6",  suggest,title, 100,"笔记本电脑非常方便",new Date(),new Date());
        orderDocs.add(orderDoc);

        suggestList =  new ArrayList<>();
        title = "联想台式机";
        suggestList.add(title);
        suggest = new Completion(suggestList.toArray(new String[suggestList.size()]));
        orderDoc = new GoodsDoc("7",  suggest,title, 100,"笔记本电脑非常方便",new Date(),new Date());
        orderDocs.add(orderDoc);

        suggestList =  new ArrayList<>();
        title = "笔记本电脑是联想牌子的";
        suggestList.add(title);
        suggest = new Completion(suggestList.toArray(new String[suggestList.size()]));
        orderDoc = new GoodsDoc("8",  suggest,title, 100,"笔记本电脑非常方便",new Date(),new Date());
        orderDocs.add(orderDoc);

        suggestList =  new ArrayList<>();
        title = "你喜欢什么牌子的笔记本?";
        suggestList.add(title);
        suggest = new Completion(suggestList.toArray(new String[suggestList.size()]));
        orderDoc = new GoodsDoc("9", suggest,title, 100,"笔记本电脑非常方便",new Date(),new Date());
        orderDocs.add(orderDoc);

        goodsMapper.saveAll(orderDocs);
    }

    //测试
    @GetMapping("/test")
    public List<String> search(@RequestParam("keywords") String keywords){
        // 使用suggest进行标题联想
        CompletionSuggestionBuilder suggest = SuggestBuilders.completionSuggestion("title")
                //根据什么前缀来联想
//                .prefix("笔记本")
                .prefix(keywords)
                // 跳过重复过滤
                .skipDuplicates(true)
                // 匹配数量
                .size(10);
        SuggestBuilder suggestBuilder = new SuggestBuilder();
        suggestBuilder.addSuggestion("title-suggest",suggest);

        //执行查询
        SearchResponse suggestResp = restTemplate.suggest(suggestBuilder, GoodsDoc.class);

        //拿到Suggest结果
        Suggest.Suggestion<? extends Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option>> orderSuggest = suggestResp
                .getSuggest().getSuggestion("title-suggest");

        // 处理返回结果
        List<String> suggests = orderSuggest.getEntries().stream()
                .map(x -> x.getOptions().stream()
                        .map(y->y.getText().toString())
                        .collect(Collectors.toList())).findFirst().get();

        // 输出内容
        for (String str : suggests) {
            System.out.println("自动补全 = " + str);
        }
        return suggests;
    }

}

六、结果

springboot 整合 elasticsearch 实现搜索自动补全,java,elasticsearch,elasticsearch,spring boot,java
springboot 整合 elasticsearch 实现搜索自动补全,java,elasticsearch,elasticsearch,spring boot,java文章来源地址https://www.toymoban.com/news/detail-697636.html

总结

	以上就是记录的es实体类的创建以及搜索提示补全功能内容。

到了这里,关于springboot集成elasticsearch,实现搜索提示补全功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • SpringBoot集成Elasticsearch搜索引擎

    Elasticsearch是一个基于Lucene的搜索引擎,它提供了实时、可扩展和可伸缩的搜索功能。Spring Boot是一个用于构建新Spring应用的起点,它旨在简化开发人员的工作,使其能够快速地构建可扩展的、可维护的应用程序。 在现代应用程序中,搜索功能是非常重要的。它可以帮助用户快

    2024年02月19日
    浏览(38)
  • elasticsearch[五]:深入探索ES搜索引擎的自动补全与拼写纠错:如何实现高效智能的搜索体验

    前一章讲了搜索中的拼写纠错功能,里面一个很重要的概念就是莱文斯坦距离。这章会讲解搜索中提升用户体验的另一项功能 - [自动补全]。本章直接介绍 ES 中的实现方式以及真正的搜索引擎对自动补全功能的优化。 大家对上面的这个应该都不陌生,搜索引擎会根据你输入的

    2024年01月24日
    浏览(40)
  • Elasticsearch 搜索测试与集成Springboot3

    Elasticsearch是专门做 搜索 的,它非常擅长以下方面的问题 Elasticsearch对模糊搜索非常擅长(搜索速度很快) 从Elasticsearch搜索到的数据可以根据 评分 过滤掉大部分的,只要返回评分高的给用户就好了(原生就支持排序) 没有那么准确的也能搜出相关的结果(能匹配有相

    2024年01月22日
    浏览(34)
  • springboot——集成elasticsearch进行搜索并高亮关键词

    目录 1.elasticsearch概述 3.springboot集成elasticsearch 4.实现搜索并高亮 (1)是什么: Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。 Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但Lucene 只是一个基于java下的库,需要使用 Java 并要

    2023年04月20日
    浏览(96)
  • 文本域输入提示,自动补全功能

    2024年02月13日
    浏览(22)
  • Qt之输入框带自动补全提示功能

        这个功能主要是提升人机交互的体验,在输入信息时,自动读取历史信息,协助用户自动补全信息,帮助用户快速输入。 使用QComboBox代替传统文本输入框,同时将其属性改为可编辑。 可以不输入信息,下拉选择项 :代码中使用QStringList作为提示信息的输入,将其添加到

    2024年03月11日
    浏览(32)
  • elasticsearch[四]-数据聚合排序查询、搜索框自动补全、数据同步、集群

    **聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的 sql 要方便的多,而且查询速度非常快,可以实现近

    2024年01月19日
    浏览(44)
  • Elasticsearch搜索功能的实现(五)-- 实战

    实战环境 elastic search 8.5.0 + kibna 8.5.0 + springboot 3.0.2 + spring data elasticsearch 5.0.2 + jdk 17 实现效果图片: 实际执行的DSL语句: 注意: 当指定排序条件时 _score 会被置空 加权前效果: 加权后效果: DSL 语句:

    2023年04月18日
    浏览(24)
  • IDEA自动补全&提示功能消失的几种解决方案

    编程工具的智能补全功能对于开发人员来说非常重要。它可以帮助节省时间和减少错误,提高编码效率和质量。 智能补全功能可以在编码过程中自动提示可能的函数、变量、等,并提供相应的选项供开发人员选择。这可以帮助开发人员更快速地完成代码,避免拼写错误

    2024年04月15日
    浏览(28)
  • 【ElasticSearch和whoosh实现项目中搜索功能】

    说明: 我们的项目中经常会遇到搜索的功能,最近也写过搜索的功能,用具体的python项目来实现 一.单表搜索 实现对于特定表中的某些字段的模糊搜索匹配 通过用orm查询操作来实现简单真的搜索,虽然比较简单方便但是效率不高,遇到大数据量的就会非常的吃力。 二,全局

    2023年04月09日
    浏览(44)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包