国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spring boot使用elasticsearch分詞,排序,分頁,高亮簡單示例

這篇具有很好參考價(jià)值的文章主要介紹了spring boot使用elasticsearch分詞,排序,分頁,高亮簡單示例。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

記,寫一個(gè)簡單的es分詞demo,es版本6.8.12

如果使用es7有些方法可能會(huì)有所改變,請參考7的文檔

es安裝教程:http://t.csdn.cn/BSh12

1. 創(chuàng)建ES實(shí)體

怎么簡單怎么來

@Data
@Document(indexName = "goods")
public class GoodsEsItem implements Serializable {
    //主鍵
    @Id
    private Long id;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")  //商品名
    private String name;
    
    private String category;


    @Field(type = FieldType.Date)
    private Date create_time;

    @Field(type = FieldType.Date)
    private Date update_time;

}

2. 創(chuàng)建查詢實(shí)體

@Data
public class GoodsQueryVo {
    /**
     * 關(guān)鍵字
     */
    private String keyword;

    /**
     * 分類
     */
    private String category;


    /**
     * 當(dāng)前頁
     */
    private Integer current;

    /**
     * 每頁大小
     */
    private Integer pageSize;

    /**
     * 排序字段
     */
    private String sfield;

    /**
     * 排序格式asc,desc
     */
    private String sm;
}

3. 查詢方法實(shí)現(xiàn)

3.1 核心代碼

@Override
public Map<String, Object> searchByKeyword(GoodsQueryVo goodsQueryVo) {
    	//構(gòu)建查詢條件
        NativeSearchQueryBuilder queryBuilder = queryBuilder(goodsQueryVo);

        //添加高亮域
        HighlightBuilder.Field field = new HighlightBuilder.
                Field("name").                      //指定的高亮域
                preTags("<span style=\"color:red\">").   //前綴
                postTags("</span>").                      //后綴
                fragmentSize(100);
        queryBuilder.withHighlightFields(field);
        //執(zhí)行搜索。HighlightResultMapper處理高亮文本
        AggregatedPage<PblGoodsEsItem> results = elasticsearchRestTemplate.queryForPage(queryBuilder.build(), PblGoodsEsItem.class, new HighlightResultMapper());
        //結(jié)果集
        Map<String, Object> resultMap = new HashMap<String, Object>();
        resultMap.put("list", results.getContent());
        resultMap.put("total", results.getTotalElements());
        return resultMap;
}

3.2 構(gòu)建查詢條件

商品名稱加了 @Field(type = FieldType.Text, analyzer = “ik_max_word”) 會(huì)自動(dòng)分詞

private NativeSearchQueryBuilder queryBuilder(GoodsQueryVo goodsQueryVo) {
    //關(guān)鍵字分詞
    EsIkResult esIkResult = keywordToken(goodsQueryVo);
    List<String> tokens = esIkResult.getTokens().stream().map(EsIkResult.token::getToken).collect(Collectors.toList());
    //QueryBuilder構(gòu)建
    NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

    //多條件組合查詢對象
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

    //關(guān)鍵字條件should構(gòu)建or條件,must構(gòu)建and條件
    BoolQueryBuilder keywordQuery = QueryBuilders.boolQuery();
    tokens.forEach(e -> {
        keywordQuery.should(QueryBuilders.termQuery("name", e));
    });
	
    //分類條件
    if (!StringUtils.isEmpty(goodsQueryVo.getCategory())) {
        boolQuery.must(QueryBuilders.termQuery("category",goodsQueryVo.getCategory()));
    }
    //這里的關(guān)系為(keyword1 or keyword2) and category
    boolQuery.must(keywordQuery);
    //分頁
    queryBuilder.withPageable(PageRequest.of(currentPage(goodsQueryVo), goodsQueryVo.getPageSize()));
    //排序
    String sfield = goodsQueryVo.getSfield();
    String sm = goodsQueryVo.getSm();
    if (!StringUtils.isEmpty(sfield) && !StringUtils.isEmpty(sm)) {
        queryBuilder.withSort(
            SortBuilders.fieldSort(sfield)   //排序域
            .order(SortOrder.valueOf(sm)));  //排序方式
    }
    return queryBuilder.withQuery(boolQuery);
}

分頁處理

public int currentPage(GoodsQueryVo goodsQueryVo) {
    try {
        Object currentPage = goodsQueryVo.getCurrent();
        return Integer.parseInt(currentPage.toString()) > 0 ? Integer.parseInt(currentPage.toString()) - 1 : 0;
    } catch (Exception e) {
        return 0;
    }
}

3.2.1 關(guān)鍵詞分詞

當(dāng)輸入衣服鞋子的時(shí)候會(huì)將關(guān)鍵字分為衣服,鞋子去查詢

@Data
public class EsIkResult {

    private List<token> tokens;

    @Data
    public static class token{
        private String token;

        @JSONField(name = "start_offset")
        private Integer startOffset;

        @JSONField(name = "end_offset")
        private Integer endOffset;

        private String type;

        private Integer position;
    }
}

HttpUtil是自己封裝的http請求類,可以根據(jù)自己的方式去發(fā)出請求文章來源地址http://www.zghlxwxcb.cn/news/detail-475419.html

private EsIkResult keywordToken(GoodsQueryVo goodsQueryVo) {
    HashMap<String, Object> params = new HashMap<>();
    params.put("analyzer", "ik_max_word");
    params.put("text", goodsQueryVo.getKeyword());
    return HttpUtil.post("http://localhost:9200/_analyze?pretty", params, EsIkResult.class);
}

3.3 高亮處理

高亮處理mapper,處理高亮數(shù)據(jù),復(fù)制用即可,不需要記

public class HighlightResultMapper extends DefaultResultMapper {
    /***
     * 處理結(jié)果集
     */
    @Override
    public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
        //所有數(shù)據(jù)
        for (SearchHit hit : response.getHits()) {
            //當(dāng)前單條數(shù)據(jù)
            Map<String, Object> sourceMap = hit.getSourceAsMap();
            //高亮數(shù)據(jù)
            for (Map.Entry<String, HighlightField> entry : hit.getHighlightFields().entrySet()) {
                String key = entry.getKey();
                if (sourceMap.containsKey(key)) {
                    Text[] fragments = entry.getValue().getFragments();
                    sourceMap.put(key, transTextArrayToString(fragments));
                }
            }
            hit.sourceRef(new ByteBufferReference(ByteBuffer.wrap(JSONObject.toJSONString(sourceMap).getBytes())));
        }
        return super.mapResults(response, clazz, pageable);
    }

    /***
     * 拼接數(shù)據(jù)碎片
     */
    private String transTextArrayToString(Text[] fragments) {
        if (null == fragments) {
            return "";
        }
        StringBuffer buffer = new StringBuffer();
        for (Text fragment : fragments) {
            buffer.append(fragment.string());
        }
        return buffer.toString();
    }
}

添加高亮,在上面·searchByKeyword方法有寫到

此處會(huì)將name字段含有關(guān)鍵字的文本替換成<span style=“color:red”> 包含,前端用html回顯即可

示例,搜索衣服

spring boot使用elasticsearch分詞,排序,分頁,高亮簡單示例

//添加高亮域
HighlightBuilder.Field field = new HighlightBuilder.
        Field("name").                      //指定的高亮域
        preTags("<span style=\"color:red\">").   //前綴
        postTags("</span>").                      //后綴
        fragmentSize(100);
queryBuilder.withHighlightFields(field);
//執(zhí)行搜索。HighlightResultMapper處理高亮文本
AggregatedPage<PblGoodsEsItem> results = elasticsearchRestTemplate.queryForPage(queryBuilder.build(), PblGoodsEsItem.class, new HighlightResultMapper());

4.完整查詢代碼展示

ps:

高亮處理代碼上方已給出,此處只給出搜索代碼

HttpUtil是自己封裝的http請求類,可以根據(jù)自己的方式去發(fā)出請求

@Service
public class GoodsEsServiceImpl implements GoodsEsService {

    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

    @Override
    public Map<String, Object> searchByKeyword(GoodsQueryVo goodsQueryVo) {
        //構(gòu)建查詢條件
        NativeSearchQueryBuilder queryBuilder = queryBuilder(goodsQueryVo);

        //添加高亮域
        HighlightBuilder.Field field = new HighlightBuilder.
                Field("name").                      //指定的高亮域
                preTags("<span style=\"color:red\">").   //前綴
                postTags("</span>").                      //后綴
                fragmentSize(100);
        queryBuilder.withHighlightFields(field);
        //執(zhí)行搜索。HighlightResultMapper處理高亮文本
        AggregatedPage<PblGoodsEsItem> results = elasticsearchRestTemplate.queryForPage(queryBuilder.build(), PblGoodsEsItem.class, new HighlightResultMapper());
        //結(jié)果集
        Map<String, Object> resultMap = new HashMap<String, Object>();
        resultMap.put("list", results.getContent());
        resultMap.put("total", results.getTotalElements());
        return resultMap;
    }

    private NativeSearchQueryBuilder queryBuilder(GoodsQueryVo goodsQueryVo) {
        //關(guān)鍵字分詞
        EsIkResult esIkResult = keywordToken(goodsQueryVo);
        List<String> tokens = esIkResult.getTokens().stream().map(EsIkResult.token::getToken).collect(Collectors.toList());
        //QueryBuilder構(gòu)建
        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();

        //多條件組合查詢對象
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

        //關(guān)鍵字條件should構(gòu)建or條件,must構(gòu)建and條件
        BoolQueryBuilder keywordQuery = QueryBuilders.boolQuery();
        tokens.forEach(e -> {
            keywordQuery.should(QueryBuilders.termQuery("name", e));
        });

        //分類條件
        if (!StringUtils.isEmpty(goodsQueryVo.getCategory())) {
            boolQuery.must(QueryBuilders.termQuery("category",goodsQueryVo.getCategory()));
        }
        //這里的關(guān)系為(keyword1 or keyword2) and category
        boolQuery.must(keywordQuery);
        //分頁
        queryBuilder.withPageable(PageRequest.of(currentPage(goodsQueryVo), goodsQueryVo.getPageSize()));
        //排序
        String sfield = goodsQueryVo.getSfield();
        String sm = goodsQueryVo.getSm();
        if (!StringUtils.isEmpty(sfield) && !StringUtils.isEmpty(sm)) {
            queryBuilder.withSort(
                    SortBuilders.fieldSort(sfield)   //排序域
                            .order(SortOrder.valueOf(sm)));  //排序方式
        }
        return queryBuilder.withQuery(boolQuery);
    }

    public int currentPage(GoodsQueryVo goodsQueryVo) {
        try {
            Object currentPage = goodsQueryVo.getCurrent();
            return Integer.parseInt(currentPage.toString()) > 0 ? Integer.parseInt(currentPage.toString()) - 1 : 0;
        } catch (Exception e) {
            return 0;
        }
    }

    private EsIkResult keywordToken(GoodsQueryVo goodsQueryVo) {
        HashMap<String, Object> params = new HashMap<>();
        params.put("analyzer", "ik_max_word");
        params.put("text", goodsQueryVo.getKeyword());
        return HttpUtil.post("http://localhost:9200/_analyze?pretty", params, EsIkResult.class);
    }
}

到了這里,關(guān)于spring boot使用elasticsearch分詞,排序,分頁,高亮簡單示例的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot 整合ElasticSearch實(shí)現(xiàn)模糊查詢,批量CRUD,排序,分頁,高亮

    SpringBoot 整合ElasticSearch實(shí)現(xiàn)模糊查詢,批量CRUD,排序,分頁,高亮

    準(zhǔn)備一個(gè)空的SpringBoot項(xiàng)目 寫入依賴 注意你的SpringBoot和你的es版本,一定要對應(yīng),如果不知道的可以查看這篇文章:https://blog.csdn.net/u014641168/article/details/130386872 我的版本是2.2.6,所以用的ES版本是 6.8.12,安裝es請看這篇文章:https://blog.csdn.net/u014641168/article/details/130622430 查看

    2024年02月08日
    瀏覽(41)
  • ElasticSearch - 基于 JavaRestClient 查詢文檔(match、精確、復(fù)合查詢,以及排序、分頁、高亮)

    ElasticSearch - 基于 JavaRestClient 查詢文檔(match、精確、復(fù)合查詢,以及排序、分頁、高亮)

    目錄 一、基于 JavaRestClient 查詢文檔 1.1、查詢 API 演示 1.1.1、查詢基本框架 DSL 請求的對應(yīng)格式 響應(yīng)的解析 1.1.2、全文檢索查詢 1.1.3、精確查詢 1.1.4、復(fù)合查詢 1.1.5、排序和分頁 1.1.6、高亮 1.1.1、查詢基本框架 接下里通過一個(gè) match_all 查詢所有,來演示以下基本的 API. 由上可

    2024年02月07日
    瀏覽(24)
  • ElasticSearch DSL語句(bool查詢、算分控制、地理查詢、排序、分頁、高亮等)

    ElasticSearch DSL語句(bool查詢、算分控制、地理查詢、排序、分頁、高亮等)

    查詢所有:查詢所有數(shù)據(jù),一般在測試時(shí)使用。march_all,但是一般顯示全部,有一個(gè)分頁的功能 全文檢索(full text)查詢:利用分詞器對用戶的輸入內(nèi)容進(jìn)行分詞,然后去倒排索引庫匹配。例如: match_query mutil_match_query 精確查詢:根據(jù)精確詞條值查詢數(shù)據(jù),一般查找的時(shí)k

    2024年02月12日
    瀏覽(23)
  • Elasticsearch 核心技術(shù)(九):搜索結(jié)果處理(分頁、排序、指定返回字段、去重、高亮顯示)

    Elasticsearch 核心技術(shù)(九):搜索結(jié)果處理(分頁、排序、指定返回字段、去重、高亮顯示)

    ?? 博客主頁:水滴技術(shù) ?? 支持水滴: 點(diǎn)贊 ?? + 收藏 ? + 留言 ?? ?? 訂閱專欄:大數(shù)據(jù)核心技術(shù)從入門到精通

    2023年04月13日
    瀏覽(23)
  • 微服務(wù)分布式搜索引擎 ElasticSearch 搜索結(jié)果處理 排序、分頁與高亮

    微服務(wù)分布式搜索引擎 ElasticSearch 搜索結(jié)果處理 排序、分頁與高亮

    本文參考黑馬 分布式Elastic search Elasticsearch是一款非常強(qiáng)大的開源搜索引擎,具備非常多強(qiáng)大功能,可以幫助我們從海量數(shù)據(jù)中快速找到需要的內(nèi)容 搜索結(jié)果處理 搜索的結(jié)果可以按照用戶指定的方式去處理或展示。 elasticsearch默認(rèn)是根據(jù)相關(guān)度算分(_score)來排序,但是也支

    2024年02月02日
    瀏覽(44)
  • 在Spring Boot中整合Elasticsearch并實(shí)現(xiàn)高亮搜索

    本文詳細(xì)介紹了如何在Spring Boot項(xiàng)目中整合Elasticsearch,實(shí)現(xiàn)高亮搜索功能。通過添加依賴、配置Spring Boot、為實(shí)體類添加注解,以及在Service層實(shí)現(xiàn)高亮搜索,讀者能夠了解如何在實(shí)際項(xiàng)目中利用Spring Boot Data Elasticsearch來操作Elasticsearch并實(shí)現(xiàn)高亮搜索。驗(yàn)證示例演示了如何使用RESTful API端點(diǎn)來搜索并獲取包含高亮字段的用戶列表,為讀者提供了實(shí)際應(yīng)用的參考。這篇文章將幫助讀者輕松掌握Spring Boot與Elasticsearch的整合方法,從而為項(xiàng)目增加強(qiáng)大的搜索功能。

    2024年02月06日
    瀏覽(29)
  • [Spring Boot]12 ElasticSearch實(shí)現(xiàn)分詞搜索功能

    [Spring Boot]12 ElasticSearch實(shí)現(xiàn)分詞搜索功能

    我們在使用搜索功能的時(shí)候,有時(shí),為了使搜索的結(jié)果更多更廣,比如搜索字符串“領(lǐng)導(dǎo)力”,希望有這些組合的結(jié)果(領(lǐng)導(dǎo)力、領(lǐng)導(dǎo)、領(lǐng)、導(dǎo)、力)都要能夠全部展示出來。 這里我們引入ElasticSearch結(jié)合分詞插件,來實(shí)現(xiàn)這樣的搜索功能。 比如:一款app需要對“課程”進(jìn)行

    2024年02月03日
    瀏覽(21)
  • 知識點(diǎn)13--spring boot整合elasticsearch以及ES高亮

    知識點(diǎn)13--spring boot整合elasticsearch以及ES高亮

    本章知識點(diǎn)沿用知識點(diǎn)12的項(xiàng)目,介紹如何使用spring boot整合ES,沒有ES的去我主頁 各類型大數(shù)據(jù)集群搭建文檔--大數(shù)據(jù)原生集群本地測試環(huán)境搭建三 中可以看到ES如何搭建 不管你有沒有ES,最好是沒有,因?yàn)橐欢ㄒ酪稽c(diǎn),一定要去官網(wǎng)查一下你當(dāng)前用的spring boot data es的版

    2024年02月12日
    瀏覽(97)
  • ElasticSearch 學(xué)習(xí)9 spring-boot ,elasticsearch7.16.1實(shí)現(xiàn)中文拼音分詞搜索

    ElasticSearch 學(xué)習(xí)9 spring-boot ,elasticsearch7.16.1實(shí)現(xiàn)中文拼音分詞搜索

    一、elasticsearch官網(wǎng)下載:Elasticsearch 7.16.1 | Elastic 二、拼音、ik、繁簡體轉(zhuǎn)換插件安裝 ik分詞:GitHub - medcl/elasticsearch-analysis-ik: The IK Analysis plugin integrates Lucene IK analyzer into elasticsearch, support customized dictionary. 拼音分詞:GitHub - medcl/elasticsearch-analysis-pinyin: This Pinyin Analysis plugin is

    2024年01月22日
    瀏覽(28)
  • springboot+Elasticsearch實(shí)現(xiàn)word,pdf,txt內(nèi)容抽取并高亮分詞全文檢索

    springboot+Elasticsearch實(shí)現(xiàn)word,pdf,txt內(nèi)容抽取并高亮分詞全文檢索

    文章目錄 需求 一、環(huán)境 二、功能實(shí)現(xiàn) 1.搭建環(huán)境 2.文件內(nèi)容識別 三.代碼 ? ? ? ? 產(chǎn)品希望我們這邊能夠?qū)崿F(xiàn)用戶上傳PDF,WORD,TXT之內(nèi)得文本內(nèi)容,然后用戶可以根據(jù)附件名稱或文件內(nèi)容模糊查詢文件信息,并可以在線查看文件內(nèi)容 ? ? ? ? 項(xiàng)目開發(fā)環(huán)境: ??????????

    2023年04月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包