1

ドキュメントのインデックスを作成している特定の ID フィールドでは、次のようになります: 1234 45676

2 つの数値グループのそれぞれに対して、それらが文字列であるかのように全文検索を実行できるようにしたいと考えています。数値グループを引用符で囲んでエスケープします。これにより、mongo のドキュメントによると、文字列全体が確実に検索されるようになります。

たとえば、インデックス付きフィールドに「blue」という単語が含まれている場合、「blue」という単語のみが検索されます。「b」で検索してもヒットしません。(当面は非語幹検索を使用しています)。

しかし、それは数値グループの結果ではありません。数値グループを引用符 ("45676") でエスケープしても、数値グループはワイルドカード検索の対象になります。この例では、「4」で検索すると、「45676」がヒットします。

「45676」が検索された場合にのみヒットする文字列として「45676」が扱われるようにするにはどうすればよいでしょうか?

すべての提案や視点を歓迎します! 前もって感謝します。

4

1 に答える 1

1

数字のグループを一意の単語として検索するには、2 つの解決策があります。

1) $text 演算子とテキスト インデックスを使用する

2) $regexp 演算子または正規表現を使用します。

設定:

db = connect("test"); // same as `use test;`
db.a.drop();
db.a.insert([
    { _id: 1, txt : "Log 1: Page 23 1234 45676" },
    { _id: 2, txt : "Log 2: Page 45 0000 00000" },
    { _id: 3, txt : "Log 3: Page 59 1337 11111" }
]);

1. $text 演算子の使用例

検索可能なフィールドにインデックスを付ける

db.a.ensureIndex({ txt : "text" });

$text 演算子を使用したクエリ

db.a.find({ $text : { $search : "45" } });

出力

{ _id: 2, txt : "Log 2: Page 45 0000 00000" }

が含まれていても、出力は _id 1 のドキュメントを返さないことに注意してください45676

2. 正規表現を使った例

正規表現の場合\b、文字列内で数値が一致しないように、数値を単語境界でラップする必要があります。

4例:単語境界なしで検索する。

/4/.test("4") == true
/4/.test("1234") == true

4単語境界で検索しています。

/\b4\b/.test("4") == true
/\b4\b/.test("1234") == false

正規表現を使用して 45 を検索します

db.a.find({ txt : /\b45\b/ });

出力

{ _id: 2, txt : "Log 2: Page 45 0000 00000" }

次の関数を使用して、ユーザーの入力から正規表現を作成できます。

function escapeRegExp(str) {
  return String(str).replace(/[[\]/{}()*+?.\^$|-]/g, "\\$&");
}
function wordToRegExp( query ){
  return new RegExp( "\\b" + escapeRegExp( query ) + "\\b" );
}
var queryForWord = wordToRegExp( 45 );
// queryForWord would be sent from your server side, not created in mongo shell.

db.a.find({ txt : queryForWord });

より詳しい情報:

于 2015-01-28T03:42:56.717 に答える