5

与えられた:

  • クライアント(ビジネス顧客)ごとに1つのデータベース
  • 5000クライアント
  • クライアントには2〜2000人のユーザーがいます(平均は約100ユーザー/クライアント)
  • データベースあたり10万から1000万レコード
  • ユーザーはこれらのレコードを頻繁に検索する必要があります(データをナビゲートするための最良の方法です)

おそらく関連情報:

  • 毎週複数の新規クライアント(営業時間中いつでも)
  • 複数のWebサーバーとデータベースサーバー(ユーザーは任意のWebサーバーを介してログインできます)
  • Lucene(およびSolr)には幅広いサポートがあるため、言語やSQLブランドにとらわれないようにしましょう。

例えば:

Joel Spolskyはポッドキャスト#11で、彼のホスト型Webアプリ製品であるFogBugzOn-DemandはLuceneを使用していると述べました。彼には何千ものオンデマンドクライアントがいます。そして、各クライアントは独自のデータベースを取得します。

クライアントごとにインデックスを使用し、クライアントのデータベースに保存します。詳細はわかりません。そして、これがLuceneにとって深刻なmodであるかどうかはわかりません。

質問:

各クライアントがデータベース内でのみ検索できるように、Lucene検索をどのように設定しますか?

インデックスをどのように設定しますか?
インデックスはどこに保存しますか?
すべての検索クエリにフィルターを追加する必要がありますか?
クライアントがキャンセルした場合、そのインデックス(の一部)をどのように削除しますか?(これは些細なことかもしれません-まだわかりません)

可能な解決策:

各クライアント(データベース)のインデックスを作成します

  • 長所:検索は高速です(すべてのインデックスを1つにする方法よりも)。インデックスは、クライアントのデータのサイズに関連しています。
  • 短所:これが何を意味するのかわかりません。また、これがLuceneの範囲を超えているかどうかもわかりません。

database_nameフィールドを持つ単一の巨大なインデックスがあります。常にdatabase_nameをフィルターとして含めます。

  • プロ:わからない。技術サポートや請求部門がすべてのデータベースで情報を検索するのに適しているかもしれません。
  • 短所:検索は(クライアントごとのインデックス方式よりも)低速です。クエリフィルターが削除された場合のセキュリティの欠陥。

最後にもう1つ、 Solr(Luceneの拡張)
を使用した回答も受け入れます。おそらく、この問題により適しています。わからない。

4

3 に答える 3

6

あなたは、FogBugz StackExchange から私を召喚しました。私の名前は Jude です。FogBugz の現在の検索アーキテクトです。

以下は、FogBugz On Demand 検索アーキテクチャのセットアップ方法の大まかな概要です [1]。

  • データの移植性、セキュリティなどに関連する理由から、オンデマンド データベースとインデックスはすべて個別に保管しています。
  • Lucene (実際には Lucene.NET) を使用していますが、バックエンドを大幅に変更して、インデックス全体をデータベースに格納できるようにしました。さらに、不要なデータベース ヒットを可能な限り回避できるように、各 Web ホストでローカル キャッシュが維持されます。
  • 私たちのフィルターはほぼ完全にデータベース側にあるため (検索以外の FogBugz の側面で使用されるため)、検索パーサーはクエリをフルテキスト コンポーネントと非フルテキスト コンポーネントに分離し、ルックアップを実行し、結果を結合します。Lucene が実行できる多くの有用な最適化が無効になるため、これは少し残念です。

私たちが行ったことにはいくつかの利点があります。クライアント データとそのインデックスが同じ場所に保存されるため、アカウントの管理は非常に簡単です。ただし、最低基準を下回る非常に厄介なエッジケース検索のセットなど、いくつかのマイナス面もあります. 振り返ってみると、私たちの検索はクールで、当時としてはよくできていました。ただし、もう一度やるとしたら、このアプローチは思いとどまらせます。

簡単に言えば、検索ドメインが非常に特殊であるか、開発者を非常に高速な検索に専念させようとしない限り、ElasticSearch、Solr、または Xapian などの優れた製品のほうが優れたパフォーマンスを発揮する可能性があります。

今日これを行っていたとしたら、検索ドメインが非常に限定的でない限り、おそらく、データベースを利用した全文検索ソリューションにElasticSearch、Solr、または Xapianを使用するでしょう。どちらについては、補助的なニーズ (プラットフォーム、クエリの種類、拡張性、一連の癖に対する耐性など) によって異なります。

1 つの大きなインデックスと多数の (!) 散らばったインデックスのトピックについて: どちらも機能します。どのようなアーキテクチャを構築しようとしているのか、どのようなパフォーマンスが必要なのかによって、決定が変わると思います。2 秒の検索応答が妥当であると判断した場合はかなり柔軟に対応できますが、200 ミリ秒を超えるものは受け入れられないと言い始めると、選択肢はすぐになくなり始めます。すべてのクライアントに対して 1 つの大きな検索インデックスを維持する方がはるかに効率的ですが、多くの小さなインデックスを処理するよりも、必ずしも高速ではありません(ご指摘のとおり)。個人的には、安全な環境では、クライアント データを分離しておくことのメリットを過小評価してはいけないと感じています。インデックスが破損しても、すべての検索が停止するわけではありません。ばかげた小さなバグが機密データを公開することはありません。ユーザー アカウントはモジュールのままです。一連のアカウントを抽出して新しいサーバーに配置する方が簡単です。等

それがあなたの質問に答えたかどうかはわかりませんが、少なくともあなたの好奇心を満たすことを願っています:-)

[1]: 2013 年に、FogBugz は ElasticSearch を使用して検索およびフィルタリング機能を強化し始めました。私たちはそれが好き。

于 2010-05-25T02:32:16.413 に答える
4

Shalin Shekhar Mangarが、 Solr ユーザーのメーリング リストとプライベート メールで回答してくれました。Shalin は Solr の寄稿者であり、近刊予定の書籍Solr in Actionの著者でもあります。

メーリングリストでの彼の返事:

インデックスをどのように設定しますか?

クライアントごとに複数のコアをセットアップすることを検討します。検索トラフィックによっては、スレーブもセットアップする必要がある場合があります。

インデックスはどこに保存しますか?

1 つのボックスに 5K コアをセットアップしても機能しません。そのため、クライアントを、それぞれがコアのサブセットを持つ複数のボックスに分割する必要があります。

すべての検索クエリにフィルターを追加する必要がありますか?

いいえ、ただし、クエリを正しいホストに送信する必要があります (おそらくマッピング DB が役立ちます)。

クライアントがキャンセルした場合、インデックス (の一部) をどのように削除しますか? (これは些細なことかもしれません--まだわかりません)

クライアントごとに異なるコアを使用すると、これは非常に簡単になります。

メールでの彼の返事:

過去に同様のユースケースに取り組んだことがあり、Solr 側でいくつかの大幅な最適化を伴うマルチコア アプローチを使用しました。http://wiki.apache.org/solr/LotsOfCoresを参照してください- これらの変更をまだ Solr にプッシュできていません。

于 2010-04-25T18:35:53.997 に答える
3

ユーザーが 5,000 件のデータベースから正確に何を検索しているのか、なぜ Lucene が必要なのか、各データベースのデータ サイズは不明です。しかし、私はとにかく強打します:

  1. Multicore Solr (各コア = 1 インデックス) を確認する必要があり、クエリする一意の URL があります。認証は依然として問題であり、(ハック的な) アプローチの 1 つは、URL を推測しにくくすることです。

  2. ウェブサーバーは、アクセスできるものに応じて、Solr インスタンス/コアにクエリを実行できます。

フィルター アプローチから離れて、すべてのデータベースを組み合わせた 1 つの巨大なインデックスを作成することをお勧めします。

HTH

于 2010-04-25T04:27:10.150 に答える