約 10 億のドキュメントという大きなインデックスがあります。私たちのアプリケーションでは、ユーザーがすべてを検索することはできません。彼らにはサブスクリプションがあり、それらでのみ検索できるはずです。インデックスの最初の反復では属性を使用したため、典型的なクエリは次のようになりました ( PHP APIを使用しています)。
$cl->SetFilter('category_id', $category_ids); // array with all user subscriptions
$result = $cl->Query($term,"documents");
これは問題なく動作しましたが、非常に遅かったです。次に、この記事を見ました。インデックスが作成されていない MySQL クエリとの類似性は驚くべきものであり、属性ベースのフィルターを捨てて、全文列を試すことにしました。これで、category_id は full_text 列になります。実際、最初のテストでは検索がはるかに高速であることが示されましたが、インデックスを本番環境に導入したときに問題が発生しました。一部のユーザーは多くのサブスクリプションを持っており、Sphinx から次のエラーが発生するようになりました。
Error: index documents: query too complex, not enough stack (thread_stack_size=337K or higher required)
新しいクエリは次のようになります。
user_input @category_id c545|c547|c549|c556|c568|c574|c577|c685...
カテゴリが多すぎると、上記のエラーが表示されます。thread_stack をより高い値に増やすだけで簡単に修正できると考えていましたが、2MB に制限されていることが判明し、それを超えるクエリがまだ残っています。
問題は、今何をすべきかです。クエリをより小さなクエリに分割することを考えていましたが、正しい制限で結果を集計するにはどうすればよいでしょうか (ページネーションには $cl->SetLimits($page, $limit); を使用しています)。
どんなアイデアでも大歓迎です。