mongodb 全文检索
MongoDB 全文检索
全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
这个过程类似于通过字典中的检索字表查字的过程。
MongoDB 在 2.6 版本以后是默认开启全文检索的,目前我用的版本是3.2.7,但是还不支持中文检索,默认支持的是英文。
假设 school集合中有以下数据:
{ "_id" : 1, "zipcode" : "63109", "students" : { "comments" : "python Robot abdc", "body" : "Humans suck" } }
{ "_id" : 2, "zipcode" : "63110", "students" : { "comments" : "python abc", "body" : "Robot leader to minions" } }
{ "_id" : 3, "zipcode" : "63109", "students" : { "comments" : "python abc", "body" : "Human leader to minions" } }
{ "_id" : 4, "zipcode" : "63109", "students" : { "comments" : "python abc", "body" : "Humans suck Robot leader to minions" } }
{ "_id" : 5, "zipcode" : "63109", "students" : { "comments" : "python abc", "body" : "Humans Robot leader to minions suck" } }
{ "_id" : 7, "zipcode" : "63109", "students" : { "comments" : "python abc", "body" : "Humans suck Robot leader to minions" } }
{ "_id" : 8, "zipcode" : "63109", "students" : { "comments" : "python abc", "body" : "Humans Robot leader to minions suck" } }
1、建立全文索引
现在我们对students字段的body子项建立全文索引
db.school.ensureIndex({'students.body' : 'text'}) 如果创建成功,出现以下信息:

2、 查询body中包含Humans的记录:
db.school.find({$text:{$search: 'Humans'}}) 结果如下:

3、查询body中包含suck的记录:
db.school.find({$text:{$search: 'suck'}}) 结果如下:

4、查询body中包含leader的记录:
db.school.find({$text:{$search: 'leader'}}) 结果如下:

取反
通过在搜索单词前加上减号'-',可以在搜索的时候,排除包含该单词的记录
5、查询body中包含Robot,但不包含Humans的记录,不包含的单词前面加 ‘-’:
db.school.find({$text:{$search: 'Robot -Humans'}}) 结果如下:

6、并列查询 用\"来实现并列查询
查询comments中包含noSql,并且body包含Humans的记录,单词前面加\"
db.school.find({$text:{$search: '\"noSql \"leader'}})

6、查看索引:
db.school.getIndexes()

可以看到,我们刚才建立的全文索引名称为‘students.body_text’
一个集合只能创建一个全文索引,每次查询只能指定一个$text查询,
我们再建立个索引看看,现在我们对students字段的comments 子项建立全文索引, 是否还让建立
db.school.ensureIndex({'students.comments' : 'text'})

建立失败,原因是已经存在一个全文索引了。
7、删除索引
db.school.dropIndex('students.body_text')
删除成功

8、现在我们对students字段的comments 和body两个子项建立全文索引
db.school.ensureIndex({'students.comments' : 'text','students.body' : 'text'})
创建成功

9、查询comments中包含python的记录:
db.school.find({$text:{$search: 'python'}})

10、查询body中包含suck的记录:
db.school.find({$text:{$search: 'suck'}})

11、查询comments中包mongodb 而body中不包含suck的记录,不包含前加 ‘-’
db.school.find({$text:{$search: 'mongodb -suck'}})

词组查询
通过用引号包含由多个单词组成的词组(“suck test”),就可以实现词组搜索
db.school.find({$text:{$search: 'test suck'}})

从结果来看,实际上是包含了test和suck的合集,test和suck 在查询条件中是或的关系,而不是与的关系。
全文索引对单个字段建立全文索引,还是对多个字段建立全文索引,查询操作语法是一样的。
mongodb 全文检索的更多相关文章
- MongoDB全文检索
1. 全文检索概念: 全文检索是对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式. (暂时不支持中文) ...
- mongodb 初学 目录
mongodb 初学 索引 啦啦啦 MongoDB 教程 NoSQL 简介 MongoDB 简介 Windows 平台安装 MongoDB Linux平台安装MongoDB mongodb 在 Ubu ...
- MongoDB 高级教程
MongoDB 关系 MongoDB 的关系表示多个文档之间在逻辑上的相互联系. 文档间可以通过嵌入和引用来建立联系. MongoDB 中的关系可以是: 1:1 (1对1) 1: N (1对多) N: ...
- MongoDB Map Reduce(转载)
MongoDB Map Reduce Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE). MongoDB提供的Map ...
- 关于Mongodb的其他知识
Mongodb支持的数据类型 数据类型 描述 String 字符串.存储数据常用的数据类型.在 MongoDB 中,UTF-8 编码的字符串才是合法的. Integer 整型数值.用于存储数值.根据你 ...
- (2018干货系列三)最新PHP学习路线整合
怎么学PHP PHP是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域. 菜鸟到大神,一步到位,正式开启干货模式: PHP初级开发工程师 ...
- MongoDB的全文检索(Text Search)功能
自己的项目中用到了mongodb,需要做一个搜索功能,刚开始不知道怎么搞,查了mongodb有个全文检索功能. 全文检索分为两步 第一,建立索引 db.stores.createIndex( { na ...
- 全文检索引擎Solr系列——整合MySQL、MongoDB
MySQL 拷贝mysql-connector-java-5.1.25-bin.jar到E:\solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib目录下面 ...
- 利用whoosh对mongoDB的中文文档建立全文检索
1.建立索引 #coding=utf-8 from __future__ import unicode_literals __author__ = 'zh' import sys,os from wh ...
随机推荐
- [转载]传智播客_SQL入门
原文地址:传智播客_SQL入门作者:happylonger SQL * 数据定义语言 DDL * 数据操作语言 DML * 查询和更新指令构成了 SQL 的 DML 部分: * SELECT - 从 ...
- TreeMap与TreeSet的实现
虽然TreeMap 是 Map 接口的常用实现类,而 TreeSet 是 Set 接口的常用实现类,但TreeSet底层是通过 TreeMap来实现的,因此二者的实现方式完全一样.而 TreeMap ...
- php json_encode转JSON 编码显示中文
对变量进行 JSON 编码显示中文 /**context":"/u2345/u43245/u2345 转成中文显示 * 对变量进行 JSON 编码[{"time" ...
- pat 1006 Sign In and Sign Out (25)
At the beginning of every day, the first person who signs in the computer room will unlock the door, ...
- HTTP层 —— 请求
1.访问请求实例 要通过依赖注入获取当前 HTTP 请求实例,需要在控制器的构造函数或方法中对 Illuminate\Http\Request 类进行类型提示,这样当前请求实例会被服务容器自动注入: ...
- HTML5吧!少年
一.为了能使IE9以下的IE浏览器也能支持html5的标签,所以首先得在文档头部用条件注释的方法引入那段著名的代码. 1 2 3 <!--[if lt IE 9]> <script ...
- .net LINQ and PLINQ
本文 学习自 微软官网文档 2016/12 LINQ 背景 以前写与DB 相关的代码, 程序员须要懂开发语言(C#, VB)和查询语言跟数据库交互. LINQ 的出现使应用程序形成基于集合 ...
- C. Sonya and Queries
http://codeforces.com/contest/714/problem/C 看到这题目,想想,肯定不能暴力啊,如果用map,如何快速找到满足要求的数目,然后,长度18,我想,这不是熟悉的t ...
- Linux操作系统是如何工作的?破解操作系统的奥秘
学号:SA12**6112 研究笔记: 1:计算机是怎么样工作的 2:用户态到内核态切换之奥秘解析 3:进程切换之奥秘解析 本博文主要是根据前3篇笔记来总结Linux内核的工作机制. 一:操作系统工作 ...
- MySQL 数据库增量数据恢复案例
MySQL 数据库增量数据恢复案例 一.场景概述 MySQL数据库每日零点自动全备 某天上午10点,小明莫名其妙地drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢 ...