springboot与es集成操作-基础篇2(自定义权重进行分页高亮查询)

springboot与es二三事之自定义权重进行分页高亮查询

1.控制器具体实现

前面的添加依赖、yml中增加es配置、索引实体类、实现Repository操作与springboot与es集成操作-基础篇保持一致。。。。。。
分页查询,高亮查询

import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;


        @Autowired
    private ElasticsearchRestTemplate restTemplate;
   //使用es 自定义权重进行分页高亮查询
    @GetMapping("/listSearch")
    public RestResult<ListPageResult<SubstanceSearch>> getSubstanceAndArea(@RequestParam String name,
                                                                           @RequestParam(defaultValue = "0") Integer pageNumber,
                                                                           @RequestParam(defaultValue = "10") Integer pageSize) throws Exception {
        ListPageResult<SubstanceSearch> result = new ListPageResult<SubstanceSearch>();

        //高亮显示
        String pre = "<strong>";
        String post = "</strong>";
        String[] list = null;
        Map<String, Float> fields = null;
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        //指定要高亮的字段将其加上头尾标签
        fields = new HashMap(4);
        list = substanceList;
        //设置查询字段的权重
        fields.put("name", 1f);
        fields.put("displayName", 1f);
        fields.put("CASNumber", 1f);
        fields.put("typeName", 0.9f);
        boolQueryBuilder.must(QueryBuilders.multiMatchQuery(name).fields(fields));
        //高亮字段信息
        HighlightBuilder.Field[] highlightFields = new HighlightBuilder.Field[list.length];
        for (int i = 0; i < list.length; i++) {
            HighlightBuilder.Field nameHight = new HighlightBuilder.Field(list[i]).preTags(pre).postTags(post).fragmentOffset(50);
            highlightFields[i] = nameHight;
        }

        //构建Search对象
        NativeSearchQuery build = new NativeSearchQueryBuilder()
                //条件
                .withQuery(boolQueryBuilder)
/*                .withQuery(QueryBuilders.boolQuery()
                                .should(QueryBuilders.termQuery("name", name))
                                .should(QueryBuilders.termQuery("containSubstance", name)))*/
                //排序
                //  .withSort(SortBuilders.fieldSort("controlTime").order(SortOrder.ASC))
                //高亮
                .withHighlightFields(highlightFields)
                //分页
                .withPageable(PageRequest.of(pageNumber, pageSize))
                //构建
                .build();

        SearchHits<SubstanceSearch> search = restTemplate.search(build, SubstanceSearch.class);

        // 得到查询结果返回的内容
        List<SearchHit<SubstanceSearch>> searchHits = search.getSearchHits();
        // 设置一个需要返回的实体类集合
        List<SubstanceSearch> discussPosts = new ArrayList<>();
        // 遍历返回的内容进行处理
        for (SearchHit<SubstanceSearch> searchHit : searchHits) {
            // 高亮的内容
            Map<String, List<String>> highLightFields = searchHit.getHighlightFields();
            // 将高亮的内容填充到content中
            searchHit.getContent().setName(highLightFields.get("name") == null ? searchHit.getContent().getName() : highLightFields.get("name").get(0));
            searchHit.getContent().setDisplayName(highLightFields.get("displayName") == null ? searchHit.getContent().getDisplayName() : highLightFields.get("displayName").get(0));
            searchHit.getContent().setContain(highLightFields.get("contain") == null ? searchHit.getContent().getContain() : highLightFields.get("contain").get(0));
            searchHit.getContent().setCASNumber(highLightFields.get("CASNumber") == null ? searchHit.getContent().getCASNumber() : highLightFields.get("CASNumber").get(0));

            // 放到实体类中
            discussPosts.add(searchHit.getContent());
        }
        //计算分页信息
        long pages = search.getTotalHits() == 0 ? 0 : (search.getTotalHits() % pageSize == 0 ? search.getTotalHits() / pageSize : (search.getTotalHits() / pageSize) + 1);
        result = new ListPageResult<SubstanceSearch>(pageSize, pageNumber, pages, search.getTotalHits(), discussPosts);

        return RestResultHelper.success(result);
    }

ListPageResult实体情况

@ApiModel("分页结果")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ListPageResult<Entity> {

    @ApiModelProperty(value = "每页记录数", name = "pageSize", dataType = "long", example = "10")
    private long pageSize;

    @ApiModelProperty(value = "页序", name = "pageNumber", dataType = "long", example = "1")
    private long pageNumber;

    @ApiModelProperty(value = "总页数", name = "pageCount", dataType = "long", example = "0")
    private long pageCount;

    @ApiModelProperty(value = "总记录数", name = "recordCount", dataType = "long", example = "0")
    private long recordCount;

    @ApiModelProperty(value = "记录", name = "list", dataType = "Entity[]", example = "[]")
    private List<Entity> list;
}

分页查询结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值