什么是全文检索

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 全文检索技术被广泛的应用于搜索引擎,查询检索等领域。我们在网络上的大部分搜索服务都用到了全文检索技术。对于数据量大、数据结构不固定的数据可采用全文检索方式搜索,比如百度、Google等搜索引擎、论坛站内搜索、电商网站站内搜索等。

案例


实现一个文件的搜索功能,通过关键字搜索文件,凡是文件名或文件内容包括关键字的文件都需要找出来。还可以根据中文词语进行查询,并且需要支持多个条件查询。

本案例中的原始内容就是磁盘上的一些示例文件,如下图:

微信图片_20220526210023.jpg

如果用数据库实现的话,数据库中的搜索很容易实现,通常都是使用sql语句进行查询,而且能很快的得到查询结果。

为什么数据库搜索很容易?

因为数据库中的数据存储是有规律的,有行有列而且数据格式、数据长度都是固定的。

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

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

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

结构化数据的查询我们可以通过sql搞定,那么非结构化的呢?


非结构化数据的查询方法


非结构化数据查询有两种办法:

(1)顺序扫描法(Serial Scanning)

所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。

(2)全文检索(Full-text Search)

将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引

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

这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。

虽然创建索引的过程也是非常耗时的,但是索引一旦创建就可以多次使用,全文检索主要处理的是查询,所以耗时间创建索引是值得的。

那么如何实现全文检索呢?


Lucene


提到全文检索,不得不提到的一个技术就是Lucene,Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。我们所熟知的全文检索引擎Solr和ES都是基于Lucene的。

微信图片_20220526210030.jpg

1、绿色表示索引过程,对要搜索的原始内容进行索引构建一个索引库,索引过程包括:

确定原始内容即要搜索的内容->采集文档->创建文档->分析文档->索引文档


2、红色表示搜索过程,从索引库中搜索内容,搜索过程包括:

用户通过搜索界面->创建查询->执行搜索,从索引库搜索->渲染搜索结果

创建索引

也就是对文档索引的过程,将用户要搜索的文档内容进行索引,索引存储在索引库(index)中。

比如刚才的这些文档:

微信图片_20220526210034.jpg

我们要分析其中所有的单词,将单词、文档名建立映射关系。

(对于单词的切分包括了对原始文档提取单词、去除停用词等过程,这个过程被称为分词)

我们分析其中的一篇文档Lucene.txt:

原文档内容:

Lucene is a Java full-text search engine. Lucene is not a complete

application, but rather a code library and API that can easily be used

to add search capabilities to applications.

我们可以分析后得到语汇单元:

lucene、java、full、search、engine。。。。

另一个文档flink.txt加入几个单词:

java flink kakfa

我们也可以得到语汇单元:

java flink kakfa

这样我们就建立了映射关系,lucene、java、full、search在Lucene.txt中,而flink不在Lucene.txt中,但是在flink.txt中。java即在Lucene.txt中,也在flink.txt中。

微信图片_20220526210037.jpg

那当我们查找lucene这个词,就在Lucene.txt中,但是查找java时可以获悉其在这两个文件中。

创建索引是对语汇单元索引,通过词语找文档,这种索引的结构就叫做叫倒排索引结构

传统方法是根据文件找到该文件的内容,在文件内容中匹配搜索关键字,这种方法是顺序扫描方法,数据量大、搜索慢。

倒排索引结构是根据内容(词语)找文档,如下图:

微信图片_20220526210040.jpg

倒排索引结构也叫反向索引结构,包括索引和文档两部分,索引即词汇表,它的规模较小,而文档集合较大。

有倒排索引,对应肯定,有正向索引。正向索引其实就是顺序扫描所有文件,这样本身效率是极低的。

查询索引

查询索引也是搜索的过程。搜索就是用户输入关键字,从索引(index)中进行搜索的过程。根据关键字搜索索引,根据索引找到对应的文档,从而找到要搜索的内容(这里指磁盘上的文件)。

我们这里就是通过查询索引表,找到文档所在的位置,就完成了查询,但其他的场景可以灵活的把查询出来的结果展示出去,比如我们的百度搜索时,为我们展示的是相关网页。

微信图片_20220526210045.jpg


开发一个自己的全文检索


手动去开发建立索引和查询索引的功能需要大量的工作,好在lucene已经帮我们完成了大量的工作,只需要调用java api就可以完成相关工作。

但是Lucene的API过于底层,并不简单易用,而且缺乏企业级的管理工具对其进行监控管理,于是企业级的全文检索引擎就应运而生了,目前最流行的两个就是:Solr和ES。他们都是建立在Lucene之上的。

Solr

Solr是Apache Lucene项目的开源企业搜索平台。Solr是高度可扩展的,并提供了分布式搜索和索引复制。

微信图片_20220526210159.jpg

Solr由Java开发,运行在Servlet容器中,是一个独立的全文搜索服务器。并具有强大的API和外部配置功能,使得无需编码,便可对其调整以适应多种类型应用。

2010年Apache Lucene与Apache Solr项目合并,所以Lucene/Solr成为了Apache一个项目。

由此可见,Solr的优势就是:

有一个成熟的开发者社区;本省比较稳定;支持多种格式的索引。

但是由于底层机制的限制,Solr的缺点也很明显:

建立索引时,搜索效率下降;实时索引搜索效率不高。

ES

ES也就是Elasticsearch,是一个实时的分布式搜索和分析引擎,它可以用于全文搜索,结构化搜索以及分析。

微信图片_20220526210203.jpg

由于Lucene过于复杂,不方便使用。Elasticsearch使用Lucene作为内部引擎,但是Elasticsearch做搜索引擎时,只需要使用同一的API就可以,而不需要了解复杂的Lucene原理。

而且Elasticsearch不仅仅可以做全文搜索功能,在企业中可以作为:

  • 分布式实时文件存储;
  • 实时分析的分布式搜索引擎;

Elasticsearch的Restful API友好而且简单,特别容易上手。

目前包括维基百科、Stackoverflow、Github等都是用Elasticsearch作为其搜索引擎。

ES简单体验

这里我们简单使用一个ES完成一个全文检索功能。

1、下载

首先在官网下载 ,官网地址:https://www.elastic.co/products/elasticsearch

下载地址如下:https://www.elastic.co/cn/downloads/elasticsearch

选择自己系统的我们这选择WIndows版本。

微信图片_20220526210207.jpg

同时我们可以下载kibana,kibana是配合ES的一个可视化工具。

2、安装部署

解压 放在d盘

随后我们在命令行启动:

C:\Users\JN>d:
D:>cd 
D:\elasticsearch-6.4.0>cd bin
D:\elasticsearch-6.4.0\bin>elasticsearch.bat

kibana也是

C:\Users\JN>d:
D:>cd kibana-6.4.0-windows-x86_64
D:\kibana-6.4.0-windows-x86_64>cd bin
D:\kibana-6.4.0-windows-x86_64\bin>kibana.bat

部署成功:可以通过localhost:9200访问es

微信图片_20220526210210.jpg

localhost:5601访问kibana

微信图片_20220526210214.jpg

3、简单使用

我们简单体验一下ES,打开kibana的DevTools工具。

分别插入两条数据,并进行搜索。

使用编程语言调用ES也与这个类似,简单易用。

微信图片_20220526210218.jpg

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
4月前
|
自然语言处理 Java
ElasticSearch 实现分词全文检索 - 复合查询
ElasticSearch 实现分词全文检索 - 复合查询
66 0
|
7月前
|
搜索推荐 Java Shell
1.全文检索
1.全文检索
|
数据采集 存储 Java
02Lucene实现全文检索的流程
02Lucene实现全文检索的流程
52 0
|
自然语言处理 算法 UED
全文搜索
全文搜索树设计思路
126 0
|
存储 自然语言处理 NoSQL
使用Redisearch实现的全文检索功能服务
“检索”是很多产品中无法绕开的一个功能模块,当数据量小的时候可以使用模糊查询等操作凑合一下,但是当面临海量数据和高并发的时候,业界常用 elasticsearch 和 lucene 等方案,但是elasticsearch对运行时内存有着最低限额,其运行时大小推荐 2G 以上的内存空间,并且需要额外的磁盘空间做持久化存储。
使用Redisearch实现的全文检索功能服务
|
存储 SQL 自然语言处理
sphinx全文检索引擎
sphinx全文检索引擎
169 0
|
自然语言处理 搜索推荐 关系型数据库
ElasticSerach学习(三)-全文检索
ElasticSerach学习(三)-全文检索
153 0
|
存储 SQL 数据库