mongoDB2.4新增的全文索引的支持:现在把官方教程翻译过来:
开启全文索引
可以在脚本中声明启用:
db.adminCommand( { setParameter : 1, textSearchEnabled : true } )
修改配置启用:
mongod --setParameter textSearchEnabled=true
创建一个全文索引
为特定字段加索引:
db.collection.ensureIndex( { subject: "text", content: "text" })
为所有字段加索引:
db.collection.ensureIndex( { "$**": "text" },{ name: "TextIndex" })
在文本里查询内容
搜索一个词:
db.quotes.runCommand( "text", { search: "TOMORROW" } )因为文本命令是不区分大小写的,文本搜索将引用集合匹配以下文档:
{ "_id" : ObjectId("50ecef5f8abea0fda30ceab3"), "quote" : "tomorrow, and tomorrow, and tomorrow, creeps in this petty pace", "related_quotes" : [ "is this a dagger which I see before me", "the handle toward my hand?" ], "src" : { "title" : "Macbeth", "from" : "Act V, Scene V" }, "speaker" : "macbeth" }
db.quotes.runCommand( "text", { search: "tomorrow largo" } )
{ "_id" : ObjectId("50ecef5f8abea0fda30ceab3"), "quote" : "tomorrow, and tomorrow, and tomorrow, creeps in this petty pace", "related_quotes" : [ "is this a dagger which I see before me", "the handle toward my hand?" ], "src" : { "title" : "Macbeth", "from" : "Act V, Scene V" }, "speaker" : "macbeth" } { "_id" : ObjectId("50ecf0cd8abea0fda30ceab4"), "quote" : "Es tan corto el amor y es tan largo el olvido.", "related_quotes" : [ "Como para acercarla mi mirada la busca.", "Mi corazón la busca, y ella no está conmigo." ], "speaker" : "Pablo Neruda", "src" : { "title" : "Veinte poemas de amor y una canción desesperada", "from" : "Poema 20" } }
db.quotes.runCommand( "text", { search: "\"and tomorrow\"" } )下面是带有必有字符的短语
db.quotes.runCommand( "text", { search: "corto largo \"and tomorrow\"" } )
下面会匹配tomorrow, 但是不能含有petty
db.quotes.runCommand( "text" , { search: "tomorrow -petty" } )
db.quotes.runCommand( "text", { search: "tomorrow", limit: 2 } )
下面只有_id 和 src字段会被返回(不知道为什么会_id也返回了, 回去先了解一个Mongo的基础知识. )
db.quotes.runCommand( "text", { search: "tomorrow",project: { "src": 1 } } )设置为1 会返回, 0 不会返回.
带额外查询条件的搜索:
db.quotes.runCommand( "text", { search: "tomorrow", filter: { "speaker" : "macbeth" } } )
db.quotes.runCommand( "text", { search: "amor", language: "spanish" } )
为全文索引选择一种语言
指定默认的语言:
db.collection.ensureIndex( { content : "text" }, { default_language: "spanish" })
支持的语言有:
danish dutch english finnish french german hungarian italian norwegian portuguese romanian russian spanish swedish turkish
还有多语言查询,是指向到了一个引用,然后用一个语言覆盖查询. 这点有兴趣的可以去官方查看. 这里不复述.
长名称的全文索引
默认的索引名由各个索引字段和_text连接组成:如:
db.collection.ensureIndex( { content: "text", "users.comments": "text","users.profiles": "text"})索引名为:content_text_users.comments_text_users.profiles_text
可以这样指定名称:
db.collection.ensureIndex( { content: "text", "users.comments": "text", "users.profiles": "text" }, { name: "MyTextIndex" } )
控制查询结果与权重
给字段的索引权重默认为1, 要修改,可以这样设置:
db.blog.ensureIndex( { content: "text", keywords: "text", about: "text" }, { weights: { content: 10, keywords: 5, }, name: "TextIndex" } )
创建满足过滤组件的全文索引
附加标量字段索引, 指定一个提升的KEY:
db.quotes.ensureIndex( { comments: "text", cited: 1 } )使用filter参数:
db.quotes.runCommand( "text", { search: "tomorrow", filter: { cited: { $gt: 10 } } } )
-----------
下面是一个PHP执行mongo全文搜索的例子:
<?php $m = new MongoClient(); // connect $db = $collection = $m->foo; // get the database named "foo" $collection = $db->bar; // get the collection "bar" from database named "foo" $collection->ensureIndex( array( 'title' => 'text', 'desc' => 'text', ), array( 'name' => 'ExampleTextIndex', 'weights' => array( 'title' => 100, 'desc' => 30, ), 'timeout' => 60000000 ) ); $result = $db->command( array( 'text' => 'bar', //this is the name of the collection where we are searching 'search' => 'hotel', //the string to search 'limit' => 5, //the number of results, by default is 1000 'project' => Array( //the fields to retrieve from db 'title' => 1 ) ) ); print_r($result);