【问题标题】:Thinking sphinx attribute from polymorphic association's datetime field从多态关联的日期时间字段思考狮身人面像属性
【发布时间】:2015-04-16 14:04:27
【问题描述】:

我有一个模型 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 的日期时间字段(created_at)进行过滤,因此我声明了一个新属性:

has bees.created_at, as: :b_created_at

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

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

索引后,我的狮身人面像索引文件大小爆炸了。

  1. 查询的“GROUP_CONCAT”部分造成了多少问题,有没有更好的方法来按此属性进行过滤?
  2. 如何调试索引器并找到生成大型索引文件的其他原因?

谢谢

【问题讨论】:

    标签: ruby-on-rails thinking-sphinx


    【解决方案1】:

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

    如果可能的话,我会寻找某种方法绕过 Sphinx 进行这部分查询,并让它针对内置的created_at 添加直接 SQL BETWEEN LowDateTs AND HighDateTs。我希望这是可能的——它肯定比使用文本索引来查找它更好。

    希望对你有所帮助。

    编辑:

    快速阅读 Sphinx 的文档:

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

    因此,关键是停止将时间戳视为文本搜索并使用BETWEEN,这将大大提高效率,并有望阻止它尝试在该字段上使用文本索引。

    【讨论】:

    • Sphinx 确实将时间戳视为整数,并使用“BETWEEN”进行搜索。如果我想限制要索引的记录,“WHERE”子句会有所帮助,但如果我需要所有记录,则不会。
    • 我确实想过滤时间戳。 Sphinx 允许做两件事:搜索文本字段和过滤属性。我正在做第二个。我的问题是该属性是否导致索引文件的大​​小增加。
    • 好的。我的误解。简短的回答 - 是的。对于 n 个蜜蜂,索引可能包含 n 个整数 +n-1 个逗号,因此该字段上的索引将随蜜蜂数量线性缩放(大约为两倍)。
    • 如果可能在您的应用程序中,我希望从索引器中排除时间戳,并且无论在哪里查询蜜蜂数据,我都会通过 where 子句在那里过滤,然后传递该数据集以允许 Sphinx 用于其他搜索条件(反之亦然)。这可能是不可能的,或者你想要的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    相关资源
    最近更新 更多