elasticsearch高亮查询

elasticsearch高亮查询

    package com.jmyp.test;

import com.jmyp.SearchApplication;
import com.jmyp.dao.RepositoryDao;
import com.jmyp.pojo.Item;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.SearchResultMapper;
import org.springframework.data.elasticsearch.core.aggregation.AggregatedPage;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

     /**
         * 高亮查询
         */
        @Test
        public void findByHeighLight(){
            //创建查询构造器
            NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
    
            //查询关键字
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(QueryBuilders.matchQuery("title", "手机"))
                                                                    .filter(QueryBuilders.termQuery("brand", "华为"))
                                                                    .filter(QueryBuilders.rangeQuery("price").from(10).to(50));

        //条件搜索
        //分类
//        queryBuilder.withFilter(QueryBuilders.matchQuery("category","手机"));
//        //品牌
//        queryBuilder.withFilter(QueryBuilders.matchQuery("brand","华为"));
//
//        //价格区间过滤
//        queryBuilder.withFilter(QueryBuilders.rangeQuery("price").from(10).to(50));
//        //排序
//        queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC));
        queryBuilder.withQuery(boolQueryBuilder);
        //分页查询
        queryBuilder.withPageable(PageRequest.of(0,5));

        //设置高亮
        queryBuilder.withHighlightFields(new HighlightBuilder.Field("title").preTags("<font color='red'>").postTags("</font>"));

        //使用es查询
        esTemplate.queryForPage(queryBuilder.build(), Item.class, new SearchResultMapper() {

            @Override
            public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> aClass, Pageable pageable) {

                //从response中获取结果
                SearchHits hits = response.getHits();
                
                //定义一个集合
                List<Item> itemList = new ArrayList<>();

                //获取命中文本结果
                //循环命中集合
                for (SearchHit hit : hits) {
                    //获取结果数据
                    Map<String, Object> result = hit.getSource();

                    //创建商品对象
                    Item item = new Item();

                    //获取id
                    Integer id = (Integer)result.get("id");
                    //判断id是否为空
                    if(id!=null){
                        //设置id
                        item.setId((long)id);
                    }

                    //获取title
                    HighlightField title = hit.getHighlightFields().get("title");
                    //判断title不为空
                    if(title!=null){
                        //获取高亮值
                        String title2 = title.getFragments()[0].toString();
                        System.out.println("高亮字段:"+title2);
                        item.setTitle(title2);
                    }

                    //将查询结果放入集合
                    itemList.add(item);
                }

                //返回
                if(itemList!=null && itemList.size()>0){
                    return new AggregatedPageImpl(itemList);
                }

                //否则返回null
                return null;
            }
        });




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值