全文搜索原理简单解析

文前声明:本人只是知识的搬运工,文中许多知识和观点大多数都是来自于网络或书本,因为没有记录的习惯学习研究完,便忘记名称了,如若还记得,在文后自会添加备注。

注:这是本人的第一篇薄文,水平相形见拙,有错误之处,欢迎指正。

今年的计划是存储领域,希望能深入的了解其原理,如果能有创造性的写出一个自己的文件系统出来就更好了,到目前为止尚无动工的迹象,估计会顺延至明年了吧!

我的计划正好赶上公司的总规划,于是便接了“大数据”的活。刚开始进入这一行,走了不少弯路,说多了都是泪(这不是本文的主题,就此打住,后面再叙),就在被Hive,Hbase,Hadoop,Spark等等各种工具搞的眼花缭乱的某个瞬间,头脑中冒出一个问题:如果不让用传统的关系数据库,要你自己去实现大数据存贮的话,第一件事要做的是什么? 搜索,全文搜索。数据存好存,关键是怎么找到你想要找到的数据,于是便花了一天时间研究了全文搜索技术(我想搞大数据的都该懂搜索才对的吧),谷歌、百度还有其他各种所搜都是采用的”全文搜索“,但技术实现各有优劣。

那什么叫“全文搜索“,它的定义是什么? 说白了就是在一堆非结构化的文档中寻找你想要的数据的技术。

全文搜索的实现技术各种各样,最原始的就是顺序查找。顺序查找顾名思义就是一个文档一个文档,一个字符一个字符查找,这种搜索技术简单,但时间复杂度为O(n)。人们发现为什么关系数据库的搜索就非常快,因为关系数据库添加了索引。全文搜索是不是可以参考一下它的实现呢,是的,当然可以,于是便诞生了现代的全新的”全文搜索技术“。这种技术类似于我们查新华字典的过程,现代新华字典增加了两种索引技术,一种是汉语拼音索引,一种是偏旁部首索引,可根据你的喜好自行选择其中一种索引技术去查找汉字。

至此,我们引出了一个新的问题:即如何为一份文档创建索引?这是一个好问题,要讲的内容真不少,它牵涉到分词技术,因篇幅所限,所有问题的答案都从简,直白说,为一份文档创建索引就是提取关键字的过程。举个例子:”周杰伦很有才。他唱歌很好,就是口齿不清,这是一个遗憾!“,在这两句话中,我们提取出来的关键字应该是”周杰伦、有才、唱歌好、口齿不清、遗憾“,剩下的部分在分词技术领域被称为”停用词“(英文名称叫stop words),提取出来的关键字叫tokens。这种提取关键字的技术与我们初中语文课上学习的“提取句子主干即只保留主谓宾”内容相似,细节上区分还是蛮大的。

我们创建起来的索引,大致如下图所示:

这种为文档创建起来的索引,在学术上称为“倒排索引“,好,索引创建好了,那如何搜索呢?

这一步工作比创建索引要简单些(其实并不简单),我们输入关键字,程序根据关键字返回对应的文档,看起来到这一步貌似很合理,这就结束了?事实上没有这么简单,想想百度的时候,搜索的答案是随机的吗?显然不是(当然百度竞价排名是可恶的),搜索到的答案是根据一定的规则来返回。这个规则学术上称之为“评分”,评分高在前还是低在前要看评分规则了。

开源的搜索引擎"Lucene",评分规则就是低分在前,关于评分的规则也不展开说了,后面有机会再聊。

最后总结一下整个过程吧:

1:获取文档

2:进行分词,创建索引

3:索引存贮,以备后用

4:用户输入查找

5:分析用户输入,还是分词

6:搜索索引,返回相关文档

7:对返回的文档进行评分,进行排序

8:返回搜索到的文档

这里面每一步足以一篇论文来论述,后面有机会去实践这个玩意的时候,再详细叙述吧!

时间: 2024-10-10 17:17:43

全文搜索原理简单解析的相关文章

SQLServer 原理简单解析

(1) 客户端sqlserver网络接口通过一种网络协议(可以是共享内存:简单高速,客户端和sql server在同一台计算机默认连接方式:TCP/IP:访问sql server最常用的一种协议,客户端指定ip地址和端口号连接到sql server;命名管道:命名管道和TCP/IP协议在体系结构上是类似的,是为局域网设计的,在广域网中速度会慢一些:VIA:虚拟接口适配器,是一种可以让两个系统进行高性能通信的协议,要求通信两端使用特殊的硬件和专门连接)和服务的的SNI建立了一个连接,然后通过网络协

Lucene全文搜索原理与使用

本文中主要是对于Lucene全文搜索的基础原理进行简单的分析,以及Lucene实现全文搜索的流程,之后就是Lucene在Java中的最简单使用:创建索引,查询索引库: 本文中使用的Lucene主要是4.10.3和6.0.0,两个版本的原理相同,但是API的使用并不相同: 1.结构化数据与非结构化数据 2.非结构化数据搜索 3.全文搜索 4.搜索如何实现 5.Lucene实现全文搜索流程 6.Lucene的API使用 1.结构化数据与非结构化数据 结构化数据:指具有固定格式或有限长度的数据,如数据

iBoxDB全文搜索原理,演示与代码

原理 全文搜索的核心是"关键字",使用分词器把文章中的关键字分离出来,对于拼音语言,使用"where 关键字=?"查出对应的内容,对于中文这类语言,如果使用单个字做关键字, 条件中多一个位置信息 "where 字= ? & 位置=X+1", X是前一个字的位置,如果是多条件,where中还要多一个上一个条件返回的ID, "where 关键字=? & ID=X-ID". 演示 演示地址 全文搜索引擎Java代码

View的滚动原理简单解析

一直对View的滚动了解的不深,说明确了吧也能说出个所以然来,所以我就花了点时间做了一个小小的总结,言归正传,view的滑动分为下面三种: 1)View本身不滚动,指滚动View的内容,这也是View类提供的原始方法.通过scrollTo和ScrollBy方法来实现. 2)使用动画,让View来产生滚动效果 3)通过动态的改动LayoutParams的margin等属性让View来产生滚动 本篇博客就简单的分析一下第一种情况,同一时候本文最后还会简单的提供了一个样例: View本身就提供了scr

foreach的使用原理简单解析

数组可以foreach遍历,这个是在jdk1.5之前就可以的,我也不太清楚是怎么做到的. 后面的List,Set等的foreach都是实现Iterable接口,基于iterator()对象实现的.Foreach之所以能工作,是因为Java SE5引入了新的被称为Iterable的接口,该接口包含一个能够产生Iterator的iterator()方法,并且Iterable接口被foreach用来在序列中移动.因此如果你创建了任何实现Iterator的类,都可以将它用于forEach语句中. pub

ngx lua模块源码简单解析

ngx lua模块源码简单解析分类: nginx 2014-07-11 11:45 2097人阅读 评论(0) 收藏 举报nginxlua数据结构架构目录(?)[+]对nginx lua模块的整个流程,原理简单解析.由于nginx lua模块相关配置,指令,API非常多,所以本文档只以content_by_lua指令举例说明. 读本文档最好配合读源码. 不适合对nginx和lua一点都不了解的人看.1.相关配置详细配置见 https://github.com/openresty/lua-ngin

Lucene及全文搜索实现原理

Lucene及全文搜索实现原理 全文搜索 全文搜索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式.这个过程类似于通过字典中的检索字表查字的过程.全文搜索搜索引擎数据库中的数据. ????全文搜索的过程主要分为两个部分,索引的建立以及索引的搜索. 国内外的全文搜索常用的检索模型主要有向量模型,布尔模型等. 布尔模型 布尔模型是第一个信息检索的模型,可能也是最

MapReduce 简单的全文搜索2

上一个全文搜索实现了模糊查找,这个主要实现了精确查找,就是比如你查找mapreduce is simple那么他就只查找有这个句子的文章,而不是查找有这三个单词的文章. 这个版本需要重写反向索引,因为需要查找句子,所以需要定位每个单词的在文章中的位置,所以我们的反向索引需要加上单词所在的位置,即我们希望的输出是: MapReduce file1.txt:<1,2,3>;file2.txt:<5,3,1>;这种格式的. 其实这一步比较简单.我们在map的时候输出为 “filename

MapReduce 简单的全文搜索

上一个已经实现了反向索引,那么为什么不尝试下全文搜索呢.例如有了 Hello     file3.txt:1; MapReduce     file3.txt:2;fil1.txt:1;fil2.txt:1; bye     file3.txt:1;  is     fil1.txt:1;fil2.txt:2; powerful     fil2.txt:1; simple     fil2.txt:1;fil1.txt:1; 那么我要找MapReduce is simple,那么就有file1