elasticsearch使用template搜索多个索引并且高亮返回结果

这篇具有很好参考价值的文章主要介绍了elasticsearch使用template搜索多个索引并且高亮返回结果。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

由于搜索多个索引没办法以定义好的Entity来接收quey的结果,所以keyword搜索时不能按照以前的方式来直接分页搜索

AggregatedPage<ElasticService> elasticServices = elasticsearchTemplate.queryForPage(nativeSearchQuery, ElasticService.class);

所以这里选择重写搜索方法来自定义map返回结果,实现手动分页和替换高亮搜索的结果文章来源地址https://www.toymoban.com/news/detail-514119.html

		Pageable pageable = PageRequest.of(pageNum, pageSize, Sort.Direction.DESC, "update_time");
        // 关键字可在name字段进行通配符搜索
        QueryBuilder nameWildcardNameQuery = QueryBuilders.wildcardQuery("name", "*" + keywords + "*");
        QueryBuilder categoryNameWildcardNameQuery = QueryBuilders.wildcardQuery("categoryName", "*" + keywords + "*");
        // name字段boost提高,从而match之后提高得分
        Map<String, Float> fieldMap = new HashMap<>();
        fieldMap.put("name", 5.0f);
        fieldMap.put("categoryName", 4.5f);
        fieldMap.put("namespace", 1.0f);
        fieldMap.put("description", 0.5f);
        QueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery(keywords).fields(fieldMap);
        // should不会影响搜索结果,但match多了可提高得分
       QueryBuilder keywordMatchQuery = QueryBuilders.boolQuery().should(nameWildcardNameQuery).should(categoryNameWildcardNameQuery).should(multiMatchQuery);


       //设置高亮条件
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.requireFieldMatch(false); // 如果要多个字段高亮,这项要为false
        highlightBuilder.preTags("<span style=\"color:#2ba6ee\">"); // 高亮设置
        highlightBuilder.postTags("</span>");
        highlightBuilder.field("name");
        highlightBuilder.field("description");
        highlightBuilder.field("category_name");

        NativeSearchQuery nativeSearchQuery = new NativeSearchQueryBuilder()
                .withIndices("template_graph_contact", "tradition_ml_template_group")
                .withQuery(
                        QueryBuilders.boolQuery()
                                .must(keywordMatchQuery)
                )
                .withHighlightBuilder(highlightBuilder)
                .withPageable(pageable)
                .build();

        //查询后自己构造返回结果,手动分页
        Map search = elasticsearchTemplate.query(nativeSearchQuery, response -> {
                    SearchHits hits = response.getHits();
                    Map map = new HashMap();
                    //手动分页
                    double totalPage = Math.ceil(hits.totalHits / (double)pageSize);
                    map.put("totalElements", hits.totalHits);
                    map.put("totalPages", Double.valueOf(totalPage).intValue());
                    map.put("pageNumber", pageNum);
                    map.put("pageSize", pageSize);
                    List<Map> list = new ArrayList<>();
                    for (SearchHit hit : hits) {
                        if (hits.getHits().length <= 0) {
                            return null;
                        }
                        Map<String, Object> source = hit.getSourceAsMap();

                        //将高亮部分进行替换
                        HighlightField name = hit.getHighlightFields().get("name");
                        HighlightField description = hit.getHighlightFields().get("description");
                        HighlightField categoryName = hit.getHighlightFields().get("category_name");
                        if (name != null) {
                            source.replace("name", name.fragments()[0].toString());
                        }
                        if (description != null) {
                            source.replace("description", description.fragments()[0].toString());
                        }
                        if (categoryName != null) {
                            source.replace("category_name", categoryName.fragments()[0].toString());
                        }
                        list.add(source);
                    }
                    map.put("source", list);
                    return map;
                });

到了这里,关于elasticsearch使用template搜索多个索引并且高亮返回结果的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • yyds,Elasticsearch Template自动化管理新索引创建

    一、什么是Elasticsearch Template? Elasticsearch Template是一种将预定义模板应用于新索引的功能。在索引创建时,它可以自动为新索引应用已定义的模板。Template功能可用于定义索引的映射、设置和别名等。它是一种自动化管理索引创建的方式,使用户可以在大量索引上快速而一致

    2023年04月08日
    浏览(27)
  • elasticsearch中创建索引模板_index_template

            索引模版是创建索引时自动应用提前设置好的settings、mappings和aliases,通过索引的名称进行匹配。         对索引模版的更改时不会影响目前已经根据索引模版创建的索引。         使用索引模版可以省去创建索引时再次指定settings、mappings、aliases的步骤,

    2024年02月01日
    浏览(64)
  • 【ElasticSearch】使用 Java 客户端 RestClient 实现对文档的查询操作,以及对搜索结果的排序、分页、高亮处理

    在 Elasticsearch 中,通过 RestAPI 进行 DSL 查询语句的构建通常是通过 HighLevelRestClient 中的 resource() 方法来实现的。该方法包含了查询、排序、分页、高亮等所有功能,为构建复杂的查询提供了便捷的接口。 RestAPI 中构建查询条件的核心部分是由一个名为 QueryBuilders 的工具类提供

    2024年01月16日
    浏览(49)
  • Elasticsearch Index Templates(索引模板),如何实现分布式锁

    “type”: “keyword” }, “created_at”: { “type”: “date”, “format”: “” } } } } } 代码@1:触发条件。 代码@2:索引配置定义。 代码@3:索引映射配置。 上述示例对应的JAVA示例如下: public static final void createIndexTemp() { RestHighLevelClient client = EsClient.getClient(); try { PutIndexTemplateRequ

    2024年04月22日
    浏览(28)
  • ElasticSearch实战之项目搜索高亮

    为满足 ElasticSearch 可在项目中实现搜索高亮,我们需要先做一些前情配置 导入 ElasticSearch 依赖 修改 propertise 配置 构建一个搜索类对象,这里假设我们存在一个搜索对象为 Content ,其中我们要进行查询的字段是 title 同时,假设我们拥有 ListContent 数据集合,至此,我们做好了

    2024年04月22日
    浏览(25)
  • elasticsearch搜索关键字高亮显示

    使用 elasticsearch 时,有一个很常见的需求是,能在页面上将搜索出的结果中属于的文字,进行高亮显示。 elasticsearch 对这个做了一定的支持,它能查询结果的基础上,额外返回需要高亮显示的整个文本,至于具体你想怎么用它,需要根据业务自行实现。 使用 k

    2023年04月08日
    浏览(36)
  • ElasticSearch系列七:ElasticSearch搜索技术深入讲解之高亮

    1.高亮显示         在搜索中,经常需要对搜索做高亮显示,高亮显示也有其常用的参数,在这个案例中做一些常用参数的介绍。假如现在搜索cars索引中remark字段中包含“大众”的document。并对“XX”做高亮显示,高亮效果使用html标签span,并设定字体为红色

    2023年04月09日
    浏览(52)
  • Elasticsearch:RestHighLevelClient实现搜索、分页、排序、高亮

    1.引入依赖 2.自定义搜索DTO 3.封装工具类、实现 分页、高亮、排序 反射工具类 ReflectUtil 是我自定义的,原理是反射,可以引入hutool的工具包,同样也可以实现该结果

    2024年02月11日
    浏览(32)
  • 【Elasticsearch】SpringBoot整合ES实现搜索功能 | 高亮显示

    先看代码: controller: serviceImpl: 小结 : 1、添加ES场景启动器 2、yaml配置ES 3、准备需要用到的变量 注:还有一个注入的RestHighLevelClient 结构如下: 具体调用的方法以及设置页码等参看代码。 加断点查看对应searchResponse数据结构: HighlightFields的数据结构: 对照kinaba结果: 3、根

    2024年02月11日
    浏览(33)
  • springboot——集成elasticsearch进行搜索并高亮关键词

    目录 1.elasticsearch概述 3.springboot集成elasticsearch 4.实现搜索并高亮 (1)是什么: Elasticsearch 是位于 Elastic Stack 核心的分布式搜索和分析引擎。 Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。但Lucene 只是一个基于java下的库,需要使用 Java 并要

    2023年04月20日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包