[解決済み] MongoDB 全文検索と部分検索
質問
エンベロープです。
- 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 におけるファジーマッチと部分マッチの効率的なテクニック by ジョン・ページ
- 効率的な部分キーワード検索 by ジェームス・タン
MongoDB issue tracker に関連する改善要求がありますので、ウォッチ/アップボートしてください。 SERVER-15090: 部分的な単語マッチをサポートするためにテキストインデックスを改善しました。 .
関連
-
[解決済み】MongoDBシェルですべてのコレクションを一覧表示するには?
-
[解決済み] MongoDB の個別集計
-
[解決済み] MongoDBのデフォルトのユーザーとパスワードは何ですか?
-
[解決済み] mongodb Failed: error connecting to db server: no reachable servers
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] コマンドラインからMongoDBデータベースを削除する方法を教えてください。
-
[解決済み] 2 つの日付の間にあるオブジェクトを検索する MongoDB
-
[解決済み] 別のフィールドの値を使って MongoDB のフィールドを更新する
-
[解決済み] MongoDB コレクションのオブジェクト配列で、問い合わせた要素のみを取得する
-
[解決済み] MongoDBコンテナの起動時にDBを作成するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] mongo - サーバー 127.0.0.1:27017 に接続できませんでした。
-
[解決済み] mongodb シェルでドキュメントの値を印刷する
-
[解決済み] HomebrewでMongoDBをインストールする
-
[解決済み] mongodの書き込みに関するデフォルトの懸念はどのバージョンにありますか?
-
[解決済み] MongoDB: 大文字小文字を区別しないクエリを作ることはできますか?
-
[解決済み] mongodb aggregation sort
-
[解決済み] mongooseを使ってmongodbにドキュメントを挿入し、生成されたidを取得する方法は?
-
MongoDBラーニングノート
-
[解決済み】MongoDBでデータのバージョニングを実装する方法
-
[解決済み] MongoDBでObjectIDの代わりにUUIDを使用する方法