Elasticsearch学习系列-搜索技术基本知识

导语
  在正式介绍ElasticSearch之前,首先需要了解的就是关于搜索引擎原理相关的的内容。通过了解的搜索引擎相关的原理之后就可以很好的了解ElasticSearch的相关原理了。

数据搜索方式

  在大数据的时代,在一定程度上,我们要对数据进行搜索,毕竟数据量很大,在研发开发的过程中,不难发现,我们使用到的数据有两种形式,一种是结构化数据,一种是非结构化数据,对于这两种数据来讲我们也有两种不同的存储方式,一种是结构化存储,而另一种则是非结构化存储。

  一般的对开发人员来讲,在做数据存储的时候,对于数据的结构要非常的敏感。例如,一些结构化的数据我们使用结构化的存储方式例如MySQL数据库Oracle数据等,因为这种数据的结构可以使用一个二维的数据表格来表示,可以形成行数据。

  对于非结构化的数据的存储,则是使用了Redis,MongoDB等一些非结构化的数据存储方式来实现,这类数据有一个特点就是它们没有固定的格式,没有固定的长度,无法通过行来进行表示。也可以说,数据结构是动态的,事先并不知道存储的结构到底是什么样子的,那么使用结构化的数据库来去存储这种数据相对来说就是比较困难的了。

  因为结构化的数据可以通过关系型数据库来存储,而我们知道这种方式是以行为存储的,所以说可以通过索引的方式快速准确的定位的对应的数据。但是如果要完成一些模糊的搜索,关键字匹配,精确匹配这种操作的话就需要通过like来实现,我们知道在MySQL数据库中使用Like这种是一个比较耗时的操作,在数据量小的情况下可以有很好的用户体验,但是如果数据量太大的话,用户体验将会极差。

  对于非结构化的数据,主要的搜索方式就是顺序扫描和全文检索的方式,很显然,对于非结构数据,顺序扫描的方式是效率比较低的一种方式,所以就出现了全文检索技术。而全文检索技术就是搜索引擎需要实现的功能。

  全文检索,一般都是提取数据中的有效信息,然后重新组织数据,将数据进行承载。在搜索的时候,通过新的结构化数据展开,从而达到一个较高搜索速度的目标。很显然,全文检索是一种空间换时间的方式,在前期建立索引,建立数据拆分的时候是需要大量的空间和时间,但是后期的搜索效率会非常高。

搜索引擎工作原理

  如图所示
在这里插入图片描述
  搜索引擎的工作原理其实分为两个阶段,也就是网页数据爬取和索引阶段、搜索阶段。其中网页数据爬取和索引阶段包括网络爬虫、数据预处理、数据索引三个动作,搜索阶段则是包含关键字搜索、输入内容预处理、搜索关键字查询等三个主要动作。

  网络爬虫用于爬取互联网上的网页,爬取到一个新的网页之后还需要通过该页面中的连接来爬取其他网页。所以其实爬虫是一个不停歇的工作内容,一般需要自动化手段来进行实现。网络爬虫的主要工作就是尽可能快、尽可能更全面的去获取互联网上各种页面的数据。

  页面被爬取之后,会被存储到数据库中,以备下个阶段的数据处理,需要指出的是,网页库里存储的网页信息与在浏览器中的内容是相同的。除此之外,由于互联网上的网页有一定的重复数据,所以在加入到网页库之前,需要对页面进行查重。

   网页数据的预处理程序不断的从数据库中获取到网页,进行预处理操作。而比较常见的预处理操作有去除噪声内容、关键字处理、网页间连接关系计算等等。其中,去除噪声内容包括版权声明文字、导航条、广告等,网页经过与处理之后,会被浓缩成以关键字为核心的内容。

  除此之外,互联网上的内容除了常规的网页之外,还会有各类的文档,例如PDF、Word、WPS、XLS、PPT、TXT等。还有多媒体文件,例如图片、视频等等。这些内容都需要进行相应的预处理操作。

  数据预处理之后,要进行数据索引的过程。索引过程先后需要经历两个阶段,一个是正向索引,另一个是倒排索引,最终建立索引库。随着不断有新的网页加入到其中,索引库的更新和维护也是增量进行的。

  上面介绍了关于数据爬取和索引阶段主要的工作内容,接下来看一下,搜索阶段的内容。

  用户输入关键字会经过预处理,例如删除不必要的标点、停用词、空格、字符串的错误等等,随后就是进行相关的分词操作,分词之后搜索引擎系统将向索引库发出搜索请求。索引库将包含搜索关键字的相关网页从索引库中找出来,搜索引擎根据索引库返回的内容进行排序处理,最终返回给用户。

网页爬虫工作原理

  网络爬虫又叫做网络探测器、Crawler爬行器、Spider蜘蛛、Robot机器人等等,其中网络爬虫或者是蜘蛛可能会比较生动一些,意思就是网页爬虫程序可以像是虫子和蜘蛛一样可以在不同的网络之间爬来爬去,从一个网络连接到另一个网络连接。

  网络爬虫在工作的时候,通过种子爬取网页的连接地址来寻找目标网页,随后从网站的一个页面,例如首页,开始读取网页的内容和网页中其他网页的连接地址,然后通过这些连接地址继续寻找下一个网页,如此循环,直到完成。

  在网络爬虫爬取过程中,为了提高爬取效率,一般采用的方式就是并行爬取,多个网络爬虫在并行爬取的过程中,不重复爬取同一个网页尤其重要,这个将会大大提升爬取效率。

  常规做法如图所示。

在这里插入图片描述
  网络爬虫在爬取网页的时候,搜索引擎会建立两张不同的表,一张表记录已经访问过的地址,另一张表记录没有访问过的网址,当网络爬虫取某个外部连接页面URL时,需要把该网站的URL下载回来分析,当网络爬虫处理好这个URL之后,这个URL就会被放入到已访问的表中。当另外一个爬虫发现这个URL的时候就会自动绕过了。

  如果把页面爬取看做一个有向图的话,爬取操作就是一个有向图的遍历操作,首先需要按照深度优先搜索的方式进行遍历,当然也可以通过广度优先搜索的方式进行遍历。一般采用的是深度有限遍历。

  此外,在网页爬取的过程中,需要注意网页的收录模式,一般有两种,一个是增量收录,一个是全量收录,也就是说爬取到的网页数据是更新所有的数据,还是只更新不同的,如果是全量更新的话系统消耗较大,成本高,而且全量更新的操作耗时较大。

  增量收集,可以避免出现全量收集的那些问题,相比较全量收集增量收集在系统设计方面相对比较复杂一点。

  对于网站而言,被各家主流的搜索引擎收录是一件很荣幸的事情。所以网站往往采取一些技术手段告知搜索引擎来抓取内容,一般网站可以通过SiteMap告知搜索引擎网站中可提供抓取的网址。SiteMap的核心作用就是想网络抓取工具提供一些提示信息,方便可以有效的抓取页面。

  SiteMap的最简单的实现形式就是XML文件。例如百度SiteMap文件分为三种格式:txt文本文件、XML格式和SiteMap索引格式。

   对网站的维护人员而言,除了SiteMap,还可以结合SEO(Search Engine Optimization,搜索引擎优化)来改善网站被抓取的效果。

网页分析

  网络爬虫将网页数据爬取之后,会将网页内容存储到网页库中,随后网页分析程序将自动对网页进行分析。主要的分析内容有网页内容摘要、连接分析、网页重要程度计算、关键词提取/分词、去除噪声等操作。经过网页分析之后,网页数据将变成网页中关键词组、链接与关键词的相关度、网页重要程度等信息。

  网页内容中的去除噪声主要是除去广告、无关的导航条、版权信息、问卷调查和文章主体内容无关的内容。这些内容如果纳入网页分析中,往往会让网页的主题发生偏移;同时更多的无关的内容的索引会导致整个的索引规模较大,拖累搜索的准确性,降低了搜索速度。在实践中,去除噪声可以基于Doc View模型实现。

  网页内容摘要一般由网页正文生成,一般会显示在搜索区域。

  一般的,摘要的生方式有两种,一种是静态的,一种动态的。其中静态的生成方式比较简单,在网页分析阶段就可以从网页内容中进行提取,这种方式“短、平、快”,但是当呈现搜索结果的时候,展示的摘要可能是与搜索内容无关的内容。

  现在的搜索引擎采用的是动态生成的方式进行生成,也就是通过关键字在文档中的位置,提取到周边的其他文字,然后关键字高亮。

  网页重要程度计算用于衡量网站的权威性,一般来讲,越权威的网站,越容易被其他网站主动连接;换而言之,就是网站被引用的次数越多,说明该网站越重要。对搜索引擎而言,在返回相关性很强的内容的时候,尽可能先去返回权威网站的内容,而对搜索引擎来讲,往往也能通过这种方式匹配到自己需要的内容。这也是评判一个搜索引擎体验好坏的核心指标之一

  网站之间连接的关系,可以从算法的多个维度来进行解析判断,网站主动被连接的次数越多,说明在互联网环境下这个网站越被信任。如图所示。
在这里插入图片描述

  如果将网页间的连接关系看做一个有向图,那么网站连接的关系就会变为出度和入度的关系。而这里的入度其实就可以看做通过其他网页连接主动访问该网页;而出度就可以看做从这个网页上连接到其他网页中。如果入度越大,则表示该网站被引用的次数越多。这就意味着网页比较流行比较热门。如图A页面。

  在搜索引擎中,谷歌提出了PageRank(佩奇等级)算法,这个算法也是谷歌搜索引擎的重要算法之一。

  在关键字提取/分词环节,基础技术是分词,所以分词是各个搜索引擎中比较关键的技术,无论是中文还是英文,在创建索引之前都需要对内容进行分词。分词不仅是关键词提取的前提,也是文本后续挖掘的基础。

  在分词方面,中文和英文有着天然的差异性,相较而言,英文语系下的分词会相对比较简单,英文有天然的空格作为单词的分隔符。中文只能是通过标点符号来分隔句子,但没有办法来分隔汉字,词语本身,另外就是汉字的连续性才能表示对应的意思。这样就增加了分词的难度,不能将一个汉字看做一个分词来处理。

  在中英文都有一类词语,叫做Stop Word ,也就是停用词。停用词一般是指无内容指示的词。

  中文分词,常用的算法可以分为两大类,一类是基于字典的机械分词;一类是基于统计分词。

  基于字典分词的分词法,一般会按照一定的策略将待分析的汉字串与一个充分大的词典词条进行匹配,若在词典中找到了某个字符串词条,则匹配成功。所以基于字典分词其实就是字符串的匹配。

  在匹配字符串的时候,分为正向匹配和逆向匹配两种。正向匹配是指在匹配字符串的时候从左到右的匹配。而逆向匹配则是从右向左的匹配。

  所以,基于字典匹配的分词算法一般常用正向最大匹配、逆向最大匹配,或者是两种组合模式。基于字典匹配比较依赖于字典本身的更新,也就是对新词的收录。

  第二类分词算法是基于统计的分词算法。这个算法不需要字典,一般会根据汉字与汉字相邻出现的概率来进行分词。因此基于统计分词的算法往往需要构建一个语料库,并且不断的更新。在分词之前,算法需要预处理,对语料库中相邻的各个字的组合进行统计,计算两个汉字的组合概率。

  其实两种算法,对于新词是不友好的,往往都会出现匹配度不高的情况。

  在实际开发中,各个语言栈常用的分词中间件如下

  • Python 语言中的中文分词组件有jieba中文分词
  • Java 预言中常用Jcseg、Ansj和庖丁分词
  • Go 语言中常用 sego

倒排索引

   在中文信息检索领域,索引发展经历了基于字的索引和基于词的索引两种。无论是基于字的索引,还是基于词的索引,在建立的过程中,都会涉及到正排索引和倒排索引两个数据结构。

  正排索引

在这里插入图片描述
  如图所示,在正排索引中,以网页或者文章映射关系为Key、以分词列表为Value。而在实际的搜索网页或者文章的时候,正是与这个过程相反,也就是说在搜索的时候以查询语句的分词列表为Key来进行搜索。所以,为了提高搜索的效率,需要对正排索引进行转化,转化成以分词Key、以网页或者文章列表为Value的结构,这个结构就是倒排索引

在这里插入图片描述
  介绍完正排索引和倒排索引之后,下面就来看一下两者之间的区别。

  • 内容1 我是一个中国人
  • 内容2 她是一个中国人
  • 内容3 你是一个中国人

  当基于字做索引的时候,上述的三句话分别可以按照字的结构拆分。

  倒排索引

在这里插入图片描述
  当然也可以通过词进行划分。

  在倒排索引中,有词条(Term)、词典(Term Dictionary)、倒排表(Post List)三个名词。

  词条是缩影里最小的存储和查询单元,一般的,在英语环境中一个单词就是一个词条,在中文环境下一个词语或者一个词组就是一个词条。

  词典又被称为字典,是词条的集合,单词词典一般是由网页或者文章集合中出现过的所有词构成的字符串集合。

  Elasticsearch 是基于Lucene实现的,在Lucene中,词典和倒排表是实现快速检索的的关键,另外,词典和倒排表是分两部分存储的,词典存储在内存中,倒排表存储在磁盘上。

结果排序

  搜索引擎除了对网络爬虫爬取的网页进行处理,将它们结构化成倒排序索引之外,还有一个比较重要的工作就是对用户查询进行响应。

  搜索引擎系统接受到用户提交的查询字符串之后,字符串进行分词,去除不必要的停用词等,进行倒排索引查询,多个关键词的倒排索引查询结构的交集就是搜索结果。

  用户所需要的搜索结果往往是需要进一步进行处理的。例如进行排序,搜索结果排序是搜索引擎查询服务的核心所在。排序结果决定了搜索引擎的挺严好坏,用户是否得到满意的结果。

  搜索结果的排序算法在不断的发展,早起主要是基于查询词的词频来进行排序,随后就出现了PageRank和相关性等算法排序。

  一般,相关性算法主要是需要考虑关键词的使用频率、关键词在网页中的词频、关键字间距、关键词网页连接等等因素。

  关键词在网页中的词频越高,也就意味着页面与搜索的关键词月密切。

  关键词出现在所在网页的位置是指关键词是否出现在比较重要的位置,例如标题。关键词位置越重要,说明页面与网页的相关度越高。一般的,在建立倒排索引的时候,关键词出现的位置也会被记录在其中。

  关键词见的距离值的是多个关键词在页面上出现的位置接近的程度,关键词越接近,说明该网页在搜索词字符串的相关度越高。

  网页连接及重要性值得是页面有越多以搜索词为关键词的导入连接,说明页面的相关性越强;链接分析还包括了连接源页面本身的主题、目标文字周围的文字等。

  在目前的搜索引擎中,都不约而同的引入了用户行为分析、数据挖掘等技术的使用,也是为了大数据,同样是为了提升搜索质量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nihui123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值