Spring Data Elasticsearch高亮查询实现
Spring Data Elasticsearch和Spring Data JPA类似,封装了很多易用的查询API,大大简化了我们从elasticsearch集群查询数据的操作,只需实现 ElasticsearchCrudRepository接口即可和JPA使用方式一样。但是其默认的结果结果映射类DefaultResultMapper不支持高亮,因此,本文的重点是介绍如何扩展自定义扩展DefaultResultMapper实现高亮显示功能。
Maven依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<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.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
application.yml配置
此处index-name为自定义参数,因为spring data elasticsearch支持动态索引配置,具体参考文章(https://blog.csdn.net/u014229347/article/details/88896459)
spring:
data:
elasticsearch:
cluster-name: myescluster
cluster-nodes: ip1:9300, ip2:9300, ip3:9300
index-name: test
自定义ResultMapper
思路:自己新增一个设置高亮内容的方法,在mapResults方法中调用即可
//mapResults方法中新增高亮设置调用
this.populateHighLightedFields(result, hit.getHighlightFields());
新增方法:populateHighLightedFields() 和 textToStr()
其余方法都来自DefaultResultMapper的源码实现,代码可参考如下,
package com.ylp729.config;
import com.fasterxml.jackson.core.JsonEncoding;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import org.apache.commons.beanutils.PropertyUtils;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.document.DocumentField;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.ElasticsearchException;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.ScriptedField;
import o