在业务系统中经常要求实现:支持按数据权限控制,模糊查询,指定的列排序。目前在工作中遇到了这样的问题,使用了如下的解决方案,仅供参考。
权限控制,该项目的数据权限主要依靠部门组织进行控制,当然还有一些例外。实现的主要方法:
将权限分解为小段,使用redis进行交、并、差的集合操作。使用redis缓存提高性能,在redis内实现分页。
其实是模拟了数据库查询的方式,将数据库需要做的任务交给了redis,理由是如果使用数据库进行处理,则会拼接非常复杂的SQL查询语句。数据库索引的效果大打折扣。另外因为交、并、差操作由代码控制,可以有更大的优化空间。缺点是要维护缓存和数据库的一致性,以及交、并、差的操作需要应用控制,对开发有一定的要求。
模糊查询需要支持大部分字段(类似文件类型字段除外)。我们选择使用ElasticSearch进行全文索引,这里有一个点是,搜索要支持的和原文档不一定一致,也就是跨文档查询的问题,导至文档和数据库并不完全一致。
按指定的列排序,目前没有实现,主要是研究了技术方案,主要有两个技术方案。
●使用redis 排序。
使用hash结构保存数据,在使用对应的字段进行排序。缺点是不能支持多字段排序,且需要在查询的时候解析文档、对性能有一定的影响。
●使用排序
使用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排序,对性能的影响较小,且可以多列排序。