1. ホーム
  2. mongodb

[解決済み] MongoDB 全文検索と部分検索

2023-06-16 18:03:10

質問

エンベロープです。

  • MongoDB (3.2.0)とMongooseの組み合わせ

コレクションです。

  • ユーザー

テキストインデックス作成。

  BasicDBObject keys = new BasicDBObject();
  keys.put("name","text");

  BasicDBObject options = new BasicDBObject();
  options.put("name", "userTextSearch");
  options.put("unique", Boolean.FALSE);
  options.put("background", Boolean.TRUE);
  
  userCollection.createIndex(keys, options); // using MongoTemplate


ドキュメントです。

  • {"name":"LEONEL"}.

クエリです。

  • db.users.find( { "$text" : { "$search" : "LEONEL" } } ) => FOUND
  • db.users.find( { "$text" : { "$search" : "leonel" } } ) => FOUND (大文字小文字を区別する検索はfalseです)
  • db.users.find( { "$text" : { "$search" : "LEONÉL" } } ) => FOUND (diacriticSensitiveでの検索はfalseです)
  • db.users.find( { "$text" : { "$search" : "LEONE" } } ) => FOUND (部分検索)
  • db.users.find( { "$text" : { "$search" : "LEO" } } ) => NOT FOUND (部分検索)
  • db.users.find( { "$text" : { "$search" : "L" } } ) => NOT FOUND (部分検索)

クエリとして "LEO" または "L" を使用して、0 件の結果が得られるのはなぜか、何か心当たりはありますか?

テキストインデックス検索での正規表現は許可されていません。

db.getCollection('users')
     .find( { "$text" : { "$search" : "/LEO/i", 
                          "$caseSensitive": false, 
                          "$diacriticSensitive": false }} )
     .count() // 0 results

db.getCollection('users')
     .find( { "$text" : { "$search" : "LEO", 
                          "$caseSensitive": false, 
                          "$diacriticSensitive": false }} )
.count() // 0 results


MongoDB のドキュメントです。

どのように解決するのですか?

MongoDB 3.4 の時点で テキスト検索 機能は、大文字小文字を区別しないテキスト検索をサポートするように設計されており、 ストップワードやステミングのルールは言語ごとに決められています。のステミングルールは 対応言語 のステミング ルールは、一般的な動詞と名詞を処理する標準アルゴリズムに基づいていますが、固有名詞については認識されていません。

部分一致やあいまい一致の明示的なサポートはありませんが、似たような結果になる語句はそのように動作しているように見えることがあります。たとえば、"taste", "tastes", and tasteful" はすべて "tast" にステム処理されます。試しに 雪だるま式ステミングデモ ページで、より多くの単語とステミングアルゴリズムを試してみてください。

一致した結果はすべて、同じ単語 "LEONEL" のバリエーションで、大文字と小文字によってのみ変化します。選択した言語のルールによって "LEONEL" がより短いものにステム処理されない限り、一致するバリエーションはこれらのタイプのみとなります。

効率的な部分一致を実行したい場合は、別のアプローチを取る必要があります。いくつかの有用なアイデアについては、以下を参照してください。

MongoDB issue tracker に関連する改善要求がありますので、ウォッチ/アップボートしてください。 SERVER-15090: 部分的な単語マッチをサポートするためにテキストインデックスを改善しました。 .