您的位置:首页 > 数据库 > Redis

权限、列表、排序、搜索

2017-03-29 00:00 204 查看
摘要: 在一定的数据权限下,显示列表,如何支持字段排序

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

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

将权限分解为小段,使用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排序,对性能的影响较小,且可以多列排序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息