---
title: 3.1、全文索引
date: 2017-12-16 18:53:10
tags: 
  - 数据库
  - MongoDB
  - 索引
categories: 
  - MongoDB
---

`全文索引`是目前搜索引擎的关键技术 
对于在大量的大文本当中搜索一个关键词 
如果没有全文索引 , 只能是使用正则匹配进行遍历 
效率十分低下
<!-- more -->
所以在这样的矛盾之下出现了全文索引技术 , 也称为`倒排文档技术`

无论是对于庞大的互联网数据的爬取还是应用的站内搜索功能 , 全文索引都是能极大提高性能的一种技术

在mongoDB当中 , 全文索引是对字符串或字符串数组来创建全文索引

#### 创建全文索引
```
db.集合名称.ensureIndex({key_1:"text"...) 
```
与普通的单键索引或者符合索引有区别的是 
json当中的值是一个 **固定字符串”text”** , 而不是整数 
上述写法是对某个或者某几个字段创建全文索引 
但是取决于mongoDB存储数据的特点 
每个集合当中的数据可以有完全不同的结构 
所以通常用如下得到方式对该集合当中所有的字符串或字符串数组字段添加全文索引 
```
db.集合名称.ensureIndex({"$**":"text"})
```
> 每个集合当中只能创建一个全文索引

#### 使用全文索引进行查询
+ `find({$text:{$search:"aa"}})` - 普通单关键字匹配
+ `find({$text:{$search:"aa bb"}})` - 多关键字匹配 ( 不同关键字之间是或的逻辑关系 )
+ `find({$text:{$search:"\"aa\" \"bb\""}})` - 多关键字匹配 ( 不同关键字之间是与的逻辑关系 )
+ `find({$text:{$search:"aa bb -cc"}})` - 添加屏蔽的关键字

> **注意** : 上述的全文索引的搜索方式是根据英文单词进行匹配的 , 也就是按照空白( 包括空格 换行 制表符等 )分割的字符串 , 如果关键词是单词的一部分 , 或者是中文内容 , 这种方式就无法检索到需要的数据

#### 相似度查询
`$meta`操作符 { score : {$meta : “textScore”} } 
( 注意textScore是固定的操作符标识 , 代表相似度值 ) 
写在查询条件后面可以返回结果的相似度

例如 在一个添加了全文索引的集合当中有下列数据
![full text search](/images/MongoDB/full_text_search1.png)

执行下面的查询 
```
db.集合名称.find({$text:{$search:"aa"}},{score:{$meta:"textScore"}}) 
```
结果如下
![full text search](/images/MongoDB/full_text_search2.png)

> 目前新版的mongoDB执行全文索引的查询后的结果默认就是按照相似度降序排列的

添加全文索引会导致集合的写入性能下降 , 因为所有的字符串都要拆分 , 存储到不同的地方