搜索技术研讨-全文搜索引擎

搜索技术研讨-全文搜索引擎

1. 概述

全文搜索引擎: 就是通过从互联网上提取的各个网站的信息(以网页文字为主)而建立的数据库中,检索与用户查询条件匹配的相关记录,然后按一定的排列顺序将结果返回给用户的系统。

2. 原理

全文搜索引擎的“蜘蛛”(Spider)程序或“机器人”(Robot)程序是一种网络上的软件,它遍历 Web 空间,能够扫描一定 IP 地址范围内的网站,并沿着网络上的链接从一个网页到另一个网页,从一个网站到另一个网站采集网页资料。它为保证采集的资料最新,还会回访已抓取过的网页。

比如说这里有一个网站 A 这个爬虫,我就会访问这个网站。然后访问这个网站的时候,他会发现这个网站上面有两个链接。这两个链通过这个两个链接可以访问到另外两个网站。然后他就会继续访问这另外两个网站,就这样继续的递归下去,把所有的网站都访问一遍。

网络机器人或网络蜘蛛采集的网页,还要有其他程序进行分析,根据一定的相关度算法进行大量的计算建立网页索引,才能添加到索引数据库中。

 当用户输入关键词进行查询时,搜索引擎会从庞大的数据库中找到符合该关键词的所有相关网页的索引,并按一定的排名规则呈现给我们。

3. 组成

全文搜索引擎主要由四大系统构成。

  1. 下载系统,用于从 Web 上采集各种类型的网页信息,并保持对 Web 变化的同步。
  2. 分析系统,用于对下载系统采集的信息进行 PageRank 和分词计算。
  3. 索引系统,用于将分析系统处理后的网页对象索引入库。
  4. 查询系统,用于分析用户提交的查询请求,然后从索引库中检索出相关网页并将网页排序后,以查询结果的形式返回给用户。

全文搜索引擎的工作过程

下载系统 -> 分析系统 - > 索引系统 -> 查询系统

首先下载系统从互联网上下载信息建立一个文档库,再由分析系统来分析文档并生成索引,再由索引系统建立一个索引库。
当用户查询的时候查询系统就从索引库中查询这个关键词,再把查询结果展示给用户。

4. 下载系统

用于从 Web 上采集各种类型的网页信息,并保持对 Web 变化的同步。俗称“蜘蛛”(Spider)程序或“机器人”(Robot)程序。

网络爬虫从互联网源源不断地抓取海量信息,搜索引擎结果中的信息都来源于此。如果把互联网比喻成一个覆盖地球的蜘蛛网,那么抓取程序就是在网上爬来爬去的蜘蛛。爬虫的好处是能汇集有用的数据。

网络爬虫 (又称为网页蜘蛛,网络机器人,网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者 脚本 。

爬虫的基本原理

如果把网页看成节点,网页之间的超链接看成边,则可以把整个互联网看成是一个巨大的非连通图。为了获取网页,需要有一个初始的 URL 地址列表。然后通过网页中的超链接访问到其他页面。

爬虫首先会访问初始 URL,拿到网页后开始解析网页内容,解析过程中把解析的内容放到数据库,并继续访问从网页中新解析出来的新 URL,如此循环下去。

整个互联网是一个大的图,其中,每个 URL 相当于图中的一个节点,因此,网页遍历就可以采用图遍历的算法进行。即可以采用广度优先遍历、深度优先遍历和最佳优先遍历等等。

5. 分析系统

用于对下载系统采集的信息进行 PageRank(网页级别)和分词计算。说这个网页级别的判定,我们在访问这些网站的时候,有些网站是质量非常高的。但有些网站就是一个垃圾网站,或者就是一些钓鱼网站。这些网站们是不能要的。

搜索引擎需要从中提取需要的信息,很多网页中包括用户不想搜索的信息,例如广告、版权信息、导航条等。

爬虫访问这个网站的时候,他看到的是 HTML 源码,那怎么样从这些源码当中再获得我们想要的信息呢?

我们再看一下这个 HTMI 源码的基本结构

<html>
    <head> </head>
    <body></body>
</html>

它就像这样由标签嵌套另一个标签组成。比如说在这个 html 标签里面有个 head 标签和 body 标签,那么我们可以按照 HTML 的这样一个结构来建立 DOM 树。像这样的 html 里面有两个标签,这些标签里面还有其他的标签。这样的话它就会建立成了一个树结构。此时我们就可以按照树结构的一些算法进行遍历和提取我们需要的信息,再建立索引。

6. 分析系统

创建索引过程

在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构

常见的索引结构有:B+树,LSM 树,正向索引,倒排索引树等等。

倒排索引(英语:Inverted, index),是一种索引方法,它是文档检索系统中最常用的数据结构。
被用来 存储 在全文搜索下某个 单词在 一个文档或者一组 文档中的 存储 位置 的映射。
通过倒排索引,可以根据单词快速获取包含这个单词的文档列表。

索引创建过程,以倒排索引为例:

举例:

第一步:一些要索引的原文档(Document)。

Java is the best programming language.
PHP is the best programming language.
Javascript is the best programming language.

第二步:将原文档进行词法/语法分析, 拆成一堆词。

“Java”,“is”,“the”, “best”, “programming”, “language”,
“PHP”, “is”, “the”, “best”, “programming”, “language”,
“Javascript”, “is”, “the”, “best”, “programming”, “language”

第三步:创建字典,排序,合并

  1. 利用得到的词(Term)创建一个字典。

2. 对字典按字母顺序进行排序。合并相同的词(Term) 成为文档倒排(Posting List) 链表。

7. 索引系统

用于将分析系统处理后的网页对象索引入库。

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

以 Lucene 索引系统为例:

它会把这个字典的这个字字典的内容分成了不同的文件。比如说有一个词典文件,这个文件里面有关键词和指针,然后这个指针会指向其他的文件。比如说频率文件或者位置文件,还有像这样的其他很多很多种文件。那他索引系统他做了什么?就比如说我们刚才分析出来的这些词典是它它是在内存当中的。然后他就在磁盘里面建立了这么一些个文件,把内存的每一个词指向了这个磁盘当中的这些文件的内容。

8. 查询系统

用于分析用户提交的查询请求,然后从索引库中检索出相关网页并将网页排序后,以查询结果的形式返回给用户。

全文搜索查询过程:

第一步:用户输入关键字

第二步:对查询的语句进行词法分析语法分析及语言处理

为什么还要分析?关键词里面除了用户输入的单词以外,还有搜索引擎自己的关键字(keyword)

搜索引擎基本功能:

布尔逻辑检索:支持布尔逻辑运算 (使用 AND/OR/NOT 区分与或非检索)。
字符串检索/多词检索:精确检索方式,将检索词用双引号括起来,作为一个完整的字符串进行检索,空格区分多词检索。

截词检索:一般搜索引擎都支持,但多提供右截词。比如说,在文本词检索框里输入“chin*”,搜索结果包含了 China,Chinese 等词搜索结果 。

字段限制:在搜索引擎中,一律使用前缀限制(=后应加空格) 。不同的搜索引擎使用的前缀代码不完全相同,如题名字段, Google 使用“TI”, 百度使用“Title”。

其他:文档类型限制、指定目录(网站)、标题搜索 INTITLE、 URL 范围、引号书名号精确搜索等等

进行词法分析语法分析及语言处理:

词法:单词和关键词,用户文本是单词,AND/OR/NOT 等属于关键词

语法分析:根据语法规则形成语法树

语言处理:和索引过程相同,进行分词,建立索引等。

 

它会按照内容建立一个语法树。比如说像这样,这个语法树的意思就是既包含数据也包含结构这个词,但是不包含算法这个词的结果。

比如说我们点了这个高级搜索之后,在输入框的文字就变成了这样子。这么说的话就是百度的这个语法就是用空格来表示 AND 运算,然后用负括号表示这个 NOT 运算。表示这个非运算,然后再对这个词进行语言的一些处理,进行一些分词等等。

第三步:从倒排索引中检索,搜索索引得到符合语法树的文档

之后它会从我们刚建立的索引合同中查询这个词匹配到的文档。

第四步:得到查询语句的相关性,对结果排序

查找出来查找出来之后,就开始对结构进行一个排序了。如何让用户更想要的搜索结果排到前面呢?有哪些方法?搜索引擎都干了什么?我们来看一下。

  • 过滤停用词:例如“的,了,么”等。

首先就是停用词表,一个优秀的搜索引擎,它肯定有一个比较完善的停用词表。停用词表是什么?就是记录一些像“的,了,么”之类的词,就是实际含义没有那么大的一些词。当搜索引擎从索引库中搜索我们的关键词的时候,他会忽略这些词。

  • 句法分析:理解文本,从而更准确的返回搜索结果。比如用户输入“瘦瘦的女生适合穿什么衣服”,如果返回结果中包括“瘦瘦的女孩子穿什么衣服好看”可能是用户想要的结果。

  • 文档排重:不同的网站间转载内容的情况很常见。即使在同一个网站,有时候不同的 URL 地址可能对应同一个页面,或者存在同样的内容以多种方式显示出来,所以网页需要按内容做文档排重。

  • 权重计算:按照关键词在文档中出现的频率,位置等等进行排序。

  • 相关搜索词:当搜索结果太少时,帮助用户扩展搜索内容。

  • 拼写检查与建议:在搜索框中输入错误的搜索词时,往往可以看到“您是不是想要找”。

  • 个性化推荐:按照地理位置,以往的搜索记录等等找到用户更想要的结果。

它干的事情不止这些,如今有大数据、人工智能等技术的支持搜索引擎更能准确的判断出来你想要的结果。

第五步:展示搜索结果

参考资料

[1] 全文搜索引擎技术原理入门,【原创】全文搜索引擎技术原理入门_全文搜索 nlp_黑夜路人的博客-CSDN博客
[2] 搜素引擎全文检索原理,搜素引擎全文检索原理_weixin_30411997的博客-CSDN博客
[3] 罗刚,解密搜索引擎技术实战:Lucene & Java 精华版(第 2 版),2011 年 6 月

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WuKong 全文搜索引擎。功能特性:高效索引和搜索(1M条微博500M数据28秒索引完,1.65毫秒搜索响应时间,19K搜索QPS)支持中文分词(使用sego分词包并发分词,速度27MB/秒)支持计算关键词在文本中的紧邻距离(token proximity)支持计算BM25相关度支持自定义评分字段和评分规则支持在线添加、删除索引支持持久存储可实现分布式索引和搜索采用对商业应用友好的Apache License v2发布示例代码:package main import (     "github.com/huichen/wukong/engine"     "github.com/huichen/wukong/types"     "log" ) var (     // searcher是协程安全的     searcher = engine.Engine{} ) func main() {     // 初始化     searcher.Init(types.EngineInitOptions{         SegmenterDictionaries: "github.com/huichen/wukong/data/dictionary.txt"})     defer searcher.Close()     // 将文档加入索引     searcher.IndexDocument(0, types.DocumentIndexData{Content: "此次百度收购将成中国互联网最大并购"})     searcher.IndexDocument(1, types.DocumentIndexData{Content: "百度宣布拟全资收购91无线业务"})     searcher.IndexDocument(2, types.DocumentIndexData{Content: "百度是中国最大的搜索引擎"})     // 等待索引刷新完毕     searcher.FlushIndex()     // 搜索输出格式见types.SearchResponse结构体     log.Print(searcher.Search(types.SearchRequest{Text:"百度中国"})) } 标签:WuKongSearch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI麥爾

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

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

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

打赏作者

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

抵扣说明:

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

余额充值