Solr的工作原理以及全文检索实现原理处理器/DSP

solr是基于Lucence开发的企业级搜索引擎技术,而lucence的原理是倒排索引。那么什么是倒排索引呢?接下来我们就介绍一下lucence倒排索引原理。

我们使用IkAnalyzer实现中文分词,分词之后结果为:

全文检索实现原理

Lucene是一个高效的,基于Java的全文检索库。

所以在了解Lucene之前要费一番工夫了解一下全文检索。

那么什么叫做全文检索呢?这要从我们生活中的数据说起。

我们生活中的数据总体分为两种:结构化数据和非结构化数据。

结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。

非结构化数据:指不定长或无固定格式的数据,如邮件,word文档等。

当然有的地方还会提到第三种,半结构化数据,如XML,HTML等,当根据需要可按结构化数据来处理,也可抽取出纯文本按非结构化数据来处理。

非结构化数据又一种叫法叫全文数据。

按照数据的分类,搜索也分为两种:

对非结构化数据也即对全文数据的搜索主要有两种方法:

这种想法很天然,却构成了全文检索的基本思路,也即将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。

这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引。

这种说法比较抽象,举几个例子就很容易明白,比如字典,字典的拼音表和部首检字表就相当于字典的索引,对每一个字的解释是非结构化的,如果字典没有音节表和部首检字表,在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理,比如读音,就比较结构化,分声母和韵母,分别只有几种可以一一列举,于是将读音拿出来按一定的顺序排列,每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音,然后按其指向的页数,便可找到我们的非结构化数据——也即对字的解释。

这种先建立索引,在对索引进行搜索的过程就叫做全文检索。

全文检索大体分为2个过程,索引创建和搜索索引

1.索引创建:将现实世界中的所有结构化和非结构化数据提取信息,创建索引的过程

2.索引索引:就是得到用户查询的请求,搜索创建的索引,然后返回结果的过程

于是全文检索就存在3个重要的问题:

1.索引里面究竟存了什么东西?

2.如何创建索引?

3.如何对索引进行搜索?

下面我们顺序对每个个问题进行研究。

二、索引里面究竟存些什么

索引里面究竟需要存些什么呢?

首先我们来看为什么顺序扫描的速度慢:

其实是由于我们想要搜索的信息和非结构化数据中所存储的信息不一致造成的。

非结构化数据中所存储的信息是每个文件包含哪些字符串,也即已知文件,欲求字符串相对容易,也即是从文件到字符串的映射。而我们想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。两者恰恰相反。于是如果索引总能够保存从字符串到文件的映射,则会大大提高搜索速度。

由于从字符串到文件的映射是文件到字符串映射的反向过程,于是保存这种信息的索引称为反向索引。

反向索引的所保存的信息一般如下:

假设我的文档集合里面有100篇文档,为了方便表示,我们为文档编号从1到100,得到下面的结构

左边保存的是一系列字符串,称为词典。

每个字符串都指向包含此字符串的文档(Document)链表,此文档链表称为倒排表(PostingList)。

有了索引,便使保存的信息和要搜索的信息一致,可以大大加快搜索的速度。

比如说,我们要寻找既包含字符串“lucene”又包含字符串“solr”的文档,我们只需要以下几步:

1.取出包含字符串“lucene”的文档链表。

2.取出包含字符串“solr”的文档链表。

3.通过合并链表,找出既包含“lucene”又包含“solr”的文件。

看到这个地方,有人可能会说,全文检索的确加快了搜索的速度,但是多了索引的过程,两者加起来不一定比顺序扫描快多少。的确,加上索引的过程,全文检索不一定比顺序扫描快,尤其是在数据量小的时候更是如此。而对一个很大量的数据创建索引也是一个很慢的过程。

然而两者还是有区别的,顺序扫描是每次都要扫描,而创建索引的过程仅仅需要一次,以后便是一劳永逸的了,每次搜索,创建索引的过程不必经过,仅仅搜索创建好的索引就可以了。

这也是全文搜索相对于顺序扫描的优势之一:一次索引,多次使用。

三、如何创建索引

全文检索的索引创建过程一般有以下几步:

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

为了方便说明索引创建过程,这里特意用两个文件为例:

文件一:Studentsshouldbeallowedtogooutwiththeirfriends,butnotallowedtodrinkbeer.

文件二:MyfriendJerrywenttoschooltoseehisstudentsbutfoundthemdrunkwhichisnotallowed.

第二步:将原文档传给分次组件(Tokenizer)。

分词组件(Tokenizer)会做以下几件事情(此过程称为Tokenize):

1.将文档分成一个一个单独的单词。

2.去除标点符号。

3.去除停词(Stopword)。

所谓停词(Stopword)就是一种语言中最普通的一些单词,由于没有特别的意义,因而大多数情况下不能成为搜索的关键词,因而创建索引时,这种词会被去掉而减少索引的大小。

英语中挺词(Stopword)如:“the”,“a”,“this”等。

对于每一种语言的分词组件(Tokenizer),都有一个停词(stopword)集合。

经过分词(Tokenizer)后得到的结果称为词元(Token)。

在我们的例子中,便得到以下词元(Token):

“Students”,“allowed”,“go”,“their”,“friends”,“allowed”,“drink”,“beer”,“My”,“friend”,“Jerry”,“went”,“school”,“see”,“his”,“students”,“found”,“them”,“drunk”,“allowed”。

第三步:将得到的词元(Token)传给语言处理组件(LinguisticProcessor)。

对于英语,语言处理组件(LinguisticProcessor)一般做以下几点:

1.变为小写(Lowercase)。

3.将单词转变为词根形式,如“drove”到“drive”等。这种操作称为:lemmatization

第四步:将得到的词(Term)传给索引组件(Indexer)。等等

总而言之

1.索引过程:

1)有一系列被索引文件

2)被索引文件经过语法分析和语言处理形成一系列词(Term)。

3)经过索引创建形成词典和反向索引表。

4)通过索引存储将索引写入硬盘。

2.搜索过程:

a)用户输入查询语句。

b)对查询语句经过语法分析和语言分析得到一系列词(Term)。

c)通过语法分析得到一个查询树。

d)通过索引存储将索引读入到内存。

e)利用查询树搜索索引,从而得到每个词(Term)的文档链表,对文档链表进行交,差,并得到结果文档。

THE END
1.学习笔记:DB29基础superdebug通过查看相关的对象,可以更好地理解数据库的结构,了解数据库中现有的对象以及它们之间的关系。例如,如果想删除一个有相关视图的表,Show Related 特性会识别出在删除这个表之后哪些视图会失效。 10、过滤(Filter) 可以对任何 DB2 工具的内容面板中显示的信息进行过滤。还可以对查询返回的信息进行过滤(比如限制结果集中https://redhat.talkwithtrend.com/Article/188197
2.mongoDB和mysql对比分析及选择(详细版)数据库其它比如我们熟知的例子,学生-课程-老师关系,如果用引用模型来实现三者的关系,可能会比内嵌模型更清晰直观,同时会减少很多冗余数据。 当需要实现复杂的树形关系的时候,可以考虑引用模型。 四、应用场景分析 1、MongoDB的应用场景 1)表结构不明确且数据不断变大 MongoDB是非结构化文档数据库,扩展字段很容易且不https://www.jb51.net/database/287301v7z.htm
3.数据架构:大数据数据仓库以及DataVault非重复型非结构化信息与重复型非结构化记录有着根本性的不同。对于非重复型非结构化记录而言,它们无论在形式还是内容上都很少重复或者根本不重复。非重复型非结构化信息的例子有电子邮件、呼叫中心对话和市场调查等。当你查看一封电子邮件时,会有很大概率发现数据库中的下一封邮件与前一封邮件是极为不同的。对呼叫https://www.ituring.com.cn/book/tupubarticle/11854
4.非结构化的数据库51CTO博客已为您找到关于非结构化的数据库的相关内容,包含IT学习相关文档代码介绍、相关教程视频课程,以及非结构化的数据库问答内容。更多非结构化的数据库相关解答可以来51CTO博客参与分享和学习,帮助广大IT技术人实现成长和进步。https://blog.51cto.com/topic/feijiegouhuadeshujuku.html
5.非结构化数据提取技术在统计工作中的应用摘要结构化数据和非结构化数据是大数据的两种类型,目前非结构化数据信息已达信息总量的85%以上,且每年以55%~65%的速度增长,统计工作受到大数据的冲击,日常总会遇到一些非结构化数据提取的难题,导致工作量加大,效率低下。本文对非结构化数据及其提取技术、大数据处理语言——Python语言进行学习研究,解决实际中遇到https://tjj.changzhi.gov.cn/sjfx/202207/t20220704_2588893.html
6.蓝蓝高频面试之数据库系列第一期数据库基础20题结构化查询语言 (Structured Query Language) 简称 SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。 什么是MySQL? MySQL 是一个关系型数据库管理系统,MySQL 是最流行的关系型数据库管理系统之一,常见的关系型数据库还有 Oracle 、SQL Servhttps://m.nowcoder.com/discuss/353158849412669440
7.结构化数据和非结构化数据的例子可能是文本文件、电流新箱、图片、音频和视瓶文件、社交媒体文章等内容, 非结构化数据的例子包括客户对调查的反馈、社交媒体和产品审查。 与结构化数据相比,非结构化数据更能分析,因为它的组织不整齐。 但是,由于诸如自然语言处理和机器学习等新技术,我们现在可以从无结构的数据中提取有用的信息。 我们可以使用情绪https://wenku.baidu.com/view/cc774aa53a68011ca300a6c30c2259010202f38c.html
8.推荐:处理非结构化数据的7个实例(附链接)本文作者根据个人过往工作经验,整理出了处理非结构化数据的7个实例,希望能对读者处理相关实际问题有所启发。 本文是作为数据科学博客松的一部分发表的。 介绍 我敢肯定,从事数据工作的人,不管数据量大小与否,都遇到过如下问题:数据不好,数据不一致,数据不干净,诸如此类。帮工作中鲜与数据打交道的人科普一下,根据https://blog.csdn.net/Tw6cy6uKyDea86Z/article/details/112255708
9.什么是文本挖掘?IBM半结构化数据:顾名思义,这些数据由结构化和非结构化数据格式混合而成。 虽然这种数据经过了一定的组织,但其结构不足以满足关系数据库的要求。 半结构化数据的例子包括 XML、JSON 和 HTML 文件。 由于世界上约 80% 的数据都属于非结构化格式(链接位于 ibm.com 外部),因此对于组织而言,文本挖掘是一种非常有价值https://www.ibm.com/cn-zh/topics/text-mining
10.结构化半结构化和非结构化数据都有哪些数据可以根据其格式和可访问性被分类为结构化数据、半结构化数据和非结构化数据。下面是每种数据类型的定义和一些例子: 结构化数据 结构化数据是指遵循固定格式的数据,通常存储在关系数据库中。这种数据类型易于搜索和组织,因为它遵循一定的模式(如表格),每个数据项都有明确的字段。 https://www.jianshu.com/p/7018b1bef624
11.大数据测试——完整的软件测试初学者指南腾讯云开发者社区大数据中的数据格式可以分为三类。它们是: 结构化数据 半结构化数据 非结构化数据 结构化数据 这指的是高度组织的数据。 它可以轻松地存储在任何关系数据库中。 这也意味着可以使用简单的查询轻松地检索/搜索它。 结构化数据的例子 下图描述了一个应用程序的数据模型。在这里可以看到表和表中相关的列。在这个例子https://cloud.tencent.com/developer/article/1620817
12.大数据的多样性和混杂性数据分析师Variety能做老二的最大底气来自于占大数据体量八成以上的非结构化数据。天知道这“八成”是怎么算出来的,但既然美林从98年就开始在企业数据市场这么说,十几年过去应该有增无减。 Variety从本义来说是指数据种类的多样性,我把数据质量的多样性即混杂性(舍恩伯格《大数据时代》中对messy的翻译正好是“混杂”)也放入https://www.cda.cn/view/2523.html