35.app后端搜索入门

现在人们的网络生活已经离不开搜索了,遇到不懂的问题,想知道的事情,搜索一下,就知道答案。

在app中,最常见的搜索情景就是搜索用户。只有几百,几千的用户量时,可以直接用用like这样的模糊查询,但是,如果数据有几百万,甚至上千万的时候,一次like查询数据库就堵了。到了一定量级的时候,不得不考虑使用专门的搜索技术。

1.    一个简单的搜索例子

有三行数据:

(1)近2周8成股民亏损超10%。

(2)满仓中国梦。

(3)股民两天亏一套三居。

例如,有个需求,从上面的3行数据中,把包含“股民”这个关键词的数据找出来。

按照一般的做法,就是分别查找上面的每一行数据:

第一行数据从头到尾查找一次,发现有“股民”这个关键词。

第二行数据从头到尾查找一次,没有有“股民”这个关键词。

第三行数据从头到尾查找一次,发现有“股民”这个关键词。

根据查找结果,第一,第三行数据包含“股民”这个关键词。

2.    搜索技术的基本原理

按照上面的过程,每次查找,都需要把每行数据从头到尾查一次。

如果需要从上百万,千万的数据中查找一个关键词,读者可以想象一下效率有多低。

我们看一下搜索引擎的例子,在搜索引擎搜索“股民”这个关键词的结果:

图1

在搜索引擎的搜索结果中,是直接显示了所有包含“股民”这个关键字的数据。

它是怎么做到在海量的信息中,快速搜索中包含关键字的信息的呢?

实现搜索的关键,就是分词和倒序索引。

如果我们知道每行数据中包含多少个关键字,然后建立一个映射表,把每个关键字出现在哪行数据中记录下来,搜索就变得很轻松。当知道一个关键字的时候,只需要查找这个映射表,找到这个关键词,根据这个关键词建立的映射关系就能查到包含这个关键词的数据。

知道每行数据中包含多少个关键字的过程,就是分词。这里有个问题,什么是关键字?

关键字,其实就是一个词语或句子,例如,当我有需要的时候,“股民”可以是搜索的关键字,但是,“股”也可以是搜索的关键字,“民”也可以是搜索的关键字。什么是关键字,要看使用者的需求。因此,为了能准确分析出一行数据到底包含多少个关键字,就需要一个包含了所有词语或句子的词典,用来分析数据中有什么关键字。

建立一个映射表,把每个关键字出现在哪行数据中记录下来,这个过程就是建倒序搜引。

下面举个实际的例子,看看是怎么分词和建立倒序索引。

还是用回上面举例的三行数据,左边的是数据的编号,右边的是数据的内容。

(1)近2周8成股民亏损超10%。

(2)满仓中国梦。

(3)股民两天亏一套三居。

首先,把分析上面每行数据包含多少个关键词(这里为了简化分词过程,没有把每个汉字或数字当成一个关键词,例如,” 民”应该是个关键词,但为了简化分词,没有当成一个关键词),结果如表1所示。

表1

下面根据表1的结果建立一个映射表表2,把每个关键字出现在哪行数据中记录下来

表2

用上面的表2,我们很容易得知,“股民”这个关键词在数据1,3中出现过。如果需要知道“中国”这个关键词出现在哪,通过查找表2也很容易得知出现在数据2中。

在这么几行数据中,还不能体验到倒序索引的高效。如果数据量到了上百万,千万,甚至上亿,倒序索引的效率就非常明显了。归根到底,这种数据结构就是为了实现快速搜索也建立的。

再进一步,表2的右侧,除了记录关键词出现在哪行数据中,还能记录在某行数据中出现的频率,出现的位置等信息,如果有兴趣继续深入了解搜索引擎的技术,可阅读《这就是搜索引擎:核心技术详解》(张俊林著),这篇文章只是简单介绍搜索引擎的基本原理。

3.    常见的开源搜索软件介绍

搜索技术一点都不简单,如果要我们从头开始做,不知道要到哪年哪月才能用给app用上搜索功能。幸好,大牛们已经为我们开源大量的搜索软件,只要我们会使用这些搜索软件提供的api,就能给app后台整合搜索技术。下面简单介绍一下常见的搜索软件。

(1) Lucene

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。

Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene是一套用于全文检索和搜寻的开源程式库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程式接口,能够做全文索引和搜寻。在Java开发环境里Lucene是一个成熟的免费开源工具。就其本身而言,Lucene是当前以及最近几年最受欢迎的免费Java信息检索程序库。

(2) Solr

Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

(3) Elasticsearch

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。

(4) Sphinx

Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。

(5) Coreseek

Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和信息处理领域,适用于行业/垂直搜索、论坛/站内搜索、数据库搜索、文档/文献检索、信息检索、数据挖掘等应用场景,用户可以免费下载使用。

Coreseek曾经在本人架构过两个app后台深度使用过,配置简单,性能高效,整合了Sphinx和中文分词,快速完成了搜索模块的开发。但最大的缺点是稳定版不支持实时索引,测试版是支持了,但没在生产环境中用过。

Coreseek的原理如下图3所示:

图2

Coreseek有两个核心模块 Indexer和Search。

Indexer: 负责从mysql中拉取数据源,把数据源分词,建立索引

Search:搜索模块

整个工程的流程如下:

1.      Indexer模块从mysql中拉取数据

2.      Indexer模块把数据经过中文分词,建立索引

3.      客户端向Search模块发起搜索请求

4.      Seach模块查找索引中的数据

5.      Seach模块得到索引中符合要求的数据的id等数据

6.      把数据返回给客户端

另外,有个小小的经验分享,搜索的时候,有的用户直接通过输入拼音来代替汉字的,如下图2:

图3

这种情况,就是要在记录关键字的同时,也要记录下关键字的拼音,把拼音也建索引,就能实现用拼音搜索。

参考资料:

1.      http://baike.baidu.com/link?url=rNBW3tzH-oJYeBoPSUvWZPGz-stIkE5zFQsjAtV234HFFPJKyeyr3dJjJrbZKRSCBg2NGZv-lA7DFqHF5XBEoq

2.      http://baike.baidu.com/link?url=C92bKEtkJtap8FfRjpSX4m5-yGE1Dn6O-00FRV5RwLe-EOkJ6FIvfl7amUuYceb-5jOD3Zn0Oy1_1vh7LG0RXK

3.      http://baike.baidu.com/link?url=xH1aipHlRiiq3JduGb8J8aT7qpYxs1rVDuvUQe76z0WLDZvuPFuI8Y7pbthYyiUZyyAB5wUxFzJqs5oAnRh5phPO7XYvdFSvuV5JlNVuD33

4.      http://www.coreseek.cn/

-------------------------------------------------------------------------------------------------

打开链接  app后端系列文章总目录 总目录 ,能查看本人发表过的所有原创“app后端”文章。

【作者】曾健生

【QQ】190678908

【app后端qq群】254659220

【微信公众号】 appbackend

【新浪微博】 @newjueqi

【博客】http://blog.csdn.net/newjueqi

如果您觉得文章对你有所帮助,欢迎打赏。

微信打赏:

支付宝打赏:

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-27 18:49:34

35.app后端搜索入门的相关文章

app后端搜索入门

现在人们的网络生活已经离不开搜索了,遇到不懂的问题,想知道的事情,搜索一下,就知道答案. 在app中,最常见的搜索情景就是搜索用户.只有几百,几千的用户量时,可以直接用用like这样的模糊查询,但是,如果数据有几百万,甚至上千万的时候,一次like查询数据库就堵了.到了一定量级的时候,不得不考虑使用专门的搜索技术. 1.    一个简单的搜索例子 有三行数据: (1)近2周8成股民亏损超10%. (2)满仓中国梦. (3)股民两天亏一套三居. 例如,有个需求,从上面的3行数据中,把包含“股民”这

app后端设计--总目录 (转)

特此说明,我转载的!!! app后端设计(1)--api app后端设计(2)--xmpp的使用 app后端设计(3)--短信,邮件,推送服务 app后端设计(4)-- 通讯的安全性 app后端设计(5)-- 表情的处理 app后端设计(6)-- LBS app后端设计(7)-- 项目管理 app后端设计(8)-- 数据库分表 app后端设计(9)-- 动态通知 app后端设计(10)--数据增量更新 app后端设计(11)-- 系统架构 app后端设计(12)--图片的处理 app后端设计(1

1.用互联网的产品思维打造一本app后端的书

刚刚接触app后端,是做完adidas中国的官方商城的时候,那时不清楚app后端应该怎么架构,只能摸着石头过河,网络上只有一些零散的资料,遇到问题,只能不断地搜索,思考,务必找到解决问题的方法. 在从事app后端的3年里,亲手打造了两款社交app,现在也在日pv过亿的云端平台里从事研发工作,慢慢地对app后端的架构有了一些体会. 把自己的工作笔记发表在CSDN博客专栏"app后端技术架构"发表后,收到了很多网友的反馈,后来为了方便交流,就创建了"app后端技术"qq

18.app后端如何实现LBS

移动互联网,除了一直在线这个特点外,还有一个重要特点,能定位到手机的位置.查找附近的人,附近的餐馆等服务,以及大量的o2o应用, 都需要使用LBS(Location Based Services).那么,如何用户的地理坐标?如何去查找所需的附近的数据呢?在这篇文章中,为你一一道来. 1.如何获取用户的地理坐标 现在,基于手机来获取用户的地理坐标,主要是下面两种方法: (1)使用手机上的GPS模块 (2)使用手机网络所连接的基站定位 一般是使用第一种方法,当手机上没有GPS模块,就用第二种方法来定

搜索入门之dfs--经典的迷宫问题解析

今天来谈一下dfs的入门,以前看到的dfs入门,那真的是入门吗,都是把dfs的实现步骤往那一贴,看完是知道dfs的步骤了,但是对于代码实现还是没有概念.今天准备写点自己的心得,真的是字面意思--入门. DFS,即深度优先搜索,是一种每次搜索都向尽可能深的地方去搜索,到达尽头时再回溯进行其他结点去搜索的搜索策略.形象的说,这是一种“不撞南墙不回头”的策略. 其实也就是遍历,只不过不像一个线性数组的遍历那么直观罢了.说到回溯,每次看到这个词我都得思考一会,到底是怎么用栈进行回溯的呢?今天实际操作了一

23.app后端如何架设文件系统

现在app展现内容的形式多种多样的,有文字,图片,声音,视频等等,其中文件占了一个很大的比重.随着app不断运营,文件会越来越多,占用的磁盘空间也不断增大,架设一套高效的文件系统,对于整个app架构有着巨大的影响. 1.    如果可能,使用成熟的文件云存储服务 对于创业公司来说,我一直推崇的架构原则是"尽量使用成熟的第三方服务和软件,自己只负责业务逻辑". 架设文件系统,需要牵涉到文件的分布式存储,图片水印,图片缩放,还有CDN等方面,每方面都能耗费掉巨大的开发成本和运维成本. 对于

新闻APP后端系统架构成长之路

前言:一年来从接受APP后端工作到现在可谓一路艰辛,中间踏过无数坑坑洼洼,也从中学到很多很多,之前领导也多次提醒,平时多总结.把经验形成系统,但平时大部分时间一直在忙于开发.处理问题,天天马不停蹄的往前走.眼看着春节将至,16年又过去了,业务有了很大发展,我们系统也愈加完善.之前一直也没有时间静下心来后头看看,眼下随着6.0版本开发上线完毕,稍得片刻喘息,自己也想想,也是时候回头看看.总结一下了. 1,初入圣地 2,筑基:完全重构 3,金丹:踩坑..而且是踩大坑 4,元婴:面临挑战,流量来袭 5

app后端设计(13)--IM4JAVA+GraphicsMagick实现中文水印

在app的后台中,有时候为了标示版权,需要给图片加上水印. 在liunx中,IM4JAVA+GraphicsMagick是个高效处理图片的方案,图片的裁剪是使用了这个技术方案,为了减少不必要的开发成本和运维成本,对应水印,我们是打算继续采用这个方案. 但在开发的过程中,发现这个方案对中文水印支持得不好. 根据网上的搜索结果,就算采用了im4java的GMOperation,并将水印的字符串转成GBK的编码,添加中文水印时,对于奇数个数的中文,没问题:但对于偶数个数的中文,就出现乱码了. 试了多次

14.app后端如何设计api

app和后端的交互,一般都是通过后端提供的api实现.api的设计,估计很多刚进入app后端的小伙伴会一无头绪,不知道怎么入门.下面根据自己3年的app后端经验,总结出下几个api设计原则,给小伙伴参考. 1. 什么是api? 这个问题在以前发表的文章"7.app和app后端的通讯"中其实已经回答了,这里再重复一次. 相信大家都用过银行的柜员机(ATM)的查询余额,转帐,取款等操作. 当在柜员机取款的时候,我们输入要取款的金额,隔一会钱就出来了,如果因为有什么问题不能取款(例如超过取款