---
order: 10
---
# 全文检索

## 什么是全文检索{#what-is-fulltextsearch}

日常生活中的数据通常分为两类：结构化数据和非结构化数据。

- **结构化数据**：指具有固定格式或有限长度的数据，如数据库，元数据等。
- **非结构化数据**：指不定长或无固定格式的数据，如邮件，word文档等。

<!-- ::: tip 提示
有的地方还会提到第三种，即半结构化数据，如XML，HTML等，当根据需要可按结构化数据来处理，也可抽取出纯文本按非结构化数据来处理。
::: -->

按照数据的分类，搜索也分为两种：

- **对结构化数据的搜索**：如使用SQL语句对数据库表中字段数据的搜索，利用windows搜索对文件名，类型，修改时间进行搜索等。
- **对非结构化数据的搜索**：如用Google和百度等搜索引擎可以搜索大量内容数据。

通过信息技术手段实现对word、邮件、文章等无固定格式的非结构化数据进行检索的方式即为全文检索。通常意义上的全文检索具有如下的特征：

1. 提供快速查询响应

<!-- 全文检索搜索引擎一般通过分析器将非结构化数据进行处理生成倒排索引，基于倒排索引结构的查询实现快速响应 -->

基于倒排索引实现关键词的快速查询响应
2\. 结果相关性排序\
对匹配上的文档来打分，相关性越高的文档获得的分数越高，返回时越靠前。

随着企事业单位信息化进程的发展，数据出现爆发式的增长，海量数据如何实现快速的全文检索，是当前信息系统建设中遇到的严峻挑战。

## SuccBI的解决方案{#solution}

### 集成搜索引擎{#integrated-search-engine}

SuccBI是企业级产品，应用场景中往往有海量的数据，业务需求复杂而多变，随着业务的增长会有迁移或扩容的需求，同时海量数据的检索过程不是单纯的搜索，会伴随一些统计分析。基于这样的应用场景，SuccBI选择在产品层面集成了当前开源的、最主流、成熟的搜索引擎[Elasticsearch](https://www.elastic.co/cn/elasticsearch/)，借助Elasticsearch，SuccBI可以轻松的应对海量数据的全文检索。同时对于SuccBI来说，Elasticsearch就如同一个普通的数据仓库数据源，它可以完美无缝的与分析模块进行协同工作。

### 方案思路与架构{#solution-architecture}

SuccBI产品提供的解决方案架构如下：

![方案架构](./images/2020-10-20-09-49-01.png)

SuccBI在产品层集成Elasticsearch，使得数据的存储更加灵活。来源系统中结构化数据部分在建模后存储在Vertica、Oracle等关系型数据库中，而非结构化数据部分，如文档、邮件、日志则可以采集、加工存储在[Elasticsearch模型](https://docs.succapp.com/v5/data-gov/elasticsearch-model)中（通常也是先归集存储在数据仓库模型中，通过同步机制将数据同步到Elasticsearch，详见[Elasticsearch模型](https://docs.succapp.com/v5/data-gov/elasticsearch-model)）。

<!-- 这样，同一个模型的数据分别在数据仓库和ES全文检索库进行了存储。查询分析时只需要对模型选择是否[启用全文检索](/dash/datasource#高级)，即可自由切换数据查询引擎。启用全文检索后，模型的查询任务将在ES中运行并返回结果。 -->

这样，只需要在应用时根据需要选择使用[Elasticsearch模型](https://docs.succapp.com/v5/data-gov/elasticsearch-model)进行检索即可，使用Elasticsearch模型时，系统的查询将在Elasticsearch引擎中运行并返回结果。

### 解决方案优势{#solution-advantages}

在SuccBI产品层面使用上面的方案架构集成Elasticsearch具有如下优势：

1. SuccBI可立即获得Elasticsearch搜索引擎的超强检索能力，在海量数据检索场景下，充分利用Elasticsearch集群的高扩展性、高可用性、高性能为你提供稳定可靠的检索服务。
2. SuccBI集成Elasticsearch搜索引擎，屏蔽了技术上的复杂实现，对使用者完全透明，简单易用，无需SQL技能、无需Elasticsearch原理知识、无需掌握Elasticsearch的REST API、零编码，让业务人员能更好的聚焦于业务信息。

<!--
### 非结构化数据的检索方法
非结构数据的搜索一般有两种办法：  
1. 顺序扫描法（Serial Scanning）  
对于顺序扫描法，要查找文件内容中包含某一个字符串的文件时，需要逐个文档查询，对于每一个文档，需要从头查找到尾，如果查找过程中此文档包含了要查找的字符串，则该文档为需要的目标文档，接着继续查询下一个文档，直到扫描完所有的文件。如windows自带的文件搜索、linux的grep命令均是使用的顺序扫描法。对于小数据量的文件，这种方法最直接方便，但是对于大数据量的文件，顺序扫描法查找效率非常低。  
2. 全文检索（Full-text Search）  
将非结构化数据中的一部分信息提取出来，重新组织，使其变得有一定结构，然后对这些有一定结构的数据进行搜索，从而达到搜索相对较快的目的。这部分从非结构化数据中提取出的然后重新组织的信息，我们称之索引。例如，汉语字典的拼音表和部首检字表就相当于字典的索引，对每一个字的解释是非结构化的，如果字典没有音节表和部首检字表，在茫茫辞海中找一个字只能顺序扫描。然而字的某些信息可以提取出来进行结构化处理，比如读音，分声母和韵母，分别只有几种可以一一列举，于是将读音拿出来按一定的顺序排列，每一项读音都指向此字的详细解释的页数。我们搜索时按结构化的拼音搜到读音，然后按其指向的页数，便可找到目标非结构化数据，即对字的解释。这种对非结构化数据检索的方式就是全文检索。  

### 相关性排序
传统数据库通过SQL查询的结果只能指定按照表中已存在的某个字段进行排序，在未指定排序字段时，通常是按照数据的物理存储顺序返回的。而全文检索的结果是按照与查询关键词的相关性返回的，相关性越高返回越靠前。

-->

<!-- 
## 如何实现全文检索
应用系统一般通过使用全文检索搜索引擎来实现全文检索功能，目前主流的全文检索引擎是`Lucene`、`Solr`、`Elasticsearch`。
### Lucene
Lucene是一个Java编写的开放源代码的全文检索引擎工具包，但它不是一个完整的全文检索引擎，而是一个全文检索引擎的架构，提供了完整的查询引擎和索引引擎，部分文本分析引擎（英文与德文两种西方语言）。
### Solr
Apache Solr是一个基于名为Lucene的Java库构建的开源搜索平台。它以用户友好的方式提供Apache Lucene的搜索功能。作为一个行业参与者近十年，它是一个成熟的产品，拥有强大而广泛的用户社区。它提供分布式索引，复制，负载平衡查询以及自动故障转移和恢复。如果它被正确部署然后管理得好，它就能够成为一个高度可靠，可扩展且容错的搜索引擎
### Elasticsearch
Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎，具有HTTP Web接口和无模式JSON文档。Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索，具有接近实时的搜索，并支持多租户。

## SuccBI如何支持全文检索
### 搜索引擎的选择
SuccBI是企业级产品，应用场景中往往有海量的数据，业务需求复杂而多变，随着业务的增长会有迁移或扩容的需求，同时海量数据的检索过程不是单纯的搜索，会伴随一些统计分析。  

由于Lucene的复杂性，一般很少会考虑它作为搜索的第一选择。对于Solr和Elasticsearch，二者均是成熟的产品，我们最后选择了Elasticsearch作为SuccBI的全文检索引擎，原因如下：    
* Elasticsearch建立在更现代的原则上，更容易处理大型索引
* 除了搜索文本之外，Elasticsearch还可以来处理一些分析查询，与SuccBI产品功能更加契合
* Elasticsearch是分布式搜索引擎，具备良好的伸缩性，非常容易应对企业级的迁移或扩容的需求
* Elasticsearch具有非常易用的REST API，方便应用程序集成
* Elasticsearch管理运维比较简单，拥有配套的可视化管理工具

### 产品集成思路
应对海量数据的全文检索，SuccBI产品提供的解决方案架构如下：    

集成思路：    
1. 通过数据管理提供的丰富的数据连接器将各类数据，包括非结构化的文本数据，连接到系统中
2. 数据加工对数据进行加工清洗并存储到数据仓库
3. 在数据仓库中按需将模型同步到Elasticsearch全文检索引擎。详细的ES同步管理，点击[ES检索](/data-gov/es-search)查看。
4. 上层应用（搜索、统计分析等）根据需要可自由选择模型数据源。选择[启用全文检索引擎]()，即可获取Elastisearch强大的全文检索能力

### 产品集成优势
SuccBI集成Elasticsearch全文检索引擎，，屏蔽了技术上的复杂实现，对使用者完全透明，简单易用，无需SQL技能、无需Elasticsearch原理知识、无需掌握Elasticsearch的REST API、零编码，让业务人员能更好的聚焦于业务信息。 -->
