權限、列表、排序、搜索

在業務系統中常常要求實現:支持按數據權限控制,模糊查詢,指定的列排序。目前在工做中遇到了這樣的問題,使用了以下的解決方案,僅供參考。redis

 

權限控制,該項目的數據權限主要依靠部門組織進行控制,固然還有一些例外。實現的主要方法:數據庫

將權限分解爲小段,使用redis進行交、並、差的集合操做。使用redis緩存提升性能,在redis內實現分頁。緩存

 實際上是模擬了數據庫查詢的方式,將數據庫須要作的任務交給了redis,理由是若是使用數據庫進行處理,則會拼接很是複雜的SQL查詢語句。數據庫索引的效果大打折扣。另外由於交、並、差操做由代碼控制,能夠有更大的優化空間。缺點是要維護緩存和數據庫的一致性,以及交、並、差的操做須要應用控制,對開發有必定的要求。app

模糊查詢須要支持大部分字段(相似文件類型字段除外)。咱們選擇使用ElasticSearch進行全文索引,這裏有一個點是,搜索要支持的和原文檔不必定一致,也就是跨文檔查詢的問題,導至文檔和數據庫並不徹底一致。性能

按指定的列排序,目前沒有實現,主要是研究了技術方案,主要有兩個技術方案。優化

●使用redis 排序。code

    使用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排序,對性能的影響較小,且能夠多列排序。

相關文章
相關標籤/搜索