【ElasticSearch】RestClient和ElasticsearchTemplate实现高亮查询

在这里插入图片描述
在查询的时候希望,查询结果中的包含查询关键字高亮。(Es版本,6.5.4)

  1. 前提准备,首先建立mapping
POST http://47.101.167.46:9200/hello_es/doc/_mapping
{
	"properties": {
		"name": {
			"type": "text",
			"analyzer":"ik_max_word",
           "search_analyzer":"ik_smart"
		},
		"description": {
			"type": "text",
			"analyzer": "ik_max_word",
            "search_analyzer":"ik_smart"
		
		}
	}
}
  1. 添加文档
 IndexRequest indexRequest = new IndexRequest("hello_es", "doc");
        Map<String, Object> jsonMap = new HashMap<>();
        jsonMap.put("name", "曾经沧海难为水");
        jsonMap.put("description", "本课程主要从四个章节进行讲解: 1.微服务架构入门 2.spring cloud基础入门3.实战SpringBoot4.注册中心eureka");
        indexRequest.source(jsonMap);
        client.index(indexRequest, RequestOptions.DEFAULT);
  1. RestClient查询文档
{
  "query": {
    "match": {
      "name": "曾经"
    }
  },
  "highlight": {
    "pre_tags": ["<tag1>"],
    "post_tags": ["</tag2>"], 
    "fields": {
      "name": {
        "type": "plain"
      }
    }
  }
}
SearchRequest searchRequest = new SearchRequest("hello_es");
        searchRequest.types("doc");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("name","曾经"));

        searchSourceBuilder.fetchSource(new String[]{"name", "description"}, Strings.EMPTY_ARRAY);
        // 设置高亮字段
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.requireFieldMatch(true).field("name")
                .preTags("<strong>").postTags("</strong>");
        searchSourceBuilder.highlighter(highlightBuilder);


        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = searchResponse.getHits();
        SearchHit[] searchHits = hits.getHits();
        Stream.of(searchHits).forEach(model -> {
            String sourceAsString = model.getSourceAsString();
            Map<String, HighlightField> highlightFields = model.getHighlightFields();
            String name = (String) model.getSourceAsMap().get("name");
            if (highlightFields != null) {
                HighlightField nameField = highlightFields.get("name");
                if (nameField != null) {
                    Text[] fragments = nameField.getFragments();
                    StringBuffer stringBuffer = new StringBuffer();
                    for (Text str : fragments) {
                        stringBuffer.append(str.string());
                    }
                    name = stringBuffer.toString();
                }
            }

            log.info("name:{}=====sourceAsString:{}", name, sourceAsString);
        });
  1. ElasticsearchTemplate 高亮方式
String preTag = "<font color='#dd4b39'>";//google的色值
        String postTag = "</font>";

        SearchQuery searchQuery = new NativeSearchQueryBuilder().
                withQuery(matchQuery("name","曾经")).
                withHighlightFields(new HighlightBuilder.Field("name").preTags(preTag).postTags(postTag),
                        new HighlightBuilder.Field("description").preTags(preTag).postTags(postTag)).build();
        List<HelloES> helloES = elasticsearchTemplate.queryForList(searchQuery, HelloES.class);
        System.out.println(helloES);

        // 高亮字段
        AggregatedPage<HelloES> ideas = elasticsearchTemplate.queryForPage(searchQuery, HelloES.class, new SearchResultMapper() {

            @Override
            public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
                List<HelloES> chunk = new ArrayList<>();
                for (SearchHit searchHit : response.getHits()) {
                    if (response.getHits().getHits().length <= 0) {
                        return null;
                    }
                    HelloES idea = new HelloES();

                    String sourceAsString = searchHit.getSourceAsString();
                    System.out.println(sourceAsString);
                    //name or memoe
                    HighlightField ideaTitle = searchHit.getHighlightFields().get("name");
                    if (ideaTitle != null) {
                        idea.setName(ideaTitle.fragments()[0].toString());
                    }
                    HighlightField ideaContent = searchHit.getHighlightFields().get("description");
                    if (ideaContent != null) {
                        idea.setDescription(ideaContent.fragments()[0].toString());
                    }

                    chunk.add(idea);
                }
                if (chunk.size() > 0) {
                    return new AggregatedPageImpl<>((List<T>) chunk);
                }
                return null;
            }
        });

        ideas.get().forEach(model -> {
            System.out.println(model.getName());
        });

总结:这里需要注意的是建立索引的时候,插入索引使用粗力度,搜索使用细粒度。

github地址: https://github.com/fafeidou/fast-cloud-nacos/tree/master/fast-common-examples ,如果喜欢,请给个star,谢谢。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值