溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

spring中如何使用模式封裝ElasticsearchTemplate

發(fā)布時間:2020-06-12 12:26:50 來源:億速云 閱讀:394 作者:Leah 欄目:編程語言

spring中如何使用模式封裝ElasticsearchTemplate?這篇文章運(yùn)用了實(shí)例代碼展示,代碼非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

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.加入順序參數(shù)

2.設(shè)置參數(shù)過濾參數(shù)

3.設(shè)置高亮顯示參數(shù)

結(jié)果處理由組件 ResultsMapper 結(jié)果映射器處理

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;
}

默認(rèn)實(shí)現(xiàn)的映射器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格式轉(zhuǎn)換為指定Class類型bean對象

##2.自主擴(kuò)展

搜索邏輯絕大部分可以固化封裝,只有結(jié)果處理需要留出用戶擴(kuò)展空間,可以用回調(diào)的方式,定義接口,參數(shù)中傳入匿名實(shí)現(xiàn)

@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); }

以上就是spring中使用模式封裝ElasticsearchTemplate的方法,詳細(xì)使用情況還需要大家自己親自動手使用過才能領(lǐng)會。如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI