MongoDB 全文検索

全文検索は、各単語に対してインデックスを作成し、その単語が記事中に出現する回数と位置を示します。ユーザーがクエリを行うと、検索プログラムは事前に作成されたインデックスに基づいて検索を実行し、検索結果をユーザーに返す検索方式です。

このプロセスは、辞書の索引表を使って文字を調べる過程に似ています。

MongoDB はバージョン 2.4 から全文検索をサポートしており、現在は15言語の全文インデックスをサポートしています。

  • danish
  • dutch
  • english
  • finnish
  • french
  • german
  • hungarian
  • italian
  • norwegian
  • portuguese
  • romanian
  • russian
  • spanish
  • swedish
  • turkish

全文検索を有効にする

MongoDB はバージョン 2.6 以降、全文検索がデフォルトで有効になっています。それ以前のバージョンを使用している場合は、次のコードを使用して全文検索を有効にする必要があります:

>db.adminCommand({setParameter:true,textSearchEnabled:true})

または、次のコマンドを使用します:

mongod --setParameter textSearchEnabled=true

全文インデックスの作成

次の posts コレクションのドキュメントデータを考えます。記事の内容(post_text)とタグ(tags)が含まれています:

{
   "post_text": "enjoy the mongodb articles on サンプル",
   "tags": [
      "mongodb",
      "サンプル"
   ]
}

post_text フィールドに全文インデックスを作成すると、記事内のコンテンツを検索できます:

>db.posts.ensureIndex({post_text:"text"})

全文インデックスの使用

これで post_text に全文インデックスが作成されたので、記事内のキーワード サンプル を検索できます:

>db.posts.find({$text:{$search:"サンプル"}})

次のコマンドは、サンプル キーワードを含むドキュメントデータを返します:

{ 
   "_id" : ObjectId("53493d14d852429c10000002"), 
   "post_text" : "enjoy the mongodb articles on サンプル", 
   "tags" : [ "mongodb", "サンプル" ]
}

古いバージョンの MongoDB を使用している場合は、次のコマンドを使用できます:

>db.posts.runCommand("text",{search:"サンプル"})

全文インデックスを使用すると、検索効率を向上させることができます。


全文インデックスの削除

既存の全文インデックスを削除するには、find コマンドを使用してインデックス名を検索できます:

>db.posts.getIndexes()

上記のコマンドでインデックス名を取得します。この例ではインデックス名は post_text_text です。次のコマンドを実行してインデックスを削除します:

>db.posts.dropIndex("post_text_text")
その他の拡張