码迷,mamicode.com
首页 > 编程语言 > 详细

java的elasticsearch做高亮显示

时间:2021-02-04 12:02:49      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:ext   asm   mapper   int   设置   tostring   catch   gre   div   

public SearchResult search(String keyWord, Integer page) {
        PageRequest pageRequest = PageRequest.of(page - 1, ROWS); //设置分页参数

        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.multiMatchQuery(keyWord, "title", "title.pinyin"
                ).operator(Operator.AND)) // match查询
                .withPageable(pageRequest)
                .withHighlightFields(new HighlightBuilder.Field("title")) // 设置高亮
                .build();

        AggregatedPage<HouseData> housePage =
                this.elasticsearchTemplate.queryForPage(searchQuery,
                        HouseData.class, new SearchResultMapper() {
                            @Override
                            public <T> AggregatedPage<T> mapResults(SearchResponse response, Class<T> clazz, Pageable pageable) {

                                if (response.getHits().totalHits == 0) {
                                    return new AggregatedPageImpl<>(Collections.emptyList(), pageable, 0L);
                                }

                                List<T> list = new ArrayList<>();
                                for (SearchHit searchHit : response.getHits().getHits()) {
                                    T obj = (T) ReflectUtils.newInstance(clazz);

                                    try {
                                        FieldUtils.writeField(obj, "id", searchHit.getId(), true);
                                    } catch (IllegalAccessException e) {
                                        e.printStackTrace();
                                    }

                                    // 非高亮字段的数据写入
                                    for (Map.Entry<String, Object> entry : searchHit.getSourceAsMap().entrySet()) {

                                        Field field = FieldUtils.getField(clazz, entry.getKey(), true);
                                        if (null == field) {
                                            continue;
                                        }

                                        try {
                                            FieldUtils.writeField(obj, entry.getKey(), entry.getValue(), true);
                                        } catch (IllegalAccessException e) {
                                            e.printStackTrace();
                                        }
                                    }

                                    for (Map.Entry<String, HighlightField> entry : searchHit.getHighlightFields().entrySet()) {
                                        StringBuilder sb = new StringBuilder();
                                        Text[] fragments = entry.getValue().getFragments();
                                        for (Text fragment : fragments) {
                                            sb.append(fragment.toString());
                                        }

                                        // 写入高亮的内容
                                        try {
                                            FieldUtils.writeField(obj, entry.getKey(), sb.toString(), true);
                                        } catch (IllegalAccessException e) {
                                            e.printStackTrace();
                                        }
                                    }

                                    list.add(obj);
                                }

                                return new AggregatedPageImpl<>(list, pageable, response.getHits().totalHits);
                            }
                        });

        return new SearchResult(housePage.getTotalPages(), housePage.getContent(), null);

    }

 

@Data
@AllArgsConstructor
@NoArgsConstructor
@Document(indexName = "haoke", type = "house", createIndex = false)
public class HouseData {

    @Id
    private String id;
    private String title;
    private String rent;
    private String floor;
    private String image;
    private String orientation;
    private String houseType;
    private String rentMethod;
    private String time;

}

 

java的elasticsearch做高亮显示

标签:ext   asm   mapper   int   设置   tostring   catch   gre   div   

原文地址:https://www.cnblogs.com/zhian/p/14368652.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!