1

mongo で次のようなクエリを作成したとき、データベースには約200 万のドキュメントがあります。

db.collection.ensure_index("location")
db.collection.find({"location.name": {"$regex": 'norway', "$option": 'i'}}, {"_id:0", 'userid': 1, 'username': 1})

位置検索用の mongo ドキュメント サンプル:

Mongodb document: {"location": {id:3235726, name: Oslo, Norway }}

インデックス作成では、 cache_time部分が指定されていないため、デフォルトが使用されます。現在、2 秒または 4 秒後にデータが表示されますが、これは非常に悪いことです。最も悪いのは、場所が見つからない場合で、検索操作に約25 秒かかりました。今回は python time.time()メソッドを使ってマッピングしました。次に、100 個のドキュメントに対してのみクエリにlimit()を設定すると、少しうまく機能します。しかし、そこに制限を設けた場合、私にとってのユースケースは何ですか。skip()を使用すると、検索中に非常に広範囲になります。

他の部分では、次のようなユーザーIDを使用してデータを検索している場合、正規表現タイプのクエリは含まれていません:

db.collection.ensure_index("userid")
db.collection.find({"userid": 1213444}, {"_id:0", 'user_rank': 1, 'username': 1})

id は整数で非常に高速であるため、非常に効率的に機能します。唯一の違いは、正規表現を使用してロケーション クエリの部分で「like」クエリを使用していることと、mongo docs正規表現で調べたところ、パフォーマンスの点では悪くありません。

インデックス作成を効率的に使用するため、またはmongo_connector を介してすべての mongo ドキュメントのインデックスを作成し、mongodb から solr にデータを同期するApache Solr検索エンジンを使用するために、現在 1.5G のサーバーの物理メモリを増やす必要があります (データを直接 solr にインデックス作成することは非常に膨大です)。記憶の条件)?

私は自分の問題ステートメントに全力を尽くしました。問題ステートメントに何か問題がある場合はお知らせください。改善するために最善を尽くすことができます。

編集:mongoでelasticsearchを使用する必要がありますか? インデックスの有無にかかわらず検索結果が遅すぎるため、最大時間のように260ミリ秒と高すぎる

4

1 に答える 1

1

$regex常にインデックスを使用するとは限りません

$regex は、正規表現が文字列の先頭 (つまり ^) のアンカーを持ち、大文字と小文字を区別する一致である場合にのみ、インデックスを効率的に使用できます。さらに、while /^a/, /^a. /、および /^a。$/ は同等の文字列に一致しますが、パフォーマンス特性が異なります。適切なインデックスが存在する場合、これらの式はすべてインデックスを使用します。ただし、/^a. /、および /^a。$/ は遅いです。/^a/ は、プレフィックスの一致後にスキャンを停止できます。

インデックスを使用するには、クエリを作成する必要があります。説明コマンドでインデックスが使用されたことを確認できます

于 2013-10-18T07:33:40.883 に答える