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:[email protected]

时间: 2024-07-30 03:26:49

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(四) 之 用户搜索(Elasticsearch),加好友流程(1)。的相关文章

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)

大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言  ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM界面中的数据动态化.当然还不涉及即时消息通讯,如果你已经搞定了数据界面,那么本文您可以简单的看一下,或者略过. 进入正题,layim帮我们定义好了数据规则,我们只要写一个接口实现那个json规范就可以了,剩下的事情就交给layim去做,看一下json格式.(对应文件夹:demo/json/getLi

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十四)之漏掉的客服消息

前言 不知不觉已经十四篇了,其实已经没有什么可写了.但是突然发现layim中带的客服功能没有用到.于是乎,抽点时间完成吧.其实之前的工作已经把客服功能完成了一大半,剩下的我们稍微调整即可.今天的演示我们放在后边,直接进入讲解. 客服思路讲解 大家去一些公司网站都会发现,网页侧面或者自动弹出一些客服聊天框,人家很热情的和你交谈.我们也可以用layim来实现.首先,页面添加一个按钮,点击按钮触发客服模式. <a onclick="javascript:global.other.kefu(148

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(七) 之 历史记录查询(时间,关键字,图片,文件),关键字高亮显示。

前言 上一篇讲解了如何自定义右键菜单,都是前端的内容,本篇内容就一个:查询.聊天历史纪录查询,在之前介绍查找好友的那篇博客里已经提到过 Elasticsearch,今天它又要上场了.对于Elasticsearch不感冒的同学呢,本篇可以不用看啦. from baidu: ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列(不断更新中)

项目简介 利用ASP.NET SignalR技术与Layim前端im框架实现的一个简单的web聊天室,包括单聊,群聊,加好友,加群,好友搜索,管理,群组管理,好友权限设置等功能.涉及技术: ElasticSearch 搜索,支持各种条件搜索,效率高,速度快,稳准狠. Redis缓存,统计在线好友,登录token等 RabbitMQ消息队列,发送消息通过队列降低数据库访问压力,或者延迟执行任务. ASP.NET MVC,UI架构. 以及普通的三层架构等.CRUD 当然其中的这些技术也是纯粹为了使用

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十一) 代码重构使用反射工厂解耦

前言 自从此博客发表以及代码开源以来,得到了许多人的关注.也没许多吧,反正在我意料之外的.包括几位大牛帮我做订阅号推广,真的很感谢他们.另外,还有几个高手给我提了一些架构上的问题.其实本身这个项目是没有做什么架构设计的.只是简单分了分层.不过我在经过仔细思考之后决定对项目架构做些调整,当然在我的技术范围之内,我相信还会有第二次,第三次甚至更多重构,我希望把他变得更加完美. 重构思路 对于重构思路,我首先想到的是,让程序能够支持多种数据库,比如我现在用的是SQLServer,而好多朋友用MySQL

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言

前端时间听一个技术朋友说 LayIM 2.0 发布了,听到这个消息抓紧去官网看了一下.(http://layim.layui.com/)哎呀呀,还要购买授权[大家支持一下哦],果断买了企业版,喜欢钻研的我没有源码怎么行,说来也惭愧,发布好久了我才知道.之前写过一系列的博客,当时是ASP.NET SignalR 结合 LayIM 1.0 的一个小程序.看了一下最新版本的LayIM,太赞了.我电脑里的VS已经蠢蠢欲动了.话不多说,先预览一下效果. 主聊天界面: 好友列表界面:        以及自定

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列。开源啦!!!

自此系列博客开写以来,好多同学关心开源问题,之前由于网络问题,发布到Github上老是失败,今天终于在精简了好多无用的文件之后发布上去了. 注意:layim源代码并不开源,由于版权问题,请大家去官网了解详情,本人并非layui作者,原作者贤心.开源内容为 后台部分. 详情移步:ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列(不断更新中) GitHub:https://github.com/fanpan26/LayIM_NetClient/ QQ交流群:1

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(五) 之 加好友,加群流程,消息管理和即时消息提示的实现

前言 前前一篇留了个小问题,在上一篇中忘了写了,就是关于LayIM已经封装好的上传文件或者图片的问题.对接好接口之后,如果上传速度慢,界面就会出现假死情况,虽然文件正在上传.于是我就简单做了个图标替代来增强用户体验. 上传中... 上传完成后 是不是很简单啊,接下来进入正题. 业务介绍 LayIM中的加好友可以说是不太必要的逻辑,而且其实大部分在模仿QQ,当然业务复杂度肯定没法和QQ比.主线,就是用户A请求添加用户B为好友,用户B收到消息提示之后点击同意或者拒绝或者直接忽略,然后在将消息反馈到用

ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(三) 之 实现单聊,群聊,发送图片,文件。

上篇讲解了如何搭建聊天服务器,以及客户端js怎么和layui的语法配合.服务器已经连接上了,那么聊天还会远吗? 进入正题,正如上一篇提到的我们用 Client.Group(groupId)的方法向客户端推送消息.本篇就先不把业务搞复杂了,就默认现在两个用户都各自打开了对方的聊天窗口,那么聊天过程是这样的. 同理,B给A发消息也是这个流程,因为无论如何,A(ID)和B(ID)都会按照规则生成同一个组名.其中由于LayIM已经帮我们在客户端做好了发送消息并且将消息展示在面板上,所以我们要做的就是当接