1

クエリ キーワードを使用せずに、他の属性からのフィルターを使用して Sphinx からデータを取得したいと考えていました。これらの他の属性は整数です。インデックスの属性は次のとおりです。

id - Integer
keyword - String
keyword_ord - Integer
words - Integer
results - Integer

テーブルには約 3 億のキーワードがあり、Sphinx で空のクエリを使用してこの問題を解決しようとしました (注: PHP と MySQL を使用しています)。3 から 6 語のキーワードと 3000 から 10000 の結果を持つキーワードを取得したい場合、PHP で Sphinx API の SetFilterRange() 関数を使用します。

$sphinx->SetFilterRange( 'words', 3, 6 );
$sphinx->SetFilterRange( 'results', 3000, 10000 );

次に、検索を実行するために、空のクエリを送信します。

$results = $sphinx->query( '' );

問題は、クエリがまだ予想よりも遅いように見えることです。Sphinx で空のクエリを送信する以外に、フィルターを使用してデータを取得するより良い方法があると思いますか? または、Sphinx 自体以外にこれに対するより良い解決策はありますか?

私の推測では、遅い理由は、Sphinx が実際に 3 億のキーワードすべてをループして、フィルターに該当するすべてのものを見つけなければならないからだと思います。指定されたクエリに (空のクエリではなく) キーワードがある場合、インデックスの助けを借りて、すべてのキーワードを実行する必要はなく、キーワードを含まない行をスキップします。これが理由である場合、Sphinx を使用する以外に、これを解決するためのより良いアプローチがあるはずです。

サーバーのハードウェア仕様は次のとおりです。

  • CPU: Intel(R) Xeon(R) CPU E5-2630 0 @ 2.30GHz (8 コア)
  • メモリー: 2GB
  • ディスク容量: 250GB
4

2 に答える 2

2

Sphinx は、正直なところ非常にうまく機能します。あなたのスペック(メモリ)は少し低いので、少し上げる必要があります。3 億行 (インデックス付き) がある場合、MySQL だけで大量のメモリを消費します。手始めに、少なくとも8GBのメモリにアップグレードします。

メモリをアップグレードした後、Sphinx 構成をいじってみました。これらのオプションを追加/使用することから始めます...

searchd
{
    max_matches         = 200000
    max_filter_values   = 300000
}

max_matches は、一般的に合計結果の量を制限します。3 億の結果を返す理由はありません。

max_filter_values は単なるサニティ チェック オプションです。フィルタ オプションとして 3 億のタグを選択することを阻止します。

空のクエリを検索するには、次のものが必要です。

$results = $sphinx->query( '*' );

経験から言えば、Sphinx は 3 億以上のレコードを処理するのに十分強力です。

ほとんどの場合、Sphinx には十分なリソースがなく、データにすばやくアクセスできません。「2GB」の RAM はシステム全体で共有されているため、Sphinx が実際に使用できる容量は大きく異なります。Web サーバーが起動し、Apache インスタンス、mysql、memcached などをスプールするのを見たことがありますが、100MB の RAM しか残っていません。実際の数値を見つけるためのベンチテスト)

editまた、最終的にはDelta : Main indexing solutions を調べたいと思うでしょう。サーバーの負荷に対応するための複数の DB セットアップがない場合、Sphinx がインデックスを作成すると、クエリが完了するまで MySQL がロックされる可能性があります。

編集 PHP API でいくつかの問題に遭遇したので、PHP 用の Sphinx C 拡張機能をコンパイルしました。これは驚異的に機能し、処理時間を半分に短縮しました。拡張機能を使用する前に、すべてを高速化する API の一部を修正しました。

最も重要な 2 つ: -- すべての「アサート」をコメント アウトします -- これは安全な方法ではないかもしれませんが、とにかく assert は本番環境に属しません。アサートを実行したい場合 -- 拡張機能を使用 -- すべての「is_int」関数を検索し、...

if ((int)$v === $v) {
/* code here */
}

型キャストは、実際には大規模なクエリで約 30% 高速です。

于 2013-01-09T15:36:32.970 に答える
0

お返事ありがとうございますCrazyVipa(私はRonaldsの同僚です)。

現在、RAMが2GBに設定されているのは、現時点で誰もサイトを使用していないためです。通常、Sphinxを使用している場合は、RAMを12〜16GBに設定します。RAM使用量を追跡しましたが、10GBを超えることはありません。

ただし、構成とクエリの提案を試してみます。

明日ここに戻ります。

于 2013-01-09T16:05:54.920 に答える