使用ES支持树状结构查询实战

背景

最近在做一个权限可见的功能。每一个订单都有创建人和创建人部门,而查询订单时可以查看自己的或者自己可见部门的。

比如你可以看电商组下的订单,那么自然可以看到电商A组下的订单。

使用ES写一个demo

搭建ES及数据初始化

java 复制代码
docker run -p 9200:9200 -p 9300:9300 --name es-container -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:8.10.3

ES索引的映射

java 复制代码
{
    "order": {
        "mappings": {
            "properties": {
                "createrId": {
                    "type": "keyword"
                },
                "department": {
                    "type": "keyword"
                },
                "departmentTree": {  
                    "type": "keyword"
                },
                "id": {
                    "type": "keyword"
                },
                "name": {
                    "type": "text"
                }
            }
        }
    }
}

其中数据如下

方案1

场景:你可以看电商组(departMentId = 1)下的订单,那么自然可以看到电商A组下(departMentId = 2,3)的订单。

我通过查询你的权限可以获取大部门电商组(departMentId = 1),然后查询大部门的子部门,从而拿到了部门的全集。

代码略,不推荐,因为部门ID多。

方案2

场景:你可以看电商组(departMentId = 1)下的订单,那么自然可以看到电商A组下(departMentId = 2,3)的订单。

但是我在订单上存储的是这个人的部门链,如下图departmentTree

实操

java 复制代码
<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.17.3</version>
        </dependency>
java 复制代码
import org.apache.http.HttpHost;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;

import java.io.IOException;

/**
 * @author chaird
 * @create 2020-08-27 21:42
 */
public class Start {

    public static void main(String[] args) throws Exception {


        // 创建 REST 高级客户端
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("101.200.123.220", 9200, "http")));

        try {
            // 创建搜索请求
            SearchRequest searchRequest = new SearchRequest("order");
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

            //id = 1
            //boolQueryBuilder.filter(QueryBuilders.termQuery("id", 1));
            //department = 1
            //boolQueryBuilder.filter(QueryBuilders.termQuery("department", 1));
            // id in (1,2)
            //boolQueryBuilder.filter(QueryBuilders.termsQuery("id", Arrays.asList(1,2)));
            // db departmentTree =[1,2,3]  命中一个就行,部门查询
            boolQueryBuilder.filter(QueryBuilders.termQuery("departmentTree", 1));
            // where id = 1 or department = 3
//            BoolQueryBuilder orFilter = QueryBuilders.boolQuery();
//            orFilter.should(QueryBuilders.termQuery("id", 1));
//            orFilter.should(QueryBuilders.termQuery("department", 3));
//            boolQueryBuilder.filter(orFilter);


            searchSourceBuilder.query(boolQueryBuilder);

            //System.out.println(searchSourceBuilder.toString());
            searchRequest.source(searchSourceBuilder);
            // 执行搜索请求
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

            // 处理搜索结果
            for (SearchHit hit : searchResponse.getHits().getHits()) {
                System.out.println(hit.getSourceAsString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭客户端
                client.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
相关推荐
IT毕设梦工厂19 小时前
大数据毕业设计选题推荐-基于大数据的人口普查收入数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
大数据·hadoop·数据分析·spark·毕业设计·源码·bigdata
计算机源码社19 小时前
基于Hadoop的车辆二氧化碳排放量分析与可视化系统|基于Spark的车辆排放量实时监控与预测系统|基于数据挖掘的汽车排放源识别与减排策略系统
大数据·hadoop·机器学习·数据挖掘·spark·毕业设计·课程设计
代码匠心1 天前
从零开始学Flink:数据输出的终极指南
java·大数据·后端·flink
深思慎考1 天前
【新版】Elasticsearch 8.15.2 完整安装流程(Linux国内镜像提速版)
java·linux·c++·elasticsearch·jenkins·框架
RunningShare1 天前
SpringBoot + MongoDB全栈实战:从架构原理到AI集成
大数据·spring boot·mongodb·架构·ai编程
文火冰糖的硅基工坊1 天前
[人工智能-综述-18]:AI重构千行百业的技术架构
大数据·人工智能·重构·架构·系统架构·制造·产业链
By北阳1 天前
Less resolver error:‘~antd/es/style/themes/index.less‘ wasn‘t found.
前端·elasticsearch·less
老赵聊算法、大模型备案1 天前
2025年6-8月中国大模型备案分析报告
大数据·人工智能·安全·语言模型·aigc
民乐团扒谱机1 天前
PCA 主成分分析:数据世界的 “旅行清单整理师”—— 从 30 维杂乱到 2 维清晰的诗意降维
大数据·数学建模·matlab·pca·主成分分析·数据处理·降维
霍夫曼vx_helloworld73521 天前
yolov8模型在指针式表盘读数中的应用【代码+数据集+python环境+GUI系统】
大数据·python·yolo