MongoDB 全文索引

  • 全文索引

    从2.4版开始,MongoDB开始支持文本索引来搜索内部字符串内容。该全文索引通过降低所产生停止的话就像使用词干技术,以寻找在字符串字段中指定词语。目前,MongoDB的支持大约15种语言。
    语言名称 ISO 639-1(两个字母代码)
    danish da
    dutch nl
    english en
    finnish fi
    french fr
    german de
    hungarian hu
    italian it
    norwegian nb
    portuguese pt
    romanian ro
    russian ru
    spanish es
    swedish sv
    turkish tr
  • 启用全文索引

    最初,全文索引是一项实验性功能,但是从2.6版开始,默认情况下启用该配置。
    创建文本索引
    考虑posts集合下的以下文档,其中包含帖子文本及其标签-
    
    db.posts.insert([{"post_text": "enjoy the mongodb articles on jc2182", "tags": ["mongodb", "jc2182"]},{"post_text" :"writing tutorials on mongodb","tags" : [ "mongodb", "tutorials" ]}])
    
    我们将在post_text字段上创建一个全文索引,以便我们可以在帖子的文本中进行搜索-
    
    db.posts.createIndex({post_text:"text"})
    {
      "createdCollectionAutomatically" : false,
      "numIndexesBefore" : 1,
      "numIndexesAfter" : 2,
      "ok" : 1
    }
    
  • 使用全文索引

    现在,我们在post_text字段上创建了全文索引,我们将搜索所有文本中带有词 jc2182 的帖子。
    
    db.posts.find({$text:{$search:"jc2182"}}).pretty()
    {
      "_id" : ObjectId("5f4f366d5406e4349a0cd253"),
      "post_text" : "enjoy the mongodb articles on jc2182",
      "tags" : [
        "mongodb",
        "jc2182"
      ]
    }
    
  • 删除全文索引

    要删除现有的文本索引,请首先使用以下查询找到索引的名称-
    
    db.posts.getIndexes()
    [
      {
        "v" : 2,
        "key" : {
          "_id" : 1
        },
        "name" : "_id_"
      },
      {
        "v" : 2,
        "key" : {
          "_fts" : "text",
          "_ftsx" : 1
        },
        "name" : "post_text_text",
        "weights" : {
          "post_text" : 1
        },
        "default_language" : "english",
        "language_override" : "language",
        "textIndexVersion" : 3
      }
    ]
    
    从上面的查询中获取索引的名称后,运行以下命令。在这里,post_text_text是索引的名称。
    
    > db.posts.dropIndex("post_text_text")
    { "nIndexesWas" : 2, "ok" : 1 }