网站制作要多少钱上海做推广的引流公司
背景
最近在做一个权限可见的功能。每一个订单都有创建人和创建人部门,而查询订单时可以查看自己的或者自己可见部门的。
比如你可以看电商组下的订单,那么自然可以看到电商A组下的订单。
使用ES写一个demo
搭建ES及数据初始化
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索引的映射
{"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
实操
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId><version>7.17.3</version></dependency>
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();}}}
}