从零开始写项目第三篇【在线聊天和个人收藏夹】(一)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 笔记

在线聊天


在浏览网页的时候无意发现了弹幕这个玩意,于是我们简单去探究了一下弹幕其实是怎么产生的。

后来就接触到了“推送”这么一个概念,然后发现了goEasy这个服务商。

http://goeasy.io/cn/started

goEasy能够将我们的数据实时进行推送,使用起来也是很方便的。

使用了goEasy以后,我们就可以实现实时推送了。那么就剩下弹幕是怎么弄的了。后来又去找到了JS的组件:

http://yaseng.org/jquery.barrager.js/

这个组件可以帮我们很方便地生成弹幕…

<script type="text/javascript">
    /*使用goEasy的推送功能*/
    var goEasy = new GoEasy({
        appkey: 'xxxxx'
    });
    /*按回车的时候会推送*/
    $("#inputText").keydown(function () {
        if (event.keyCode == 13) {
            goEasy.publish({
                channel: 'demo_channel',
                message: $("#inputText").val()
            });
            //推送完清空输入框
            $("#inputText").val("");
        }
    });
    /*单击按钮的时候会推送*/
    $("#btn").click(function () {
        goEasy.publish({
            channel: 'demo_channel',
            message: $("#inputText").val()
        });
    });
    /*接收数据、数据形式是弹幕*/
    goEasy.subscribe({
        channel: 'demo_channel',
        onMessage: function (message) {
            var txt = message.content;
            var item = {
                img: '${request.contextPath}/imgs/favicon.ico', //图片
                info: $("#userNickname").val() +":"+ txt, //文字
                href: 'www.baidu.com', //链接
                close: true, //显示关闭按钮
                speed: 8, //延迟,单位秒,默认8
                bottom: 500, //距离底部高度,单位px,默认随机
                color: '#fff', //字体颜色颜色,默认白色
                old_ie_color: '#fff' //ie低版兼容色,不能与网页背景相同,默认黑色
            };
            $('body').barrager(item);
        }
    });
</script>

实现效果:

1.jpg

该功能主要是使用到了两个组件,现在的功能实现非常简单,后面有需要再补充进去吧。


个人收藏夹


由于经常用到的网址越来越多,经常需要找好一阵子才能找到我想要去的网站。即使浏览器有收藏夹这么一个功能…

2.jpg

还是需要去找找找找的,因此我想自己建一个以关键搜索来跳转页面的功能。因为我的桌面版就是使用Rolan这么一个软件,输入关键字,就可以帮我打开软件了,很方便。

于是想起我学过Lucene这么一个全文搜索工具的,后来又发现了Elasticsearch是Lucene的子代,功能更强大也是一种比较新的技术了。后来我就去花了几天去学习Elasticsearch,找到了不少的资料。

学习Elasticsearch的过程已经在相关的博文中写过了,这里就不一一赘述了。

值得注意一点的是:当创建Elasticsearch的Client的时候,一定要加入嗅探这么一个配置

.put("client.transport.sniff", true)

否则Elasticsearch在使用的时候会非常非常卡,简直令人怀疑人生。


自动补齐


经常上baidu、google的时候,当我们输入部分关键字的时候,那么会在下拉框中自动提示信息的。这个是怎么实现的呢???

Elasticsearch有suggest这么一个自动提示的功能,参考博文:

http://blog.csdn.net/gumpeng/article/details/50346631

http://www.tcao.net/article/86.html

http://blog.csdn.net/liyantianmin/article/details/60778273

具体的操作:

  • 在建立Mapping的时候创建自动补齐的这么一个字段,设置以下的Mapping
//自动补全属性--------
    .startObject("suggestName")
    .field("type", "completion")
    .field("analyzer", "standard")
    .field("payloads", "true")
    .endObject()
    //自动补全属性结束--------

当用户加入新的索引记录的时候,自动补齐字段就是我们的关键字段

public static String String2JSON(String... strings) throws IOException {
        String suggestName = strings[2];
        if (suggestName.length() > 0) {
        }
        XContentBuilder builder = jsonBuilder()
                .startObject()
                .field("userId", strings[0])
                .field("webSiteAddr", strings[1])
                .field("webSiteName", strings[2])
                //自动补全字段
                .field("suggestName", strings[2])
                .endObject();
        return builder.string();
    }

那么在查询的时候就非常好办了,首先查询Elasticserach所有的记录,再与提示字段来进行匹配,查询出来的数据就可以与关键字段相关了。

/**
     * 根据“命名”查询出数据(自动补全)
     *
     * @param client
     * @param indexName
     * @param condition 查询条件
     */
    public static List<String> queryIndexByConditionCompletion(TransportClient client, String indexName, String condition) {
        String field = "suggestName";
        //先查询所有结果再与提示字段的数据进行匹配
        SearchRequestBuilder req = client.prepareSearch(indexName);
        req.setQuery(QueryBuilders.matchAllQuery());
        CompletionSuggestionBuilder csfb = new CompletionSuggestionBuilder(field).field(field).text(condition).size(100);
        req.addSuggestion(csfb);
        SearchResponse suggestResponse = req.execute().actionGet();
        //遍历返回的结果、装载到集合中
        List<String> lists = new ArrayList<String>();
        List<? extends Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option>> results = suggestResponse.getSuggest().getSuggestion(field).getEntries();
        for (Suggest.Suggestion.Entry<? extends Suggest.Suggestion.Entry.Option> op : results) {
            List<? extends Suggest.Suggestion.Entry.Option> options = op.getOptions();
            for (Suggest.Suggestion.Entry.Option pp : options) {
                lists.add(pp.getText().toString());
            }
        }
        return lists;
    }

对于下拉框提示的是通过JS+CSS来进行展示出来的,我是参考了一篇博文,对其进行修改的:

那篇博文现在找不着了…我就贴出我的代码吧:

<!--下拉框提示、请求后台-->
    <script type="text/javascript">
        $(function () {
            //实现搜索输入框的输入提示js类
            function oSearchSuggest(searchFuc) {
                var input = $('#condition');
                var suggestWrap = $('#gov_search_suggest');
                var key = "";
                var init = function () {
                    input.bind('keyup', sendKeyWord);
                    input.bind('blur', function () {
                        setTimeout(hideSuggest, 100);
                    })
                }
                var hideSuggest = function () {
                    suggestWrap.hide();
                }
                //发送请求,根据关键字到后台查询
                var sendKeyWord = function (event) {
                    //键盘选择下拉项
                    if (suggestWrap.css('display') == 'block' && event.keyCode == 38 || event.keyCode == 40) {
                        var current = suggestWrap.find('li.hover');
                        if (event.keyCode == 38) {
                            if (current.length > 0) {
                                var prevLi = current.removeClass('hover').prev();
                                if (prevLi.length > 0) {
                                    prevLi.addClass('hover');
                                    input.val(prevLi.html());
                                }
                            } else {
                                var last = suggestWrap.find('li:last');
                                last.addClass('hover');
                                input.val(last.html());
                            }
                        } else if (event.keyCode == 40) {
                            if (current.length > 0) {
                                var nextLi = current.removeClass('hover').next();
                                if (nextLi.length > 0) {
                                    nextLi.addClass('hover');
                                    input.val(nextLi.html());
                                }
                            } else {
                                var first = suggestWrap.find('li:first');
                                first.addClass('hover');
                                input.val(first.html());
                            }
                        }
                        //输入字符
                    } else {
                        var valText = $.trim(input.val());
                        if (valText == '' || valText == key) {
                            return;
                        }
                        searchFuc(valText);
                        key = valText;
                    }
                }
                //请求返回后,执行数据展示
                this.dataDisplay = function (data) {
                    if (data.length <= 0) {
                        suggestWrap.hide();
                        return;
                    }
                    //往搜索框下拉建议显示栏中添加条目并显示
                    var li;
                    var tmpFrag = document.createDocumentFragment();
                    suggestWrap.find('ul').html('');
                    for (var i = 0; i < data.length; i++) {
                        li = document.createElement('LI');
                        li.innerHTML = data[i];
                        tmpFrag.appendChild(li);
                    }
                    suggestWrap.find('ul').append(tmpFrag);
                    suggestWrap.show();
                    //为下拉选项绑定鼠标事件
                    suggestWrap.find('li').hover(function () {
                        suggestWrap.find('li').removeClass('hover');
                        $(this).addClass('hover');
                    }, function () {
                        $(this).removeClass('hover');
                    }).bind('click', function () {
                        input.val(this.innerHTML);
                        suggestWrap.hide();
                    });
                }
                init();
            }
            //实例化输入提示的JS,参数为进行查询操作时要调用的函数名
            var searchSuggest = new oSearchSuggest(sendKeyWordToBack);
            //这是一个模似函数,实现向后台发送ajax查询请求,并返回一个查询结果数据,传递给前台的JS,再由前台JS来展示数据。本函数由程序员进行修改实现查询的请求
            //参数为一个字符串,是搜索输入框中当前的内容
            <!--搜索数据-->
            function sendKeyWordToBack(keyword) {
                var obj = {
                    "condition": $("#condition").val()
                };
                $.ajax({
                    type: "POST",
                    url: path + "/favorites/querySiteCompletion.do",
                    data: obj,
                    dataType: "json",
                    success: function (data) {
                        console.log(data);
                        var aData = [];
                        for (var i = 0; i < data.length; i++) {
                            //以下为根据输入返回搜索结果的模拟效果代码,实际数据由后台返回
                            if (data[i] != "") {
                                aData.push(data[i]);
                            }
                        }
                        //将返回的数据传递给实现搜索输入框的输入提示js类
                        searchSuggest.dataDisplay(aData);
                    }
                });
            }
        });
    </script>
相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
4月前
微信小游戏制作工具中的分享功能怎么用?
微信小游戏制作工具中的分享功能怎么用?
29 0
|
8月前
|
小程序 数据库
云开发(微信-小程序)笔记(十五)---- 收藏,点赞(下)
云开发(微信-小程序)笔记(十五)---- 收藏,点赞(下)
82 0
|
8月前
|
JavaScript 小程序 数据库
云开发(微信-小程序)笔记(十二)---- 搜索
云开发(微信-小程序)笔记(十二)---- 搜索
58 0
|
9月前
|
移动开发 算法 HTML5
提升网页阅读体验的三款优秀大纲插件(2023)
阅读长篇文章或复杂网页时,清晰的大纲结构可以帮助我们更好地理解和组织信息。在这篇博客中,我将向大家推荐三款优秀的网页大纲插件,帮助您提升阅读效率和体验。
提升网页阅读体验的三款优秀大纲插件(2023)
|
11月前
|
移动开发 JavaScript 前端开发
三分钟学会 H5 聊天机器人开发(附源码和在线演示)
【学习目标】 熟悉和掌握 HTML结构和CSS的相关知识 学会使用HBuilder进行APP打包 熟悉JavaScript的基本用法和jQuery的使用(提前预习)
250 0
|
小程序
视频号主页,实现一键添加个人微信功能,留客更方便,真香
在视频号主页放置添加微信的按钮,其实微信已经支持了,只不过只支持企业微信,不支持个人微信,那怎么办,只能自己实现了。
356 0
视频号主页,实现一键添加个人微信功能,留客更方便,真香
|
小程序 API Android开发
小程序开发-第三章第四节点击查看大图,保存壁纸-全栈工程师之路-中级篇
小程序开发-第三章第四节点击查看大图,保存壁纸-全栈工程师之路-中级篇
127 0
小程序开发-第三章第四节点击查看大图,保存壁纸-全栈工程师之路-中级篇
|
存储 数据库
Axure实战24:创建一个掘金Lottery幸运抽奖工具
Axure实战24:创建一个掘金Lottery幸运抽奖工具
241 0
Axure实战24:创建一个掘金Lottery幸运抽奖工具

热门文章

最新文章