用nodejs 开发的智能提示

时间:2014-07-01 03:50:18 类别:搜索引擎 访问: 2576 次

感谢:http://lutaf.com/223.htm

智能提示对于搜索非常重要,相对于机器学习,可以称为集体学习,用集体智慧来识别用户查询,用很小的成本换来较大的收益

我2007年的时候做一个智能提示事先准备好数据的智能提示,那是基于直接想法的设计,这个方案有两个问题

  1. 需要事先准备数据,更新有点麻烦
  2. 内存开销极大,一个长度为N的字符串,最后需要 N*(N+1)/2 个Byte的存储,相当于空间 开销为 ∑(N的平方)

当年用于几千条数据集的项目,还能用

当我从事搜索引擎开发之后,按照搜索引擎处理倒排表的原理,重新开发了一个智能提示,代码用nodejs开发,已经开源:https://code.csdn.net/lutaf/autocomplete,在线上工作良好

  1. 核心代码只有100行,可以用于千万数据规模
  2. 做了一个简单的demo,用node运行之后,可以直接看到效果

原理

  1. 把需要检索的原始语料,一行一条,按字母顺序排列好,相当于一个 std::vector<string>
  2. 检索的时候,用二分法在这个vector中检索,找到第一个满足 startswith(query)==true 的 元素
  3. 从这个元素的index开始,分别 向前查找,向后查找,还是用 startswith(query)==true 这个条件,这样就能把语料中所有满足这个query的数据全部找出来
  4. 然后按照自行定义的rank逻辑,取出一定的数据

倒排表的原理

倒排表从抽象角度,可以定义为 hash_map<string,vector<int> docs > 注意,这只是抽象角度

  • 我做的第一个版本智能提示,就是完全按照这个抽象结构来实现,好处很明显,检索速度最快 O(1),缺点也很明显:如果数据库有几百万条,内存完全不够用,另外运维也繁琐

  • 第二个版本的智能提示,是直接load文件,排序成数组,然后二分法检索,查询时间开销是 lg(N)+M,但是非常节省内存

工业界的搜索引擎做倒排索引表,都是用第二个版本,包括Lucence的索引,也是用这种方法。

在有序数组上做二分法查找,除了性能比较优秀之外,还有如下优点

  1. 结构简单,可以把整个有序数组序列化为硬盘文件,然后用mmap打开,这样就能突破服务器内存容量的限制(在96G内存的机器上,可以用mmap打开300G的文件),程序初始化速度极快,故障恢复能力强

  2. hash_map是只能find_by_key,无法做range检索和比较查询,所以只能用来查询字符串. 因此数据库字段建立索引一般不会用hash索引,mysql的索引就是用B+ tree ,这是二叉树的一种变型,而二叉树其实 就是把二分法查询用空间结构固化下来

二叉树付出了空间开销,得到好处是 插入删除 操作很快,适合用于数据库这类可读可写的索引,而搜索引擎都是静态离线版,在排好序的数组上做二分法最优

Trie树 字符树

前缀字符串的查找,hash_map并不是效率最高的做法,时间开销最小的方法是用 Tire-tree,查询时间开销=length(query),并且和数据集的规模完全无关

这个世界上没有银弹,这听起来如此美妙的方法,肯定要付出不菲的门票. Tire树 的空间开销极大,假设只存放asicc码,那么每个节点有 256个子节点,一个N层的完全256叉树,总节点数量=256的N-1次方,不堪重负

为了减少Tire树的空间消耗,大家又提出了多种改良方案

  1. Double-Array Trie,经典双数组结构,把字符树的空间开销完全降下来了,但是算法很难看懂,这个结构的缺点是初始化速度慢的惊人,如果数据规模大,也很难用

  2. Ternary Search Tree,三叉搜索树,顾名思义,每个节点只有3个子节点,它在字符串的检索效率和空间消耗之间做了一个平衡。以前在门户工作的时候,我用这个来做敏感词过滤,简单好用

标签: nodejstrie

本文地址: http://lutaf.com/223.htm 鲁塔弗原创文章,欢迎转载,请附带原文链接

用nodejs 开发的智能提示的更多相关文章

  1. windows下webstorm开发react-native智能提示

    webstorm破解版地址:点这里 1.随便在一个目录下下载ReactNative-LiveTemplate插件,命令为: git clone https://github.com/virtoolsw ...

  2. eclipse 开发jsp 智能提示设置

    1.打开eclipse→Windows→Preferences→Java→Editor→Content Assist 改动Auto Activation triggers for java的值为:.a ...

  3. 如何开发auto complete 智能提示功能

    目录(?)[+] 如何开发auto complete 智能提示功能 最近网上好像流传用redis实现,其实智能提示和用什么存储关系不大 07年,我过一个类似的项目 我有几千个名字,随着用户在输入框中不 ...

  4. Android开发中Eclipse里的智能提示设置

    今天开始学习一下Android开发,直接在Android Developers下载的一个开发工具包,然后再下了一个JDK,配置完环境变量等一系列的工作后环境就搭建好了,在新建好第一个Android项目 ...

  5. 用CS-Script把Notepad++变身支持智能提示和运行代码的C#集成开发环境

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用CS-Script把Notepad++变身支持智能提示和运行代码的C#集成开发环境.

  6. WebStorm开发工具设置React Native智能提示

    最近在做React Native开发的时候,相信大家一般会使用WebStorm,Sublime,Atom等等开发工具.二之前搞前端的对WebStorm会很熟悉,WebStorm最新版是WebStorm ...

  7. 使用vs code开发纸壳CMS并启用Razor智能提示

    关于纸壳CMS 纸壳CMS是一个开源免费的,可视化设计,在线编辑的内容管理系统.基于ASP .Net Core开发,插件式设计: 下载代码 GitHub:https://github.com/Seri ...

  8. webStorm中NodeJs 没有智能提示

    webStorm中NodeJs 没有智能提示 node.js and NPM --> Coding assistance for Node.js

  9. ArcGIS for JavaScript 开发智能提示

    开发如果没有智能提示,可想而知是一件多举痛苦的事情,好在Esri为Visual Studio 2010.Aptana3提供了一个插件,这样就使我们在使用ArcGIS API for Javascrip ...

随机推荐

  1. weblogic 服务器部署SSL证书

    一.证书介绍 1.需要的证书 生产需要的证数如下: 即客户提供的证数: L1Croot.crt,L1Cchain.crt,entrustcert.crt,server,jks 证书清单: L1Croo ...

  2. Java的深拷贝和浅拷贝

    关于Java的深拷贝和浅拷贝,简单来说就是创建一个和已知对象一模一样的对象.可能日常编码过程中用的不多,但是这是一个面试经常会问的问题,而且了解深拷贝和浅拷贝的原理,对于Java中的所谓值传递或者引用 ...

  3. 【最新】Power BI混合现实应用Mixed Reality app预览版正式发布

    1.介绍 2018年3月13日,Power BI在官方博客和Docs文档发布了Power BI for Mixed Reality应用预览版的消息, 也就是可以以后在更虚拟的世界中来观察你的报表,想象 ...

  4. javascript三角函数的使用

    其实很多编程语言里面都有数学函数,而且很多数学函数包括三角函数,只不过有些时候可能我们用的并不多,我最近在做一个h5的游戏,其中有一个需求就是射击的枪支需要更随鼠标变换位置,鼠标移动到什么地方,炮口就 ...

  5. 关系型数据库工作原理-时间复杂度(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>. 原文链接:http://coding-geek.com/how-dat ...

  6. 完整的站内搜索实战应用(Lucene.Net+盘古分词)

    首先自问自答几个问题,以让各位看官了解写此文的目的 什么是站内搜索?与一般搜索的区别? 多网站都有搜索功能,很多都是用SQL语句的Like实现的,但是Like无法做到模糊匹配(例如我搜索". ...

  7. java web需要好好掌握的一些东西

    这是一些需要好好的复习的东西 本来存了个文档  怕整丢了  就在这里保存一下 java 基础 重点关注集合 如list hashmap等使用(有时间多看看hashmap的实现原理  问的比较多)多线程 ...

  8. 关于win8/win8.1系统不能调节亮度的解决办法

    有时候我们重装了win8系统之后开始可以调节亮度,但是再重新安装了显卡驱动之后发现不能调节亮度了,解决办法就是添加一项注册表. 下载地址:http://7xnarc.com1.z0.glb.cloud ...

  9. Shiro【授权过滤器、与ehcache整合、验证码、记住我】

    前言 本文主要讲解的知识点有以下: Shiro授权过滤器使用 Shiro缓存 与Ehcache整合 Shiro应用->实现验证码功能 记住我功能 一.授权过滤器测试 我们的授权过滤器使用的是pe ...

  10. 使用git将本地代码传到github

    方法可能有些小小的差别,但是最终的结果都是一样的 在github上新建代码仓库 确定之后会显示一个仓库的url,复制下来 在本地找一个作为本地仓库的文件夹右键Git Bash Here打开git 把g ...