ES部分查询方法,elasticsearch查询方法


前言

本篇文字我记录了ES相关的部分查询方法。


提示:以下是本篇文章正文内容,下面案例可供参考

一、分词条件查询(and/or)

代码如下(示例):
controller

/**
     * 功能描述: 分词条件查询(and/or)
     *
     * @param indexName       索引名
     * @param queryObjectList
     * @return : List<Map<String, String>>
     */
    @PostMapping("/participle")
    @ApiOperation(value = "分词条件查询", notes = "根据索引名、域名、查询关键字分词查询数据")
    public BasePageResponse participleQuery(@RequestParam("indexName") String indexName,
                                            @RequestBody @Validated List<QueryObject> queryObjectList,
                                            @RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
                                            @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize
    ) throws IOException, SelectException {
   
        return pageOk(esqService.participleQuery(indexName, queryObjectList, page, pageSize));
    }

service

public Page participleQuery(String indexName, List<QueryObject> queryObjectList,Integer page,Integer pageSize) throws IOException, SelectException {
   
        SearchRequest searchRequest = new SearchRequest(indexName);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        List<QueryBuilder> should = boolQueryBuilder.should();
        HighlightBuilder highlightBuilder = new HighlightBuilder().preTags(Constant.PRESPAN).postTags(Constant.POSTSPAN);
        List<HighlightBuilder.Field> fields = highlightBuilder.fields();
        for (QueryObject queryObject : queryObjectList) {
   
            MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery(queryObject.getField(), queryObject.getData()).operator(queryObject.getChoice() ? Operator.OR : Operator.AND);
            should.add(matchQueryBuilder);
            fields.add(new HighlightBuilder.Field(queryObject.getField()));
            sourceBuilder.highlighter(highlightBuilder);
            searchRequest.source(sourceBuilder);
        }
        sourceBuilder.query(boolQueryBuilder);
        sourceBuilder.highlighter(highlightBuilder);
        searchRequest.source(sourceBuilder);
        sourceBuilder.from(page-1);//从第几条开始(相当于ES 里大括号下的page)
        sourceBuilder.size(pageSize);//查询多少条(相当于ES 里大括号下的pageSize)
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
        SearchHits hits = searchResponse.getHits();
        SearchHit[] hitsHits = hits.getHits();
        List list = new ArrayList();
        for (SearchHit hitsHit : hitsHits) {
   
            String sourceAsString = hitsHit.getSourceAsString();
            Map<String, String> map = JSONObject.fromObject(sourceAsString);
            // 获取高亮结果,替换goods中的title
            Map<String, HighlightField> highlightFields = hitsHit.getHighlightFields();
            for (QueryObject queryObject : queryObjectList) {
   
                HighlightField highlightField = highlightFields.get(queryObject.getField());
                if (highlightField == null) {
   
                    continue;
                }
                Text[] fragments = highlightField.fragments();
                String fieldValue = fragments[0].toString();
                map.put(queryObject.getField(), fieldValue);
                list.add(JSONObject.fromObject(map).toString());
            }
        }
        Page pages = new Page(page, pageSize);
        pages.setTotal(hits.getTotalHits().value);
        pages.setRecords(list);
        return pages;
    }

二、通配符模糊查询 * or ?

代码如下(示例):

controller

/**
     * 功能描述: 通配符模糊查询 * or ?
     *
     * @param indexName 索引名
     * @return : java.util.List<java.util.Map<java.lang.String,java.lang.String>>
     */
    @PostMapping("/wildcard")
    @ApiOperation(value = "模糊通配符查询", notes = "根据*/?查询数据")
    public BasePageResponse wildcardQuery(@RequestParam("indexName") String indexName, @Validated @RequestBody List<QueryObject> queryObjectList,
                                          @RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
                                          @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize)
            throws SelectException, IOException {
   
        if (queryObjectList == null || queryObjectList.isEmpty()) {
   
            throw new SelectException(ResponseEnum.DATA_NULL);
        }
        return pageOk(esqService.wildcardQuery(indexName, queryObjectList, page, pageSize));
    }

service

public Page wildcardQuery(String indexName, List<QueryObject> queryObjectList,Integer page,Integer pageSize) throws SelectException, IOException {
   
        SearchRequest searchRequest = new SearchRequest(indexName);
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        List<QueryBuilder> should = boolQueryBuilder.should();
        HighlightBuilder highlightBuilder = new HighlightBuilder().preTags(Constant.PRESPAN).postTags(Constant.POSTSPAN);
        List<HighlightBuilder.Field> fields = highlightBuilder.fields();
        for (QueryObject queryObject : queryObjectList) {
   
            WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery(queryObject.getField(), queryObject.getData() + (queryObject.getChoice() ? "*" : "?"));
            should.add(wildcardQueryBuilder);
            fields.add(new HighlightBuilder.Field(queryObject.getField()));
            sourceBuilder.highlighter(highlightBuilder);
            searchRequest.source(sourceBuilder);
        }
        sourceBuilder.query(boolQueryBuilder);
        sourceBuilder.highlighter(highlightBuilder);
        searchRequest.source(sourceBuilder);
        sourceBuilder.from(page-1); //从第几条开始(相当于ES 里大括号下的page)
        sourceBuilder.size(pageSize); //查询多少条(相当于ES 里大括号下的pageSize)
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值