spring boot 集成 elasticsearch 7.x (三)

上篇讲了索引的管理,接着讲查询。

查询基本代码


    @Autowired
    RestHighLevelClient restHighLevelClient;

/**
     * @param idxName  index
     * @param builder  查询参数
     * @param pageNo   查询参数
     * @param pageSize 查询参数
     * @return java.util.List<T>
     */
    public Page<Map<String, Object>> searchByPage(String idxName, SearchSourceBuilder builder, int pageNo, int pageSize) {
        SearchRequest request = new SearchRequest(idxName);
        request.source(builder);
        try {
            SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
            Page<Map<String, Object>> resultPage = getSearchResultPage(pageNo, pageSize, response);
            return resultPage;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    
/***
     */
    protected Page<Map<String, Object>> getSearchResultPage(int pageNo, int pageSize, SearchResponse response) {
        SearchHits hits = response.getHits();
        Long totalCount = hits.getTotalHits().value;
        Page<Map<String, Object>> page = new Page<>(pageNo, pageSize, totalCount.intValue());
        page.setList(getHitList(hits));
        return page;
    }

查询条件

构造查询条件开始

创建一个bool查询开头


        // 构造查询条件,使用标准分词器.
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();

加入且查询条件

类似 sql 语句的且。

queryBuilder.must(QueryBuilders.matchPhrasePrefixQuery("categoryCode", categoryCode));

加入带或子查询关系的查询条件

查询条件中,可以有嵌套查询,可以是且可以是或。



        // title 和 content 两个字段or 模糊查询
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyword, "title", "content")
                .analyzer("ik_max_word")
                .operator(Operator.OR)
                //默认在operator:or 下,这个是设置匹配精度75%
                .minimumShouldMatch("75%");

        queryBuilder.must(multiMatchQueryBuilder);

加入排序

如果有按某个字段排序需要,则加入排序条件,可以同时多字段排序。


        // 排序
        List<SortBuilder> sortBuilderList = new ArrayList<>();
        SortBuilder sortBuilder = new FieldSortBuilder("publishDate");
        sortBuilder.order(SortOrder.ASC);
        sortBuilderList.add(sortBuilder);

高亮显示

有需要高亮显示时,就可以设置高亮返回的字段。


        // 设置高亮,使用默认的highlighter高亮器
        HighlightBuilder highlightBuilder = ElasticUtil.createHighlightBuilder("title", "content");


/**
     * 构造高亮器
     */
    public static HighlightBuilder createHighlightBuilder(String... fieldNames) {
        // 设置高亮,使用默认的highlighter高亮器
        HighlightBuilder highlightBuilder = new HighlightBuilder()
                .preTags("<span style='color:red'>")
                .postTags("</span>");

        // 设置高亮字段
        for (String fieldName : fieldNames) {
            //highlightBuilder.field(fieldName);

            HighlightBuilder.Field highlightField =  new HighlightBuilder.Field(fieldName);
            highlightField.highlighterType("unified");
            highlightBuilder.field(highlightField);
        }

        return highlightBuilder;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章