Mongoでの全文検索

based on v17 (2010-10-02更新) - オリジナル

紹介

Mongoは、テキスト検索やタグ付けと言った便利な機能を提供します。

multikeys (配列内の値に対するインデックス)

Mongoのmultikeys機能は、配列の値に自動的にインデックスを張ることができます。この機能を使った良い例としてタグ付け(tagging)があります。アーティクルのためのオブジェクトがあり、カテゴリによってtag付けされていると仮定してください。

obj = { 
name: "Apollo", 
text: "Some text about Apollo moon landings", 
tags: [ "moon", "apollo", "spaceflight" ] 
} 

そして、このオブジェクトは、 db.articles に保存されています。 次のコマンドは、

db.articles.ensureIndex( { tags: 1 } );

ドキュメントの中のtags全部にインデックスを作成します。そのドキュメントのためには、"mmon", "apollo", "spaceflight"のインデックスを作成します。

いつものように、クエリーをすることができます。

> print(db.articles.findOne( { tags: "apollo" } ).name); 
Apollo 

データベースは、配列のそれぞれのエントリに対してインデックスを作成します。一つの配列にたくさんの要素(数百、数千)をinsertするのはとてもコストの高い処理になることに注意してください。(上記の例では、その他の実装も同じようなコストになりますが)

テキスト検索

multikeysを使い、基本的な全部検索を実装するのは、かなり簡単です。推奨する方法は、すべてのキーワードを一つのフィールドに入れることです。たとえば、

 
{ title : "this is fun" , 
_keywords : [ "this" , "is" , "fun" ] 
} 

コード側で、保存する前に上記のタイトルを分割します。   このコード(MongoDBの一部ではありません)は、stemmingなどもすることに注意してください。(Mongoのコミュニティの誰かが、これをするための標準的なモジュールを書くかも。。)

全文検索エンジンとの比較

このようにMongoDBは、検索機能を簡単にするおもしろい機能を持っていますが、上記の通り、これは専用の全文検索エンジンではありません。

専用のエンジンは以下のようなこともできます。

  • 組み込みのstemming機能
  • クエリにマッチする語句のランキング (MongoDBでもできるかもしれませんが、ユーザがそういうコードを書く必要があります)
  • 一括でのインデックスの構築 (bulk index building)

一括でのインデックスの構築は、インデックスの作成を速くしますが、リアルタイムではないという欠点もあります。MongoDBは、リアルタイムでの検索に特に向いています。伝統的なツールは、このような使い方はあまり得意ではありません。

現実世界での例

The Business Insider MongoDBをblog検索機能で使っています。

Mark Watson's opinions on Java, Ruby, Lisp, AI, and the Semantic Web - rubyでの構築方法の例です。


Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.

IF YOU HAVE A QUESTION, POST IT TO THE USER GROUP.

These pages are fine for comments, but for questions, your best bet will always be the MongoDB User Group.

blog comments powered by Disqus