文档章节

权限、列表、排序、搜索

巡山
 巡山
发布于 2017/03/29 20:28
字数 607
阅读 40
收藏 0

在业务系统中经常要求实现:支持按数据权限控制,模糊查询,指定的列排序。目前在工作中遇到了这样的问题,使用了如下的解决方案,仅供参考。

 

权限控制,该项目的数据权限主要依靠部门组织进行控制,当然还有一些例外。实现的主要方法:

将权限分解为小段,使用redis进行交、并、差的集合操作。使用redis缓存提高性能,在redis内实现分页。

 其实是模拟了数据库查询的方式,将数据库需要做的任务交给了redis,理由是如果使用数据库进行处理,则会拼接非常复杂的SQL查询语句。数据库索引的效果大打折扣。另外因为交、并、差操作由代码控制,可以有更大的优化空间。缺点是要维护缓存和数据库的一致性,以及交、并、差的操作需要应用控制,对开发有一定的要求。

模糊查询需要支持大部分字段(类似文件类型字段除外)。我们选择使用ElasticSearch进行全文索引,这里有一个点是,搜索要支持的和原文档不一定一致,也就是跨文档查询的问题,导至文档和数据库并不完全一致。

按指定的列排序,目前没有实现,主要是研究了技术方案,主要有两个技术方案。

●使用redis 排序。

    使用hash结构保存数据,在使用对应的字段进行排序。缺点是不能支持多字段排序,且需要在查询的时候解析文档、对性能有一定的影响。

●使用ElasticSearch排序

   使用ElasticSearch排序可以多列排序,需要对Es 的mapping调整,要实现全文搜索的同时可以按值排序。在允许用户自定义字段时(数据的字段是不完全相同),对同步的实时性有影响。以及对数据的一致性有更高的要求。

mapping

{
  "title": {
    "type": "string", "boost": 9, "analyzer": "autocomplete", "search_analyzer":"standard",
    "fields": {
      "raw": {
        "type": "string",
        "index": "not_analyzed"
      }
    }
  }
}

search & sort

{
    "sort": [{
        "title.raw": {"order": "desc"}
    }],
    "query":{
        "term": { "title": "pagos" }
    }
}

个人建议使用ElasticSearch排序,对性能的影响较小,且可以多列排序。

 

 

 

 

© 著作权归作者所有

巡山
粉丝 2
博文 20
码字总数 12425
作品 0
深圳
私信 提问
YCKIT V2012 正式版发布!

YCKIT V2012 正式版更新情况 ---------------------------------------- 修复:内容分页在子目录出现路径错误 修复:列表日期星期不显示问题 修复:列表最后一页不生成问题 修复:后台列表栏...

野草
2012/07/09
1K
6
我的python学习--第十四天(一)

一、运维管理系统(基于Flask)回顾 1、权限控制 通过session实现权限控制,session是一个全局字典,当用户登录时,可以获取到用户的用户名,通过查找数据库获取用户的权限保存进session中,...

yaoliang833
2016/11/02
0
0
王_dan/AisenWeiBo

Aisen微博 注意 工程依赖AisenForAndroid 说明 Aisen微博是新浪微博的第三方客户端,UI遵循Material Design。 测试APK 在项目附件中有测试APK更新 基本功能 私信功能(采用内置官方触屏版实现...

王_dan
2014/10/11
0
0
KodExplorer 4.40 发布,权限机制优化

KodExplorer 4.40 发布了。KodExplorer可道云,原名芒果云,是基于 Web 技术的私有云和在线文件管理系统,它提供了类windows经典用户界面,一整套在线文件管理、文件预览、编辑、上传下载、在...

雾渺
03/21
724
4
关于文档管理系统的进展(2)

6月的时候写过一篇文章介绍当时文档管理工具的进展,目前这个工具已经发布上线并经历了一定的功能迭代,今天就来简单说下当前版本相较6月时规划的一些变动和改进。 前端技术选择 之前的选择是...

testglory
2017/11/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
5
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
6
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
4
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
1K
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部