私の検索クエリは次のように実行されます。
select * from posts p where p.post like '%test%' ORDER BY p.upvotes DESC,
p.unix_timestamp DESC LIMIT 20
検索されたキーワードの結果が 20 件を超える場合、タイムスタンプの最小値を見つけて隠し要素に格納し、次のような結果をさらに読み込む別のクエリを実行します。
select * from posts p where p.post like '%test%' and p.unix_timestamp < 1360662045
ORDER BY p.upvotes DESC, p.unix_timestamp DESC LIMIT 20
実際に起こっていることは、私の最初のクエリが、私のせいで投票されていない (0 票を意味する) 投稿を無視している (明らかに、私の間違い) ということですORDER BY p.upvotes DESC
。最初の 20 件の結果で、最小のタイムスタンプが最初の投稿のタイムスタンプになります。この後、最小タイムスタンプよりも小さい次の 20 件の結果をフェッチしようとしても、何も得られません。
現在、私は単純に賛成票の順序を使用して上位のレコードを取得しています。ベイジアン平均やその他のアルゴリズムなどのアルゴリズムを使用する必要がありますか?
現在の注文システムにとどまらなければならない場合、または使用すべき実行可能でより効率的な方法がある場合、クエリを改善する方法を教えてください。
PS可能であれば、ベイジアン平均(最も使用されているようです)または他の代替手段に関するいくつかのリソースを参照してください。