1

すべて一致しない単語を含むフレーズを検索する最良の方法は何ですか。たとえば、次のようになります。

description = "a cell phone that have an external memory"

そして私は検索したい:

search = "a good phone"

mongodb を使用するヒントはありますか、または python から一致する Knuth-Morris-Pratt 文字列を使用しますか (サーバーを強制終了します)?

4

6 に答える 6

4

MongoDB は、そのようなシャネニガンには向いていません。検索のニーズには、SphinxSearchSolrなどの外部サービスを使用することをお勧めします。

于 2012-09-14T21:56:46.573 に答える
3

MapReduceを使用して検索インデックスを作成し、結果のコレクションを検索できます。

マップ関数は、最初に説明を個々の単語に分割します。「a」や「the」などの非常に一般的な単語は破棄する必要があります。次に、単語ごとにエミットを行います。キーは単語で、は現在処理されているドキュメントの _id です。

次に、reduce 関数を使用して、各単語を含むすべてのドキュメントを収集します。すべての配列が 1 つにマージされ、重複が削除されたキーが返されます。

この MapReduce ジョブの結果のコレクションには、説明に表示される個々の単語ごとに 1 つのドキュメントが含まれます。これらのドキュメントには、単語と、それが表示されるドキュメントの _id を持つ配列が含まれます。インデックスを追加すると、非常にすばやく検索できます。

この MapReduce ジョブは、検索インデックスを構築するために 1 回実行する必要があります。データベースにすでに大量のデータがある場合、これにはしばらく時間がかかります。ドキュメントが追加または削除されたとき、またはドキュメントの説明が変更されたときはいつでも、増分 MapReduce を実行して検索インデックスを更新する必要があります。この段階的な MapReduce は、最初の MapReduce よりもはるかに高速になるため、自動的に実行できるはずです。

于 2012-09-14T22:31:04.833 に答える
2

ここでは誰も実際に検索に関するドキュメントページを参照していません: http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo

Map Reduce や Regex などのスケーリングしないメソッドを回避する良い方法は、ドキュメント内にキーワードの配列を実際に格納することです。

etc の単語をどのように挿入するか、どのストップ ワードを削除するかを決定し、完了したら、それをドキュメント自体の大きな配列に押し込むだけです。

Map reduce は、これを行うには悪い方法と見なされることがあります。これは、パフォーマンスとスレッド化の理由からではなく、接頭辞を付けない限り、90% のケースでインデックスの使用が非常に悪いため、正規表現ではないためです。単純な正規表現が多くのmongodbサーバーを殺すのを見たので、それがいかに悪いかを知っています。

外部の FTS 技術を実際に検討する必要があるという点については、他の皆さんと同意見です。個人的に Sphinx: http://sphinxsearch.com/の速度、スケーラビリティ、および柔軟性が大好きです。しかし、私は Solr のような他の検索技術を使用しましたが、それらはすべて非常に優れています。

于 2012-09-14T23:43:27.650 に答える
1

ElasticSearch用のプラグを追加したいだけです。彼らはPython用のいくつかを含むたくさんのクライアントライブラリを持っています。

SolrとElasticSearchはどちらもApacheLuceneに基づいて構築されていますが、ElasticSearchには、XMLではなくJSONを話すという事実から始めて、Solr、IMOに比べていくつかの利点があります。

于 2012-09-14T22:00:04.483 に答える
1

mongo db フィールドの単純な正規表現検索ではfind"$regex"クエリ式で使用できます。

ピモンゴではdb.your_collection.find({"description": {"$regex": "<insert regex here>"}}).

これで始められます。他の人が述べているように、MongoDB は、このように打ち負かすことを必ずしも感謝しているわけではありません。長時間の検索には、より堅牢なソリューションを検討する必要がある場合があります。

DB で正規表現検索を行う場合のパフォーマンスへの影響を考慮してください。

こちらの MongoDB リファレンスをお読みください http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

于 2012-09-14T22:42:38.850 に答える