2013-06-03 9 views
31

私はアプリケーションにフルテキスト機能を提供するために使用している配列 "キー"にインデックスを持っています。MongoDBテキスト検索と複数の検索ワード

リリース2.4.3では、「テキスト」インデックスタイプを使用したいと思います。私は配列 "キー"の "テキスト"インデックスの型を保証し、それは私の古いキーワードのフルテキストメソッドよりも速く、スーパー高速で動作するようです。

問題は、私のアプリはフィールドが包括的(AND)であることを前提としています。デフォルトでは、テキスト検索によって自分のパラメータがORされます。

誰もがテキスト検索を包括的に実行する方法を知っていますか?例えば

db.supplies.runCommand("text", {search:"printer ink"}) 

はなく、プリンタまたはインクのいずれかでのすべての結果を、プリンタ及びインクの両方を用いた結果を返すべきです。

+5

私は実際には語幹を殺すことのない解決策に感謝します。 – Mitja

+2

単語をステミングするソリューションを見つけることができますか? – Zhomart

答えて

49

に試してみる:また

db.supplies.runCommand("text", {search:"\"printer\" \"ink\""}) 

は、ここdocsからの引用です:

検索文字列が語句が含まれている場合、検索は検索のAND を持つ他の用語を行い、文字列;例えば"¥"ツインクルの検索 ツインクルの "小さな星"は "ツインクルツインクル"と( "小さな"または "スター")を検索します。

希望するものがあります。

+2

あなた。岩。卿ありがとうございました。 – kmehta

+8

これは、単語のようなテキストインデックスのクールな機能を、ゴミ箱にまっすぐ投げることに注意してください。テキストが である場合、これはいくつかのクールなテストエントリです 、 '{$ search:" entry "}"で見つけられますが、 '{$ search:" \ "entry \" "}ではありません。 – Mitja

+0

@Mitja語幹を失うことなくこれを行う方法はありますか? – Rohmer

2

あなたは、二重引用符で各単語をラップすることができます。ユーザーは、これは動作しません引用符で囲まれた文字列を入力すると欠点があり

let keywords = ctx.params.query.split(/\s+/).map(kw => `"${kw}"`).join(' '); 
match.$text = { $search: keywords, $caseSensitive: false }; 

。最初に引用符で囲まれた文字列を解析する必要があります。

関連する問題