从多态关联的日期时间字段中思考sphinx属性

时间:2015-04-16 14:04:28

标签: ruby-on-rails thinking-sphinx

我有一个模型A通过INNER JOIN与模型B相关联:

class A  
  has_many :bees, as: :bable
  scope :bees, -> () {
    joins("INNER JOIN bees AS b ON id = b.bable_id .......")
  }
end

class B
  table_name = "bees"
  belongs_to :bable, polymorphic: true
end

我需要使用B的datetime字段(created_at)进行过滤,因此我声明了一个新属性:

has bees.created_at, as: :b_created_at

现在生成的sphinx查询语句包括:

GROUP_CONCAT(DISTINCT UNIX_TIMESTAMP(bees.`created_at`) SEPARATOR ',') AS `b_created_at`

索引编制后,我的sphinx索引文件大小爆炸了。

  1. 导致问题的查询的“GROUP_CONCAT”部分是多少,是否有更好的方法来过滤此属性?
  2. 如何调试索引器并找到生成大索引文件的其他原因?
  3. 由于

1 个答案:

答案 0 :(得分:1)

索引器似乎在索引文件中创建了一个逗号分隔的列表,其中列出了所有bees的所有已创建时间戳 - 因为创建的时间戳通常是唯一的(!),此索引将创建一个项目对于每个bee。如果你有很多bees那么这将会很大。

如果有可能的话,我会想办法绕过Sphinx这部分查询,并让它为内置的BETWEEN LowDateTs AND HighDateTs添加一个直接的SQL created_at。我希望这是可能的 - 它肯定比使用文本索引找到它更好。

希望这有一些帮助。

修改

快速阅读Sphinx'文档:

  

[...] WHERE子句。该子句将映射到全文查询和过滤器。比较运算符(=,!=,<,>,< =,> =),IN,AND,NOT和BETWEEN都支持并直接映射到过滤器[...]

所以关键是要停止将时间戳视为文本搜索,并使用BETWEEN,这将更有效率,并希望阻止它尝试在此字段上使用文本索引。