【问题标题】:ThinkingSphinx group_by causing slow searchesThinkingSphinx group_by 导致搜索缓慢
【发布时间】:2017-01-30 18:06:16
【问题描述】:

设置:

  • 导轨 4
  • MySQL
  • 思考狮身人面像

我的应用中有一个模型 (Record),有近 5 亿行。这个模型有 32 个字段,但我只关心特定 Sphinx 搜索的两个字段是 nametokenname 是我使用 Sphinx 搜索的对象,token 是我想要返回以在 Rails 中执行其他操作的对象。

我的索引设置是:

ThinkingSphinx::Index.define :records, :with => :real_time do
  # fields
  indexes name
  indexes token

  # attributes
  has token, as: :token_attr, type: :string
  # < several additional attributes >
end

我想做的是在 :records 上查询 Sphinx 与 name 匹配并让它返回 distinct token 数组中的字符串。

这是我所拥有的:

Record.search("red", indices: %w(records), max_matches: num_tokens_i_need, group_by: :token_attr)

...其中num_tokens_i_need 通常为数千(小于 10,000)

上述查询需要 5-8 分钟才能完成。但是,当我这样做时:

Record.search("red", indices: %w(records), max_matches: num_tokens_i_need).map(&:token).uniq

搜索速度非常快(在几百毫秒内返回数百万条记录),但由于.uniq 调用,我没有回复num_tokens_i_need

基本上我需要做的是进行快速的 Sphinx 搜索,它会为我返回给定术语(例如“红色”)的不同标记的确切数量。

如果查看我的 sphinx.conf 或其他任何内容会有所帮助,请告诉我。

【问题讨论】:

  • 如果有人愿意解释为什么投反对票,我将不胜感激。

标签: mysql ruby-on-rails sphinx thinking-sphinx


【解决方案1】:

Sphinx docs 请注意,分组是在内存中完成的,因此,要获得分组的搜索结果,每个文档的属性都需要在某个时间点在内存中。鉴于您的 Record 索引中有几百万个文档,我猜这就是速度缓慢的原因。

请记住,在您的第二个示例中,数百万条记录可能与您的查询匹配,但它们并非全部由 Sphinx 返回(并且匹配纯粹在字段上完成,不涉及属性),这是一部分为什么该查询要快得多

关于更好的前进方式的一些想法:

  • 如果您只是想要名称与完全匹配的 Record 实例中的令牌,那么 SQL 可能是完成这项工作的更好工具。即使是部分匹配,使用数据库的模糊匹配也可能更快。
  • 如果您只是在 number 个标记之后,而不是在标记值之后,那么 Sphinx 确实不是适合这项工作的工具。它在构建时没有考虑到聚合,因此它没有针对您正在运行的查询进行调整。
  • 如果关键字值(在您的示例中,red)是已知集合(而不是用户提供的),也许您可​​以缓存这些值并定期重新计算(一天一次?)。李>

这些都不是明显的赢家,但希望它们能帮助您找到更好的解决方案。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2011-07-05
    相关资源
    最近更新 更多