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
如果指定value为"none", 那么搜索中不会设置分词,文本搜索不会阻止和标记搜索条件.
还有多语言查询,是指向到了一个引用,然后用一个语言覆盖查询. 这点有兴趣的可以去官方查看. 这里不复述.
长名称的全文索引
默认的索引名由各个索引字段和_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);