SpringBoot整合 ElasticSearchRestTemplate使用

本文档介绍了如何在SpringBoot环境中配置和使用Elasticsearch,包括设置环境、创建索引、定义实体类以及使用ElasticsearchRepository进行增删改操作。此外,还展示了如何利用ElasticSearchRestTemplate进行复杂查询,如高亮显示、分页和排序,通过示例代码详细解析了查询条件的构建过程。
摘要由CSDN通过智能技术生成

ElasticSearch ElasticSearchRestTemplate使用

环境准备 SpringBoot 2.4.3 es版本 7.11.1 jdk 1.8

application.yml

#因为本机9200是默认链接地址,未设置用户名密码,唯一未配,如需配置,以下地址配置

在这里插入图片描述

pom.xml

	<properties>
        <java.version>1.8</java.version>
        <!-- es版本与依赖对应 -->
        <elasticsearch.version>7.11.1</elasticsearch.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
创建索引

这里主要是以注解的方式创建索引,建立实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Document(indexName = "jd")   // 所属索引名称
public class Content implements Serializable {
    @Id // 文档中的ID主键   必需
    private Integer id;
    @Field(value = "img")   // 文档中img字段
    private String img;
    @Field(value = "price")
    private String price;
    @Field(value = "title")
    private String title;
}
增删改操作

增删改操作使用,这里不使用ElasticSearchRestTemplate,使用继承ElasticsearchRepository<T, ID>的接口进行操作。

package com.huyonghao.esapi.service;

import com.huyonghao.esapi.model.Content;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Service;

// 建立继承接口注入SpringBoot中,此处不用实现接口,代理对象动态代理生成
@Service
public interface ContentService extends ElasticsearchRepository<Content, Integer> {

}

ElasticsearchRepository<Content, Integer>中的两个泛型,前者是索引中文档对应的对象即Content,后者是主键的类型,因为Content中id定义为Integer 故为Integer。

在这里插入图片描述

该接口有很多方法直接调用,方法可见名知意,不详细赘述。

使用ElasticSearchRestTemplate进行查询

查询之前首先根据增删改API创建索引并存入相应数据。

查看分析调用接口,因为此处实体类中已有索引名称,所以使用第二个有参方法。传入一个Query类型对象与接收的实体类,即Content。

在这里插入图片描述

查看源码定位到Query接口的实现类NativeSearchQuery类,该类中含有许多属性。

public class NativeSearchQuery extends AbstractQuery {
	// 查询条件  比如match  term 等QueryBuilder都是其子类
   @Nullable private final QueryBuilder query;
    // filter查询条件
   @Nullable private QueryBuilder filter;
    // 排序条件
   @Nullable private List<SortBuilder<?>> sorts;
   private final List<ScriptField> scriptFields = new ArrayList<>();
    // 去重
   @Nullable private CollapseBuilder collapseBuilder;
    // 聚合函数
   @Nullable private List<AbstractAggregationBuilder<?>> aggregations;
    // 高亮
   @Nullable private HighlightBuilder highlightBuilder;
   @Nullable private HighlightBuilder.Field[] highlightFields;
   @Nullable private List<IndexBoost> indicesBoost;
   }

多查询条件不详细说明,下图API:

package com.huyonghao.esapi;

import com.huyonghao.esapi.model.Content;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;

import java.util.List;

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    private ElasticsearchRestTemplate restTemplate;

    @Test
    void jdHighLight() {
        // 高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder().preTags("<span style='color:red'>").postTags("</span>").field("title");

        // 分页功能实现  5页
        Pageable pageable = PageRequest.of(0, 5);
        // 排序功能实现
        FieldSortBuilder fieldSortBuilder = new FieldSortBuilder("_score");
		// 条件查询  Match条件
        MatchQueryBuilder matchQueryBuilder = new MatchQueryBuilder("title", "Lebron");

		// Query对象 建造者模式 其中的分页和排序同样看代码可知。
        NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(matchQueryBuilder).withFields("title", "id", "img", "price")
                .withHighlightBuilder(highlightBuilder).withPageable(pageable).withSort(fieldSortBuilder).build();
		// 查询
        SearchHits<Content> hits = restTemplate.search(query, Content.class);

        List<SearchHit<Content>> searchHits = hits.getSearchHits();
        System.out.println("一共" + searchHits.size() + "个");
        for (SearchHit<Content> searchHit : searchHits) {
            // 遍历返回命中结果
            Content content = searchHit.getContent();
            // 获取高亮字段
            List<String> titleHighLightList = searchHit.getHighlightField("title");
            // 将高亮字段替换查询出的对象中的title
            if (titleHighLightList != null) {
                content.setTitle(titleHighLightList.get(0));
            }

            System.out.println(content);
        }
    }
}
输出结果:
一共3个
Content(id=23, img=//img11.360buyimg.com/n7/jfs/t1/164431/15/12012/241074/604b878bEa3eab8ec/8718d814ece40789.jpg, price=¥358.00, title=詹姆斯篮球鞋18代男新款<span style='color:red'>Lebron</span>詹皇秋冬紫金重器黑白粉鸳鸯中国限定高帮战靴运动鞋 反转鸳鸯 39 本店产品均有运费险,支持七天无理由退换,售后无忧!)
Content(id=74, img=//img10.360buyimg.com/n7/jfs/t1/168878/38/7340/162925/60327ec5E81fe0acf/ca6b688e719cc17f.jpg, price=¥328.00, title=詹姆斯18代篮球鞋男詹16king雄狮球鞋詹皇15鸳鸯联名彩虹17战靴运动鞋 <span style='color:red'>Lebron</span> 16 灰彩虹 40 本店产品均有运费险,支持七天无理由退换,售后无忧!)
Content(id=0, img=//img13.360buyimg.com/n7/jfs/t1/170095/21/12112/218881/604b878bE33736b23/ef53a6182897c50b.jpg, price=¥358.00, title=詹姆斯篮球鞋18代男新款<span style='color:red'>Lebron</span>詹皇秋冬紫金重器黑白粉鸳鸯中国限定高帮战靴运动鞋 紫金重器 43)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值