35.app后端搜索入门

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

 

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

 

        

1.    一个简单的搜索样例

 

有三行数据:web

 

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

(2)满仓中国梦。数据库

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

 

好比,有个需求,从上面的3行数据中。把包括“股民”这个关键词的数据找出来。后端

 

依照通常的作法。就是分别查找上面的每一行数据:api

 

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

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

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

 

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

 

2.    搜索技术的基本原理

 

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

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

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

 

                                                                           图1

 

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

 

它是怎么作到在海量的信息中,高速搜索中包括keyword的信息的呢?

 

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

 

         假设咱们知道每行数据中包括多少个keyword,而后创建一个映射表,把每个keyword出现在哪行数据中记录下来。搜索就变得很是轻松。当知道一个keyword的时候。仅仅需要查找这个映射表,找到这个关键词。依据这个关键词创建的映射关系就能查到包括这个关键词的数据。

 

         知道每行数据中包括多少个keyword的过程,就是分词。

这里有个问题,什么是keyword?

 

        keyword。事实上就是一个词语或句子,好比,当我有需要的时候,“股民”可以是搜索的keyword。但是,“股”也可以是搜索的keyword,“民”也可以是搜索的keyword。

什么是keyword。要看使用者的需求。所以,为了能准确分析出一行数据究竟包括多少个keyword,就需要一个包括了所有词语或句子的词典,用来分析数据中有什么keyword。

 

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

 

         如下举个实际的样例,看看是怎么分词和创建倒序索引。

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

 

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

(2)满仓中国梦。

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

 

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

 

                                                                                           表1 

 

         如下依据表1的结果创建一个映射表表2,把每个keyword出现在哪行数据中记录下来

  

表2

 

用上面的表2。咱们很是easy得知。“股民”这个关键词在数据1,3中出现过。假设需要知道“中国”这个关键词出现在哪,经过查找表2也很是easy得知出现在数据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的全文搜索server。

同一时候对其进行了扩展。提供了比Lucene更为丰富的查询语言,同一时候实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个无缺的功能管理界面,是一款很优秀的全文搜索引擎。它对外提供相似于Web-service的API接口。用户可以经过http请求,向搜索引擎server提交必定格式的XML文件,生成索引。也可以经过Http Get操做提出查找请求。并获得XML格式的返回结果。

 

(3) Elasticsearch

 

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

 

(4) Sphinx

 

Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL作全文搜索,它可以提供比数据库自己更专业的搜索功能。使得应用程序更easy实现专业化的全文检索。

Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等。同一时候为MySQL也设计了一个存储引擎插件。

 

(5) Coreseek

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

 

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

 

Coreseek的原理例如如下图3所看到的:

 

                                                                   图2

 

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

 

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

Search:搜索模块

 

整个project的流程例如如下:

 

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

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

3.      client向Search模块发起搜索请求

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

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

6.      把数据返回给client

 

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

 

                              图3

 

这样的状况,就是要在记录keyword的同一时候,也要记录下keyword的拼音,把拼音也建索引,就能实现用拼音搜索。

 

參考资料:

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 后台开发运维和架构实践》,该书已在京东,当当和亚马逊上销售。

《App后台开发运维和架构实践》的购买连接

京东

京东 
当当 
亚马逊 
互动出版网 
天猫

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

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

【做者】曾健生
【QQ】190678908
【app后端qq群】254659220 
【微信公众号】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi 
相关文章
相关标签/搜索