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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章