spring中应用模板模式封装ElasticsearchTemplate

1.查询
?

@Override
public <T> FacetedPage<T> queryForPage(SearchQuery query, Class<T> clazz, SearchResultMapper mapper) {
    SearchResponse response = doSearch(prepareSearch(query, clazz), query);
    return mapper.mapResults(response, clazz, query.getPageable());
}

?

?

?

主要逻辑在doSearch方法中

?

private SearchResponse doSearch(SearchRequestBuilder searchRequest, SearchQuery searchQuery) {
    if (searchQuery.getFilter() != null) {
        searchRequest.setPostFilter(searchQuery.getFilter());
    } 

    if (CollectionUtils.isNotEmpty(searchQuery.getElasticsearchSorts())) {
        for (SortBuilder sort : searchQuery.getElasticsearchSorts()) {
            searchRequest.addSort(sort);
        }
    } 

    if (CollectionUtils.isNotEmpty(searchQuery.getFacets())) {
        for (FacetRequest facetRequest : searchQuery.getFacets()) {
            FacetBuilder facet = facetRequest.getFacet();
            if (facetRequest.applyQueryFilter() && searchQuery.getFilter() != null) {
                facet.facetFilter(searchQuery.getFilter());
            }
            searchRequest.addFacet(facet);
        }
    } 

    if (searchQuery.getHighlightFields() != null) {
        for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) {
            searchRequest.addHighlightedField(highlightField);
        }
    } 

    if (CollectionUtils.isNotEmpty(searchQuery.getAggregations())) {
        for (AbstractAggregationBuilder aggregationBuilder : searchQuery.getAggregations()) {
            searchRequest.addAggregation(aggregationBuilder);
        }
    }
    return getSearchResponse(searchRequest.setQuery(searchQuery.getQuery()).execute());
}

?

该方法主要处理逻辑

1.加入顺序参数

2.设置参数过滤参数

3.设置高亮显示参数

?

?

结果处理由组件?ResultsMapper 结果映射器处理

public interface ResultsMapper extends SearchResultMapper, GetResultMapper, MultiGetResultMapper {

EntityMapper getEntityMapper(); 

}
?

?

public interface SearchResultMapper {

<T> FacetedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable); 

}
?

初始化映射器

public ElasticsearchTemplate(Client client, ElasticsearchConverter elasticsearchConverter, ResultsMapper resultsMapper) {
this.client = client;
this.elasticsearchConverter = (elasticsearchConverter == null) ? new MappingElasticsearchConverter(
new SimpleElasticsearchMappingContext()) : elasticsearchConverter;
this.resultsMapper = (resultsMapper == null) ? new DefaultResultMapper(this.elasticsearchConverter.getMappingContext()) : resultsMapper;
}
?

默认实现的映射器DefaultResultMapper

?

@Override
public <T> FacetedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
    long totalHits = response.getHits().totalHits();
    List<T> results = new ArrayList<T>();
    for (SearchHit hit : response.getHits()) {
        if (hit != null) {
            T result = null;
            if (!Strings.isNullOrEmpty(hit.sourceAsString())) {
                result = mapEntity(hit.sourceAsString(), clazz);
            } else {
                result = mapEntity(hit.getFields().values(), clazz);
            }
            setPersistentEntityId(result, hit.getId(), clazz);
            results.add(result);
        }
    }
    List<FacetResult> facets = new ArrayList<FacetResult>();
    if (response.getFacets() != null) {
        for (Facet facet : response.getFacets()) {
            FacetResult facetResult = DefaultFacetMapper.parse(facet);
            if (facetResult != null) {
                facets.add(facetResult);
            }
        }
    } 

    return new FacetedPageImpl<T>(results, pageable, totalHits, facets);
}

?

?

?

主要是讲json格式转换为指定Class类型bean对象

?

?

##2.自主扩展

?

搜索逻辑绝大部分可以固化封装,只有结果处理需要留出用户扩展空间,可以用回调的方式,定义接口,参数中传入匿名实现

?

@Override
public <T> T query(SearchQuery query, ResultsExtractor<T> resultsExtractor) {
SearchResponse response = doSearch(prepareSearch(query), query);
return resultsExtractor.extract(response);
}
?

?

public interface ResultsExtractor<T> {

T extract(SearchResponse response); 

}
?

学习视频

?

复制链接,在浏览器打开
tomcat源码解析
https://study.163.com/course/introduction/1209535854.htm

Springmvc源码解析
https://study.163.com/course/introduction/1209536851.htm

dubbo源码解析
https://study.163.com/course/introduction/1209648816.htm

原文地址:https://blog.51cto.com/3921161/2463640

时间: 2024-10-12 17:57:42

spring中应用模板模式封装ElasticsearchTemplate的相关文章

spring中的原型模式

大家好,我原本是神剑山庄的铸剑师,名叫小赵,本来干的好好的,后来一时兴起,睡了三少爷的小姨子,与其一直提心吊胆,干脆来个逃之夭夭. 但是,我也要吃饭的呀,工作也得找,神剑山庄去不得,还有断剑山庄.藏剑山庄.荡剑山庄.等等等等大型企业,说不定这次跳槽,能跳出个飞黄腾达! 为了提高我投简历的准确性,我觉得简历要写的多样化,不能全写一模一样,比如说我的期望薪资不能写成一样,因为我希望能够根据目标企业的情况来投递合适薪资的简历,这样中标概率大一点. 这是我的简历类: public class Resum

Spring中ApplicationEvent和ApplicationListener封装

1.测试程序EventTest.java,发布一个事件只需要调用FrameEventHolder.publishEvent()方法即可. 1 package com.junge.spring.event; 2 3 import com.junge.spring.vo.Mail; 4 5 public class EventTest { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 Frame

Spring中的设计模式:模板模式

导读 模板模式在是Spring底层被广泛的应用,比如事务管理器的实现,JDBC模板的实现. 文章首发于作者的微信公众号[码猿技术专栏] 今天就来谈谈「什么是模板模式」.「模板模式的优缺点」.「模板模式的简单演示」.「模板模式在Spring底层的实现」. 什么是模板模式 模板模式首先要有一个抽象类,这个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式. 定义:「定义一个操作中的算法骨架,而将算法的一些步骤延

spring中策略模式使用

策略模式 工作中经常使用到策略模式+工厂模式,实现一个接口多种实现的灵活调用与后续代码的扩展性.在spring中使用策略模式更为简单,所有的bean均为spring容器管理,只需获取该接口的所有实现类即可. 下面以事件处理功能为例,接收到事件之后,根据事件类型调用不同的实现接口去处理.如需新增事件,只需扩展实现类即可,无需改动之前的代码.这样即做到了功能的隔离,又可防止改动原代码导致的bug. 类图 代码示例 定义接口 public interface IBaseEventService { /

Spring中使用到的设计模式

1.工厂模式:Beanfactory和ApplicationContext 2.单例模式:bean的构建 3.代理模式:AOP 4.模板模式:jdbcTemplate,hibernateTemplate等以Template结尾的对数据库操作的类,一般情况下,是使用继承的方式来实现模板模式,但spring没有使用这种方式,而死使用Callback模式与模板方法模式配合,即达到了代码服饰的效果,同时增加了灵活性. ps: Spring中的Callback模式与Template模式合用,随处可见.Te

springboot中添加模板引擎freemarker和thymeleaf

freemarkder和thymeleaf都是java的模板引擎,这里只介绍这两种模板引擎如何在sprongboot中配置: 1. freemarkder 1.1 在pom.xml中添加依赖包 <!-- 集成freemarker --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</ar

设计模式(7)--模板模式

//7.模板模式 //ver1 //考试试卷类 class TestPaper { public: void TestQuestion1(){} void TestQuestion2(){} virtual string Answer1() { return ""; } virtual string Answer2() { return ""; } }; class TestPaperA : public TestPaper { public: void TestQ

[工作中的设计模式]模板模式

一.模式解析 准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意 模板模式的关键点为: 1.有一个父类,将整体业务逻辑和公用方法进行封装: 2.父类将具体的有差异的业务定义为抽象方法: 3.子类继承父类后,实现这些抽象方法,完成对自己业务流程的: 4.子类不可以改变父类的整体业务逻辑流程: 5.子类也可以覆盖父类中其他方法,实现定制化业务

spring 中单利模式的理解

一.Spring单例模式与线程安全 Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线程开发的时候要尤其注意的地方. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求多对应的业务逻辑(成员方法),此时就要注意了,如果该处理逻辑中有对该单列状态的修改(体现为该单列的成员属性),则必须考虑线程同步问题