2012-03-29 1 views
3

私はmongo db postsコレクションに対してユーザーが投稿のタイトルを入力し始めることができるオートコンプリートサービスを作成しています。そのキーワードを含むすべての投稿をタイトルに返し、 'total'というフィールドでソートします。mongoで自動補完キーワードクエリを最適化する方法はありますか?

検索するタイトルフィールドの小文字の「lower」というフィールドがあり、そのフィールドにインデックスが設定されています。私はキーワードマッチを探しているので、最初だけではなく、タイトルのどこにでも出現する単語のlowerCaseTitleに対する正規表現検索を行っています。

私は実行計画を見て、すべてのアイテムをスキャンしたように見えます(完全な投稿コレクションには10061アイテムあります)。私は "lower_1"インデックスと "total_-1"インデックスの両方のヒントを試してみましたが、同様のように見えますが、クエリに制限数50を設定すると、最適化するためにできることはありますか?この種のフルテキスト検索では、頭の上から単純なことは考えられません。

"cursor" : "BtreeCursor lower_1", 
    "nscanned" : 10061, 
    "nscannedObjects" : 2, 
    "n" : 2, 
    "scanAndOrder" : true, 
    "millis" : 154, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "lower" : [ 
      [ 
       "", 
       { 

       } 
      ] 
     ] 
    } 

答えて

6

私だけではなく始まりで、どこにでもタイトルに出現する単語のためのlowerCaseTitleに対する正規表現検索をしています。 documentationから

/^prefix/,のような単純な接頭クエリー(とも呼ばれる根ざした正規表現)のために

インデックスを使用するデータベース際に非常に使用するほとんどのSQLデータベースのような(利用可能かつ適切なLIKE 'prefix%'式のインデックス)。これは、フラグにi(大文字小文字の区別なし)がない場合にのみ有効です。言い換えれば

、いいえ、MongoDBは、高速な方法で検索する部分文字列をサポートしていません。

しかし、あなたが与えられた文字列で始まる単語をサポートするために、次の操作を行うことができます。TitleSearchがインデックスと根付いた正規表現を使用して、

BlogPost { 
    Title : "This is furiously interesting post" 
    TitleSearch : [ "this", "is", "furiously", "interesting", "post" ] 
} 

さて、'inter'の検索は'furious'のためにも、サンプルを返しますただし、'eresting'では該当しません。

+0

私は複数の単語の検索で一致するように&&マッチを行うと思います...正確な一致を最初に表示する方法の提案はありますか? 「これは激しく」という言い方をする前に、「激しくこれがある」とか「これは激しいのですか? – MonkeyBonkey

+0

私はそうは思わない。より高い忠実度が必要な場合は、ステミング、ファセット検索、結果ランキング、さらに多くの検索関連機能をサポートするSolRのような検索専用ソリューションを使用することが最善の方法だと思います。 – mnemosyn

関連する問題