0

この条件またはパラメーターを使用して Mongodb でクエリを作成する方法を探しています。

たとえば、入力テキストが「rtab」の場合、「brats」、「bart」などの結果になります。

この検索方法の用語がわからないので、助けていただければ幸いです。

4

3 に答える 3

2

本質的にはサポートされていませんが、入力単語「brats」と「brats」を受け取り、それらを並べ替えて「abrst」と「abrs」にするインデックスを作成し、以下で構成されるルックアップ インデックスを作成することで、これを実現できます。

stem: "abrst", matches: ["brats"]
stem: "abrt",  matches: ["brat", "bart"]

次に、「brat」を検索するときは、文字を並べ替えて「abrt」を取得し、それを使用して検索を実行します。

db.lookups.find({stem: /^abrt/})

返されるすべてのドキュメントには、入力した単語で始まる単語が含まれている必要があります。これはかなり初歩的ですが、うまくいくはずです。Solr インデクサーのような、これをより適切に行う特殊ベースの検索エンジンが存在する可能性があります。

于 2012-10-30T13:34:18.240 に答える
0

ここであなたが抱えている最大の問題は、単語のスペルミスです。

単語をステミングしても修正されません。ステミングは「ツリー」を「ツリー」などに変換するだけです。この問題を解決できる (信頼できる) 言語ライブラリはありません。

これは実際、検索技術のブラック スポットのようなものです。Google は、アプリケーション (電子メールなど) のさまざまなソースから収集した単語の検索インデックスを使用して辞書を作成し、オートコンプリート モードで検索ボックスに (できれば) 正しいスペルを提供します。用語は、はるかに一般的なフレーズによく似ています。

Mongo には、$whereこれを可能にする MR または配列ベースの単語セットを介した機能はありません。

これを解決するには、次のようにします: 単語abrtは似ているbartので、単語のリストを格納し、別のインデックスでクエリを実行して、類似した単語のリスト (geoNear タイプの単語コマンドなど) を検索し、類似しているが正確ではない結果を検索します。 . これは基本的に他の人が行う方法を再現するものであり、正確な科学ではありませんが、ほとんどの場合うまくいくはずです。

単語を並べ替えることでこれを解決する際の主な問題は、スペルミスの組み合わせが何百もある場合があるため、うまくスケーリングできない可能性があることです。

全文検索に Mongo を使用する場合は、次のリンクが非常に役立ちます: http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongoで、必要な考慮事項が詳細に説明されています。

于 2012-10-30T14:18:37.117 に答える
0

これは、MongoDB クエリ言語の従来の構文では不可能だと思います。これを行う唯一の方法は、$where 引数を使用することです。この引数は、コレクション内の各ドキュメントに対して ("this" 変数として) 実行される Javascript 関数を受け取り、クエリによって返されるかどうかに応じて true または false を返します。

この機能はここに文書化されています: http://www.mongodb.org/display/DOCS/Server-side+Code+Execution#Server-sideCodeExecution-%7B%7B%24where%7D%7DClausesandFunctionsinQueries

$where は非常に遅いことに注意してください。パフォーマンスがユースケースの要件である場合、MongoDB でこれを行うことはできないと思います。

セキュリティ警告:これがアプリケーションの一部である場合、ユーザー提供の文字列から Javascript コードを手続き的に生成する必要があります。ユーザーがスクリプト コードを挿入できないように注意する必要があります。

于 2012-10-30T13:33:11.907 に答える