3

Widget.title、Widget.publish_ at、および Widget.unpublish_ at があります。これは、thinking_sphinx が実行され、1 晩に 1 回インデックスを作成する Rails アプリです。タイトルに「foo」が含まれ、公開されているすべてのウィジェットを検索したい (publish _at < Time.now, unpublish _at > Time.now)。

ページネーションを適切に機能させるには、これをスフィンクス クエリで行いたいと思っています。属性を取得するために 'has :publish_at, :unpublish_at' がありますが、'Widget.search("foo @publish_ at > #{Time.now}",:match _mode=>:extended' の構文は何ですか?可能ですか?

4

2 に答える 2

9

はい、簡単に可能です。インデックスで時間をカバーしていることを確認してください。

class Widget < ActiveRecord::Base
  define_index do
    indexes title
    has publish_at
    has unpublish_at
    ...
  end

純粋に日付に基づいてそれを取得するには、スフィンクスが制限された範囲 (x>=y ではなく x..y) を必要とするため、少しの策略が必要です。最小値/最大値の使用は非常に洗練されていませんが、現時点ではそれを回避する良い方法を知りません。

min_time = Time.now.advance(:years => -10)
max_time = Time.now.advance(:years => 10)
title = "foo"

Widget.search title, :with => {:publish_at => min_time..Time.now, :unpublish_at => Time.now..max_time}
于 2008-12-10T13:25:19.220 に答える
1

レールでスフィンクスをまだ使用していません。しかし、これは Sphinx API によって可能になります。必要なことは、sphinx.conf で datetime 属性を設定することです。また、インデックス選択で UNIX_TIMESTAMP(publish_at)、UNIX_TIMESTAMP(unpublish_at) を使用することを忘れないでください。

于 2009-03-13T13:30:36.490 に答える