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

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

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

所以这里选择重写搜索方法来自定义map返回结果,实现手动分页和替换高亮搜索的结果

		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;
                });
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Elasticsearch是一个开源的分布式搜索和分析引擎,它提供了全文搜索、实时数据分析和数据可视化等功能。在Elasticsearch中实现全文搜索高亮显示可以通过以下步骤来完成: 1. 创建索引:首先,你需要创建一个索引来存储你的文档数据。索引Elasticsearch中用于组织和存储数据的逻辑容器。你可以使用Elasticsearch的API或者客户端库来创建索引。 2. 定义映射:在创建索引之前,你需要定义文档的映射(mapping)。映射定义了文档中的字段以及每个字段的类型。对于需要进行全文搜索高亮显示的字段,你可以将其类型设置为"text"。 3. 添加文档:将你的文档数据添加到索引中。你可以使用Elasticsearch的API或者客户端库来添加文档。 4. 执行搜索使用Elasticsearch搜索API来执行全文搜索。你可以指定搜索条件、过滤条件和排序规则等。在搜索结果中,Elasticsearch返回匹配的文档以及相关的元数据。 5. 高亮显示:为了实现全文搜索高亮显示,你可以使用Elasticsearch高亮功能。在搜索请求中,你可以指定需要高亮显示的字段以及高亮显示的样式。在搜索结果中,Elasticsearch会将匹配的关键词用指定的样式进行标记。 下面是一个示例的搜索请求,用于实现全文搜索高亮显示: ``` GET /your_index/_search { "query": { "match": { "your_field": "your_query" } }, "highlight": { "fields": { "your_field": {} } } } ``` 在上面的请求中,你需要将"your_index"替换为你的索引名称,"your_field"替换为你要搜索的字段名称,"your_query"替换为你的搜索关键词。搜索结果中,匹配的关键词会被用默认的高亮样式进行标记。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值