ElasticSearch(十三):Spring Data ElasticSearch 的使用(三)——NativeSearchQuery 高亮查询...

在Elasticsearch的实际应用中,经常需要将匹配到的结果字符进行高亮显示,此处采取NativeSearchQuery原生查询的方法,实现查询结果的高亮显示。

 1 /**
 2      * 高亮查询
 3      */
 4     @Test
 5     public void testNativeSearchQuery(){
 6         String fild="content";
 7         NativeSearchQuery nativeSearchQuery=new NativeSearchQueryBuilder()
 8                 .withQuery(QueryBuilders.queryStringQuery("黄").defaultField(fild))
 9                 .withHighlightFields(new HighlightBuilder.Field(fild))
10                 .build();
11         AggregatedPage<Film> list =  elasticsearchTemplate.queryForPage(nativeSearchQuery, Film.class, new SearchResultMapper() {
12            @Override
13            public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {
14                List<Film> films = new ArrayList<>();
15                SearchHits hits = response.getHits();
16                for (SearchHit hit:hits){
17                    if(hits.getHits().length<=0){
18                        return null;
19                    }
20                    Film film=new Film();
21                    String hightLightMessage = hit.getHighlightFields().get(fild).fragments()[0].toString();
22                    film.setId(Long.parseLong(hit.getId()));
23                    film.setTitle(hit.getSource().get("title").toString());
24                    film.setContent(hit.getSource().get("content").toString());
25                    film.setDirector(hit.getSource().get("director").toString());
26                    film.setPrice(hit.getSource().get("price").toString());
27                    film.setDate(hit.getSource().get("date").toString());
28 
29                    try {
30                        String setMethodName = parSetName(fild);
31                        Class<? extends Film> filmClass = film.getClass();
32                        Method setMethod = filmClass.getMethod(setMethodName,String.class);
33                        setMethod.invoke(film,hightLightMessage);
34                    }catch (Exception e){
35                        e.printStackTrace();
36                    }
37                    films.add(film);
38 
39                }
40                if (films.size()>0){
41                    return new AggregatedPageImpl<>((List<T>) films);
42                }
43                return null;
44            }
45        });
46        list.getContent().forEach(film -> System.out.println(film));
47     }
48 
49 
50 
51     public String parSetName(String fieldName){
52         if (null == fieldName || "".equals(fieldName)) {
53             return null;
54         }
55         int startIndex = 0;
56         if (fieldName.charAt(0) == '_')
57             startIndex = 1;
58         return "set" + fieldName.substring(startIndex, startIndex + 1).toUpperCase()
59                 + fieldName.substring(startIndex + 1);
60     }

测试结果:

 

转载于:https://www.cnblogs.com/guoxiangyue/p/11195433.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值