SpringBoot集成ElasticSearch(ES)实现全文搜索功能

 更新时间:2024年02月29日 10:02:25   作者:A尘埃  
Elasticsearch是一个开源的分布式搜索和分析引擎,它被设计用于处理大规模数据集,它提供了一个分布式多用户能力的全文搜索引擎,本文将给大家介绍SpringBoot集成ElasticSearch(ES)实现全文搜索功能,需要的朋友可以参考下

Document可以看作表中的一条记录,Index可以看作Database数据库,而Type就是里面的Table表。

一、依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<optional>true</optional>
</dependency>

二、在application.properties文件中添加ElasticSearch连接信息

server.port=8080
#es 配置信息
spring.main.allow-bean-definition-overriding=true
elasticsearch.host=127.0.0.1
elasticsearch.port=9300
elasticsearch.clustername=elasticsearch
elasticsearch.search.pool.size=5

启动类

@SpringBootApplication
public class SSD08Application {

	public static void main(String[] args) {
		SpringApplication.run(SSD08Application.class, args);
	}

}

三、创建Elasticsearch配置类

@Slf4j
@Configuration
@EnableElasticsearchRepositories(basePackages = "com.yoodb.study.demo08.service")
public class ElasticsearchConfig{
	
	@Value("${elasticsearch.host}")
	private String esHost;

	@Value("${elasticsearch.port}")
    private int esPort;

    @Value("${elasticsearch.clustername}")
    private String esClusterName;

    @Value("${elasticsearch.search.pool.size}")
    private Integer threadPoolSearchSize;

	@Bean
	public Client client() throws Exception{
		Settings esSettings = Settings.builder()
			.put("cluster.name",esClusterName)
			.put("client.transoprt.sniff",true)
			.put("thread_pool.search.size",threadPoolSearchSize)
			.build();
		return new PreBuiltTransportClient(esSettings)
			.addTransoprtAddress(new TransportAddress(InetAddress.getByName(esHost), esPort));
	}

	@Bean(name="elasticsearchTemplate")
	public ElasticsearchOperations elasticsearchTemplateCustom() throws Exception {
		
		ElasticsearchTemplate elasticsearchTemplate;
		try{
			elasticsearchTemplate = new ElasticsearchTemplate(client());
            return elasticsearchTemplate;
		}catch(Exception e){
			return new ElasticsearchTemplate(client());
		}
	}
}

四、创建Article实体类

@Document 作用在类,标记实体类为文档对象,一般有两个属性

indexName:对应索引库名称

type:对应在索引库中的类型

shards:分片数量,默认分5片

replicas:副本数量,默认1份

  • @Id 作用在成员变量,标记一个字段作为id主键
  • @Field 作用在成员变量,标记为文档的字段,并指定字段映射属性

type:字段类型,取值是枚举:FieldType

index:是否索引,布尔类型,默认是true

store:是否存储,布尔类型,默认是false

analyzer和searchAnalyzer中参数名称保持一直,ik_max_word可以改成ik_smart

ik_max_word和ik_smart的区别?

  • ik_max_word参数采用穷尽式的分词,比如“我爱家乡”,可能会分出“我”,“我爱”,“家乡”等
  • ik_smart参数分的会比较粗,如上语句可能会分出“我爱”,“家乡”这样

如果想要搜索出的结果尽可能全,可以使用ik_max_word参数,如果需要结果尽可能精确,可以使用ik_smart参数

Document(indexName = "blog",type = "article")
public class Article {
    /**
     * 主键ID
     */
    @Field(type = FieldType.Keyword)
    private String id;

    /**
     * 文章标题
     */
    @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String title;

    /**
     * 文章内容
     */
    @Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
    private String content;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }

}

五、继承ElasticsearchRepository接口

public interface ElasticRepository extends ElasticsearchRepository<Article, String> {

}

六、IElasticService接口以及实现类

public interface IElasticService {

    public void save(Article article);

    public void saveAll(List<Article> list);

    public Iterator<Article> findAll();

    public List<Article> findArticleByTitle(String title);

}
@Service("elasticService")
public class ElasticServiceImpl implements IElasticService {

    @Autowired
    private ElasticRepository elasticRepository;


    @Override
    public void save(Article article) {
        elasticRepository.deleteAll();
        elasticRepository.save(article);
    }

    @Override
    public void saveAll(List<Article> list) {
        elasticRepository.saveAll(list);
    }

    @Override
    public Iterator<Article> findAll() {
        return elasticRepository.findAll().iterator();
    }

    public List<Article> findArticleByTitle(String title) {
        //matchQuery 对关键字分词后进行搜索
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", title);
        QueryBuilders.commonTermsQuery("title",title);
        Iterable<Article> search = elasticRepository.search(matchQueryBuilder);
        Iterator<Article> iterator = search.iterator();
        List<Article> list = new ArrayList<>();
        while (iterator.hasNext()){
            Article next = iterator.next();
            list.add(next);
        }
        return list;
    }
}

七、控制层Controller

@Log4j2
@RestController
@RequestMapping("/elastic")
public class ElasticController {

    @Autowired
    private IElasticService elasticService;

    @GetMapping("/init")
    public void init(){
        String title = "关注“Java精选”微信公众号";
        String content = "Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架" +
                "(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、" +
                "数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及" +
                "优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习" +
                "和工作有所帮助。";
        Article article = createArticle(title, content);
        elasticService.save(article);

        title = "关注素文宅博客";
        content = "素文宅博客主要关于一些Java技术类型文章分享。";
        article = createArticle(title, content);
        List<Article> list = new ArrayList<>();
        list.add(article);
        elasticService.saveAll(list);
    }

    public static Article createArticle(String title,String content){
        UUID uuid = UUID.randomUUID();
        String id = uuid.toString();
        Article article = new Article();
        article.setId(id);
        article.setTitle(title);
        article.setContent(content);
        return article;
    }

    @GetMapping("/all")
    public Iterator<Article> all(){
        return elasticService.findAll();
    }

    @GetMapping("/key")
    public List<Article> all(String title){
        return elasticService.findArticleByTitle(title);
    }

}

运行程序

1)启动ElasticSearch服务

在这里插入图片描述

在这里插入图片描述

2)启动SpringBoot项目访问地址

初始化生成索引文件访问地址

http://localhost:8080/elastic/init

获取所有索引内容访问地址

http://localhost:8080/elastic/all

[{"id":"62e73653-4658-4d72-9b2e-e541a3ae7d53","title":"关注“Java精选”微信公众号","content":"Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。"},{"id":"1e7c2f0b-e07e-4037-a3a3-3385d8b7d2c1","title":"关注素文宅博客","content":"素文宅博客主要关于一些Java技术类型文章分享。"}]

根据搜索条件,获取索引内容访问地址

http://localhost:8080/elastic/key?title=Java%E7%B2%BE%E9%80%89

返回结果:

[{"id":"62e73653-4658-4d72-9b2e-e541a3ae7d53","title":"关注“Java精选”微信公众号","content":"Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。"}]

以上就是SpringBoot集成ElasticSearch(ES)实现全文搜索功能的详细内容,更多关于SpringBoot ElasticSearch全文搜索的资料请关注脚本之家其它相关文章!

相关文章

  • 基于zipoutputStream的简单使用

    基于zipoutputStream的简单使用

    这篇文章主要介绍了基于zipoutputStream的简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Spring AOP实现打印HTTP接口出入参日志

    Spring AOP实现打印HTTP接口出入参日志

    这篇文章主要为大家详细介绍了Spring AOP如何实现打印HTTP接口出入参日志功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-09-09
  • 通过端口1433连接到主机127.0.0.1的 TCP/IP 连接失败,错误:“connect timed out”的解决方法

    通过端口1433连接到主机127.0.0.1的 TCP/IP 连接失败,错误:“connect timed out”的解

    这篇文章主要介绍了通过端口1433连接到主机127.0.0.1的 TCP/IP 连接失败,错误:“connect timed out”的解决方法,需要的朋友可以参考下
    2015-08-08
  • Java 爬虫如何爬取需要登录的网站

    Java 爬虫如何爬取需要登录的网站

    这篇文章主要介绍了Java 爬虫如何爬取需要登录的网站,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 10种java数组合并的常用方法总结

    10种java数组合并的常用方法总结

    在Java中,合并(或连接)数组是常见的任务,这篇文章主要为大家整理了10个java中常用的数组合并方法,文中的示例代码简洁易懂,需要的小伙伴可以参考下
    2023-12-12
  • maven依赖包加载缓慢的原因以及解决方案

    maven依赖包加载缓慢的原因以及解决方案

    这篇文章主要介绍了maven依赖包加载缓慢的原因以及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java中Map和Set的常见用法举例

    Java中Map和Set的常见用法举例

    Map和Set是一种专门用来进行搜索的容器或者数据结构,其具体效率与具体的实例化子类有关,下面这篇文章主要给大家介绍了关于Java中Map和Set的常见用法,需要的朋友可以参考下
    2024-04-04
  • MybatisPlus实现对象嵌套关联查询一对多List集合查询

    MybatisPlus实现对象嵌套关联查询一对多List集合查询

    这篇文章主要介绍了MybatisPlus实现对象嵌套关联查询一对多List集合查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Springboot3整合Mybatis3的完整步骤记录

    Springboot3整合Mybatis3的完整步骤记录

    这篇文章主要给大家介绍了关于Springboot3整合Mybatis3的完整步骤,Spring Boot和MyBatis分别是两个功能强大的框架,它们的协同使用可以极大地简化数据访问层的开发,提高整体的开发效率,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 基于java构造方法Vector遍历元素源码分析

    基于java构造方法Vector遍历元素源码分析

    本篇文章是关于ava构造方法Vector源码分析系列文章,本文主要介绍了Vector遍历元素的源码分析,有需要的朋友可以借鉴参考下,希望可以有所帮助
    2021-09-09

最新评论