web-dev-qa-db-ja.com

MongoDBテキスト検索および複数の検索語

アプリケーションにフルテキスト機能を提供するために使用している配列「キー」にインデックスがあります。

2.4.3のリリースでは、「テキスト」インデックスタイプを利用したいと思います。配列「キー」の「テキスト」インデックスタイプに保険をかけましたが、非常に高速に動作するようです(古いキーワードのフルテキスト方式よりも高速です)。

問題は、私のアプリはフィールドが包括的(AND)であると想定していることです。デフォルトでは、テキスト検索は私のパラメーターとORをとります。

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

例えば:

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

プリンターまたはインクのすべての結果ではなく、プリンターとインクの両方で結果を返す必要があります。

37
kmehta

試してみてください:

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

また、ここに docs からの引用があります:

検索文字列にフレーズが含まれる場合、検索は検索文字列内の他の用語とANDを実行します。例えば"\" twinkle twinkle\"little star"を検索すると、 "twinkle twinkle"および( "little"または "star")が検索されます。

お役に立てば幸いです。

66
alecxe

各Wordを二重引用符で囲むことができます。

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

ユーザーが引用符付き文字列を入力した場合、これは機能しません。最初に引用符で囲まれた文字列を解析する必要があります。

4
chovy

前に@alecxeが指摘したように、テキストインデックス列でAND検索を行うには、各検索ワードを二重引用符で囲む必要があります。以下は、要件に対応した簡単なワンライナーです。

db.supplies.runCommand("text", {search: "printer ink".split(" ").map(str => "\""+str+"\"").join(' ')})
0
Abhay Verma