ASP.NET SignalR 與 LayIM2.0 配合輕松實現Web聊天室(四) 之 用戶搜索(Elasticsearch),加好友流程(1)。


  前面幾篇基本已經實現了大部分即時通訊功能:聊天,群聊,發送文件,圖片,消息。不過這些業務都是比較粗獷的。下面我們就把業務細化,之前用的是死數據,那我們就從加好友開始吧。加好友,首先你得知道你要加誰。Layim界面右下角有個+號,點擊它之后就會彈出查找好友的界面,不過那個界面需要自定義。由於前端不是我的強項,勉強湊了個頁面。不過不要在意這些細節。這些都不重要,今天主要介紹一下ElasticSearch搜索解決方案。它是一個基於Lucene的搜索服務器。它提供了一個分布式多用戶能力的全文搜索引擎,基於RESTful web接口。不熟悉Elastic的也不要緊,本篇的搜索查找好友用關系數據庫一樣實現。(不想對ES做深入研究的可以簡單看一下思路即可)

  首先安裝好ES環境。安裝步驟可以參考 http://www.cnblogs.com/panzi/p/5659697.html

  OK,先看一下成型效果圖,第一張是用戶,第二個是群。

  

 

  

  好的,界面就是這樣。當然要綁定什么數據可以自己定義,比如綁定簽名,男女或者其他信息等,都可以,在高級一點,把是否在線信息加上。既然用了layui,那順帶着綁定插件我就直接用laytpl了。前端模板如下:(一個用戶模板,一個群模板)。

  再說數據源,既然我用到了ElasticSearch(下文用ES代替),但是數據庫(MSSQL)也保存了相應的信息。這就需要,當一個用戶注冊進來之后,我們還需要將該搜索信息保存到ES中。偽代碼如下:

  

    var dt = UserRegister();
    if(dt){
      //如果用戶注冊成功,返回了相應的信息,我們就把他在加到ES中去。 AdduserInfoToElastic(dt); }

  下圖就是ES中保存的用戶信息,這些用戶信息是和數據庫中的數據同步的,因此,修改用戶信息的時候,此表中的數據也要同步。當然有延遲也沒問題。

  

  用ES的一個好處呢就是快,他能幫你做緩存,幫你分詞查詢。我們做練習用數據庫搜索幾十條沒問題。如果數據量大了,搜索條件復雜了,ES就能體現出他的優勢了。現在我用的搜索條件很簡單,一個是IM號,類似QQ,一個就是昵稱。對接ES的客戶端是PlainElastic.Net,用nuget安裝即可。 install-package PlainElastic.Net.

  ES有自己的查詢語法,又復雜的也有簡單點的,我就用一些簡單的,畢竟我也沒太深入研究。正如前文所說,它提供了Restful api。我們查詢的路徑就是:127.0.0.1:9200/layim/layim_user/_search POST方法,POST的參數如下:

  

{
  "query": {
    "match_all": {}//沒有條件的時候就是match_all相當於查詢所有
  },
  "from": 0,//分頁開始
  "size": 50,//每頁條數
  "sort": {  //排序,根據 province 正序排序
    "province": { 
      "order": "asc"
    }
  }
}

 

  上邊的是查詢所有的情況,當用戶輸入了查詢條件時候,比如精確查詢IM號為  288186 的用戶,搜索條件如下:

{
  "query": {
    "filtered": {
      "filter": {
        "or": [  //or 查詢,下面的條件符合一個即可
          {
            "term": {
              "im": 288186    //im =288186
            }
          },
          {
            "query": {
              "match_phrase": { //短語查詢
                "nickname": {
                  "query": "288186", //或者昵稱中有288186
                  "slop": 0
                }
              }
            }
          }
        ]
      }
    }
  },
  "from": 0,
  "size": 50
}

  不熟悉語法的同學可能看不太懂,總之上邊這些參數的意思就是  select  top 50 * from layim_user where im=288186 or nickname like '%288186%' 

  查詢結果他會把查詢到的總數和耗時(ms)返回,像幾萬條數據的話大部分就是幾十毫秒甚至不到十毫秒。相對於從數據用查,速度還是可以的。

  基於PlainElastic.NET我又封裝了一層查詢的核心方法:

public BaseQueryEntity<T> QueryBayConditions(string query)
        {
            try
            {
                string cmd = CreateSearchCommand();//構造查詢命令
                OperationResult result = Client.Post(cmd, query);//Post query參數查詢
                var data = serializer.ToSearchResult<T>(result.Result); //返回結果轉換
                return GetResults(data);
            }
            catch (Exception ex)
            {
                ESLog.WriteLogException(MethodBase.GetCurrentMethod(), "查詢條件:" + query);
                ESLog.WriteLogException(MethodBase.GetCurrentMethod(), ex);
                return new BaseQueryEntity<T>();
            }
        }

 

public class BaseQueryEntity<T> where T :BaseEntity
    {
        /// <summary>
        /// 命中條數
        /// </summary>
        public long hits { get; set; }
        /// <summary>
        /// 花費時間(單位ms)
        /// </summary>
        public long took { get; set; }
        public IEnumerable<T> list { get; set; }
    }

  查詢結果json:

  總共有3883個用戶,ES查詢用了5ms,加上http請求耗時,總共耗時為45毫秒。

  寫到這里呢,就暫時對ES做個簡單的總結,其實如果做練習的話也沒必要用他來查,直接查數據庫就可以了,如果再配合緩存的話速度也不慢,而且今天講的業務邏輯也不復雜。說白了,本篇就講了個CRUD的 Retrieve。(R)還有聊天記錄順便說一下,也是用ES查的,不過到時候會增加一些小的效果。我也不賣關子了,就是模糊查詢的關鍵字高亮效果。

  下面繼續說加好友流程,首先,如果你想吧一個用戶加為好友首先,得發送加好友請求吧,類似QQ。當然,如果那個人設置了任何人都可以加好友,是不是就可以直接加上了。如果那個人設置了不允許任何人加好友,那么你也沒法加他的,所以,簡單的一個加好友也可以設計的很復雜。本篇就介紹普通的申請流程。點擊加好友之后,彈出框,填寫附加消息:(我們搜索出288186的用戶添加)

  當我們點擊發送之后要考慮什么呢?先不要看下文,仔細思考一下。5          ,4,           3             ,2,               1。。。

  

  沒錯,就是如果對方恰好在線的處理,和對方不在線的處理、如果對方在線,保存到數據庫並且即時提醒。不在線,保存到數據庫,等下次登錄提醒用戶。詳細做法下一篇再寫吧。先貼一個預告圖:

  

  本篇貼的圖比較多,講了一些業務上的東西和ES的簡單使用,場景和使用方式等。本篇就到這里吧。

 

      下篇預告【中級】ASP.NET SignalR 與 LayIM2.0 配合輕松實現Web聊天室(五) 之 加好友,加群消息提示,Hub中的User用法。

 

   想要學習的小伙伴,可以關注我的博客哦,我的QQ:645857874,Email:fanpan26@126.com

      GitHub:https://github.com/fanpan26/LayIM_NetClient/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM