mongodb full text search(fts:全文搜素)是在版本2.4新加的特性。在以前的版本,是通过精确匹配和正则表达式来查询,这效率是很低的。全文索引,能够从大量的文本中搜索出所需的内容,内置多国语言和分词方法。不支持宇宙第一语言—中文。全文索引会导致mongodb写入性能下降,因为所有字符串都要拆分,存储到不同地方。 
全文索引是一种技术,并大量的使用。如搜索引擎,站内搜索等等。常使用到的全文搜索有: 
lucene 
sphinx 
redis-search 
riak search 
不过,对中文的搜索不尽如人意。 
mongodb用的是开源的snowball分词器。参见http://snowball.tartarus.org/texts/stemmersoverview.html
mongodb 全文索引支持的语言有: 
danish 
dutch 
english 
finnish 
french 
german 
hungarian 
italian 
norwegian 
portuguese 
romanian 
russian 
spanish 
swedish 
turkish 
如果希望使用其他语言,需要在创建索引时指定要使用的语言。默认是支持英文的。 
>db.collection.ensureIndex({content:"text"},{default_language:"spanish"}) 
一、开启全文索引 
默认是关闭的。否则会报错"err" : "text search not enabled" 
可以在脚本中声明启用: 
> db.adminCommand({setParameter:1,textSearchEnabled:true}) 
{ "was" : true, "ok" : 1 } 
也修改配置启用:mongod --setParameter textSearchEnabled=true 
二、插入测试数据 
下面是插入一些《加州旅馆》这首二十世纪非常著名的流行音乐。

> db.ttlsa_com.insert({"song":"1. Hotel California", "lyrics": "On a dark desert highway, cool wind in my hair. Warm smell of colitas, rising up through the air."})
> db.ttlsa_com.insert({"song":"2. Hotel California", "lyrics": "Up ahead in the distance, I saw a shimmering light. My head grew heavy and my sight grew dim."})
> db.ttlsa_com.insert({"song":"3. Hotel California", "lyrics": "Such a lovely place, Such a lovely face."})
> db.ttlsa_com.insert({"song":"4. Hotel California", "lyrics": "Some dance to remember, some dance to forget."})
> db.ttlsa_com.insert({"song":"5. Hotel California", "lyrics": "Welcome to the Hotel California"})
> db.ttlsa_com.insert({"song":"hell world", "lyrics": "Welcome to beijing"}) 

> db.ttlsa_com.insert({"song":"加州旅馆", "lyrics": "Welcome to the Hotel California"}) 
三、创建全文索引 
> db.ttlsa_com.ensureIndex({"song":"text", "lyrics":"text"}) 
或者 
> db.ttlsa_com.ensureIndex({"$**": "text"}) 
$**表示在所有的字符串字段上创建一个全文索引。 
也可以指定权重 
> db.ttlsa_com.ensureIndex({"song":"text"},{"weights":{"song": 2, "$**": 3}}) 
四、查看索引信息 

>db.system.indexes.find().toArray()
[{
"v": 1,
"key": {
"_id": 1
},
"name": "_id_",
"ns": "test.ttlsa_com"
},
{
"v": 1,
"key": {
"_fts": "text",
"_ftsx": 1
},
"name": "song__lyrics_",
"ns": "test.ttlsa_com",
"weights": {
"lyrics": 1,
"song": 1
},
"default_language": "english",
"language_override": "language",
"textIndexVersion": 2
}] 

五、查询 
全文索引是通过 
db.collection.runCommand( "text", { search: <string>, 
filter: <document>, 
project: <document>, 
limit: <number>, 
language: <string> } ) 
来查询的,非通过find()命令来实现的。 也可以通过find查询,如:db.ttlsa_com.find({$text:{$search:"aa bb"}});
1.搜索一个词,文本命令是不区分大小写的

> db.ttlsa_com.runCommand("text",{search:"Welcome"})
{
"results" : [
{
"score" : 0.6666666666666666,
"obj" : {
"_id" : ObjectId("550a615dd8511e4dbcb8c77a"),
"song" : "5. Hotel California",
"lyrics" : "Welcome to the Hotel California"
}
},
{
"score" : 0.6666666666666666,
"obj" : {
"_id" : ObjectId("550a6163d8511e4dbcb8c77b"),
"song" : "加州旅馆",
"lyrics" : "Welcome to the Hotel California"
}
}
],
"stats" : {
"nscanned" : 2,
"nscannedObjects" : 2,
"n" : 2,
"timeMicros" : 1486,
"shards" : {
"shard_a" : {
"nscanned" : NumberLong(2),
"nscannedObjects" : NumberLong(2),
"n" : 2,
"timeMicros" : 917
}
}
},
"ok" : 1
} 

2.模糊搜索

> db.ttlsa_com.runCommand("text",{search:"Such lovely"})
{
"results" : [
{
"score" : 1.125,
"obj" : {
"_id" : ObjectId("550a6154d8511e4dbcb8c778"),
"song" : "3. Hotel California",
"lyrics" : "Such a lovely place, Such a lovely face."
}
}
],
"stats" : {
"nscanned" : 1,
"nscannedObjects" : 1,
"n" : 1,
"timeMicros" : 618,
"shards" : {
"shard_a" : {
"nscanned" : NumberLong(1),
"nscannedObjects" : NumberLong(1),
"n" : 1,
"timeMicros" : 272
}
}
},
"ok" : 1
} 

3.匹配短语

> db.ttlsa_com.runCommand("text",{search:"\"Some dance to remember\""})
{
"results" : [
{
"score" : 1.75,
"obj" : {
"_id" : ObjectId("550a6158d8511e4dbcb8c779"),
"song" : "4. Hotel California",
"lyrics" : "Some dance to remember, some dance to forget."
}
}
],
"stats" : {
"nscanned" : 2,
"nscannedObjects" : 1,
"n" : 1,
"timeMicros" : 743,
"shards" : {
"shard_a" : {
"nscanned" : NumberLong(2),
"nscannedObjects" : NumberLong(1),
"n" : 1,
"timeMicros" : 306
}
}
},
"ok" : 1
} 

4.匹配一些词但是不能包含指定的词

> db.ttlsa_com.runCommand("text",{search:"Welcome -California"})
{
"results" : [
{
"score" : 0.75,
"obj" : {
"_id" : ObjectId("550a687fd8511e4dbcb8c781"),
"song" : "hell world",
"lyrics" : "Welcome to beijing"
}
}
],
"stats" : {
"nscanned" : 4,
"nscannedObjects" : 4,
"n" : 1,
"timeMicros" : 743,
"shards" : {
"shard_a" : {
"nscanned" : NumberLong(4),
"nscannedObjects" : NumberLong(4),
"n" : 1,
"timeMicros" : 345
}
}
},
"ok" : 1
} 

5.限制结果集条目 
>db.ttlsa_com.runCommand("text",{search:"Welcome",limit: 1}) 
6.在结果集中指定返回的字段 
>db.ttlsa_com.runCommand("text",{search:"Welcome",project:{"song":1,"_id":0}}) 
7.带额外查询条件的搜索 
>db.ttlsa_com.runCommand("text",{search:"Welcome",filter: {"song":"hell world"}}) 
8.使用特定语言搜索文本 
>db.ttlsa_com.runCommand("text",{search:"Welcome",language:"spanish"}) 
9.分词效果不是很理想。如

>db.ttlsa_com.runCommand("text",{search:"the"})
{
"results" : [ ],
"stats" : {
"nscanned" : 0,
"nscannedObjects" : 0,
"n" : 0,
"timeMicros" : 432,
"shards" : {
"shard_a" : {
"nscanned" : NumberLong(0),
"nscannedObjects" : NumberLong(0),
"n" : 0,
"timeMicros" : 151
}
}
},
"ok" : 1
} 

就搜索不到的。 
mongodb是不支持中文搜索的。 全文索引可以通过相似度,来查询与条件更匹配的文章,如下:

>db.ttlsa_com.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}})
查询结果返回相似度分数。可以结合sort进行相似度排序。
>db.ttlsa_com.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}});
要用到复杂的搜索功能,还是用sphinx。 
sphinx内容可以参见:http://www.ttlsa.com/?s=sphinx
详细使用参考:http://blog.csdn.net/black_ox/article/details/21547651

转至:http://www.ttlsa.com/mongodb/mongodb-full-text-search-mongodb-ttlsa-tutorial-series/

MongoDB 索引之全文索引相关推荐

  1. MongoDB索引概念及使用详解

    索引,使用索引可快速访问数据库表中的特定信息.索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓名(name)列.如果要按姓查找特定职员,与必须搜索表中的所有行相比,索 ...

  2. MongoDB 索引(一)

    索引支持在MongoDB中高效执行查询.如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择那些匹配查询语句的文档.如果查询存在适当的索引,MongoDB可以使用该索引来限制它 ...

  3. MongoDB索引原理及实践

    背景 数据库的演进 随着计算机的发展,越来越多的数据需要被处理,数据库是为处理数据而产生.从概念上来说,数据库是指以一定的方式存储到一起,能为多个用户共享,具有更可能小的冗余,与应用程序彼此独立的数据 ...

  4. MongoDB 中文的全文索引

    MongoDB 从3.2 版本以后添加了对中文索引的支持:  官网链接:https://docs.mongodb.com/manual/reference/text-search-languages/ ...

  5. 关于Mongodb索引创建的一些体会

    2019独角兽企业重金招聘Python工程师标准>>> mongodb索引分类以及创建我就不多说了,如果想了解可以直接在百度上搜索,这里我说一下关于索引创建的个人想法. 1.优先给一 ...

  6. MongoDB 索引

    2019独角兽企业重金招聘Python工程师标准>>> 索引Indexes 索引常常用来大幅度的提升查询的性能. 考虑应用程序的查询种类是非常重要的事情,因此你就要定义相关的索引. ...

  7. MongoDB · 引擎特性 · MongoDB索引原理

    MongoDB · 引擎特性 · MongoDB索引原理 数据库内核月报 原文链接 http://mysql.taobao.org/monthly/2018/09/06/ 为什么需要索引? 当你抱怨M ...

  8. MongoDB索引实战技巧

    为什么80%的码农都做不了架构师?>>>    本文内容源自Kyle Banker 的 MongoDB In Action一书.主要描述了MongoDB索引相关的一些基础知识和使用技 ...

  9. MySQL索引介绍,普通索引,全文索引,空间索引,多列索引使用原则,建立索引常用的规则

    转自:https://blog.csdn.net/tomorrow_fine/article/details/78337735 1.MySQL在创建数据表的时候创建索引 在MySQL中创建表的时候,可 ...

最新文章

  1. Android- assent和raw的区别
  2. python学习-- for和if结合使用
  3. 学习几个“××在内存中占几份”的若干问题
  4. 看完这个你还不理解右值引用和移动构造 你就可以来咬我(下)
  5. centos6.5安装配置LDAP服务[转]
  6. 接口测试(java+testng+ant+jenkins)第三篇ant
  7. 一步步编写操作系统3 部署工作环境 3
  8. HDFS的Block size的默认大小
  9. 学习笔记:SSH端口转发的三种方式
  10. 文章同一位置引用多篇参考文献标注方法
  11. php除数不能为零,0为什么不能做除数(为什么0不能作为除数)
  12. Vue项目url中的BASE_URL解析
  13. 同步机制应遵循的准则
  14. 大唐长安人杜环在两河流域, 耶路撒冷和北非的行程
  15. dev c++播放音乐MP3
  16. JAVA 项目打包和部署一站式解决方案
  17. 网络安全笔记1——Internet协议的安全性
  18. H3C安全技术高级工程师H3CSE Security GB0-551
  19. TMS320F280025的时钟
  20. 工业大数据助力中国制造 帮助企业降本增收

热门文章

  1. 游戏编程入门(10):播放数字声音效果
  2. PHP实现图片上添加文字(证书生成)
  3. Cockos Reaper for Mac(专业数字音频制作软件)
  4. 达梦数据库 图形化界面安装详细教程
  5. docker 基础工作原理(一)
  6. 全球首个TD-LTE演示网今日上海正式开通,金山瑞星同日发布“云安全”产品(每日关注:20100415)...
  7. 我发过很多脾气,从没落得半点好处
  8. 基于反演法的悬架控制
  9. java xmpp实例,XMPP协议学习笔记一
  10. 如何使用西门子存储卡清除博途S7-1200的密码