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 全文检索的更多相关文章

  1. MongoDB全文检索

    1. 全文检索概念: 全文检索是对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式.  (暂时不支持中文) ...

  2. mongodb 初学 目录

    mongodb 初学 索引 啦啦啦 MongoDB 教程 NoSQL 简介 MongoDB 简介 Windows 平台安装 MongoDB Linux平台安装MongoDB mongodb 在 Ubu ...

  3. MongoDB 高级教程

    MongoDB 关系 MongoDB 的关系表示多个文档之间在逻辑上的相互联系. 文档间可以通过嵌入和引用来建立联系. MongoDB 中的关系可以是: 1:1 (1对1) 1: N (1对多) N: ...

  4. MongoDB Map Reduce(转载)

    MongoDB Map Reduce Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE). MongoDB提供的Map ...

  5. 关于Mongodb的其他知识

    Mongodb支持的数据类型 数据类型 描述 String 字符串.存储数据常用的数据类型.在 MongoDB 中,UTF-8 编码的字符串才是合法的. Integer 整型数值.用于存储数值.根据你 ...

  6. (2018干货系列三)最新PHP学习路线整合

    怎么学PHP PHP是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域. 菜鸟到大神,一步到位,正式开启干货模式: PHP初级开发工程师 ...

  7. MongoDB的全文检索(Text Search)功能

    自己的项目中用到了mongodb,需要做一个搜索功能,刚开始不知道怎么搞,查了mongodb有个全文检索功能. 全文检索分为两步 第一,建立索引 db.stores.createIndex( { na ...

  8. 全文检索引擎Solr系列——整合MySQL、MongoDB

    MySQL 拷贝mysql-connector-java-5.1.25-bin.jar到E:\solr-4.8.0\example\solr-webapp\webapp\WEB-INF\lib目录下面 ...

  9. 利用whoosh对mongoDB的中文文档建立全文检索

    1.建立索引 #coding=utf-8 from __future__ import unicode_literals __author__ = 'zh' import sys,os from wh ...

随机推荐

  1. java基础学习总结三(jdk7新特性、变量(局部变量和成员变量)、常量以及运算符)

    一:jdk7新特性 可以表示二进制数值,以0b开头,中间可以使用下划线_分隔符.如下: @Test /** * 测试jdk新特性 */ public void testJdk7(){ int a=0b ...

  2. LVM的添加与删除

    #############################创建 fdisk -l查看分区情况 fdisk /dev/xvdb pvcreate /dev/xvdb1 vgextend VolGroup ...

  3. [转]Spring数据库读写分离

    数据库的读写分离简单的说是把对数据库的读和写操作分开对应不同的数据库服务器,这样能有效地减轻数据库压力,也能减轻io压力. 主(master)数据库提供写操作,从(slave)数据库提供读操作,其实在 ...

  4. [MSDN] 使用 SharePoint 2013 中的 JavaScript 库代码完成基本操作

    MSDN:http://msdn.microsoft.com/zh-cn/library/jj163201.aspx 了解如何编写代码以在 SharePoint 2013 中使用 JavaScript ...

  5. Android开发之闹钟

    闹钟开发: 1.需要时间选择器TimePicker 2.需要Calendar类对日期时间进行操作 3.需要AlarmManager//闹钟管理实质是一个全局定时器, 是Android中常用的一种系统级 ...

  6. c#局域网文件搬移

    /// kongxiang--2013.7.23 /// using System;using System.Collections.Generic;using System.Linq;using S ...

  7. LVS概述

    LVS原理概述: lvs是一个开源软件,是Linux virtual server的简写,即linux虚拟服务器,是一个虚拟的服务器集群系统,lvs集群采用ip负载均衡技术和基于内容的请求分发技术.将 ...

  8. DEVMODE 结构体

    typedef struct _devicemode { TCHAR dmDeviceName[CCHDEVICENAME]; //打印机(显示设备)名称 WORD dmSpecVersion; WO ...

  9. ### core文件使用

    在Linux下程序崩溃,特别是在循环中产生Segment Fault错误时,根本不知道程序在哪出错,这时,利用core文件可以快速找到出错的问题所在. #@author: gr #@date: 201 ...

  10. 02两栈共享空间_DoubleStack--(栈与队列)

    #include "stdio.h" #include "stdlib.h" #include "io.h" #include " ...