mongoDB v2.4 使用全文索引

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);


你可能感兴趣的:(mongoDB v2.4 使用全文索引)