Mysql ThinkingSphinx group_导致搜索速度变慢

Mysql ThinkingSphinx group_导致搜索速度变慢,mysql,ruby-on-rails,sphinx,thinking-sphinx,Mysql,Ruby On Rails,Sphinx,Thinking Sphinx,设置: 轨道4 MySQL 思绪幻觉 我的应用程序中有一个模型(记录),几乎有5亿行。这个模型有32个字段,但对于特定的Sphinx搜索,我只关心name和tokenname是我使用Sphinx搜索的对象,而token是我希望返回以在Rails中执行其他操作的对象 我的索引设置为: ThinkingSphinx::Index.define :records, :with => :real_time do # fields indexes name indexes token

设置:

  • 轨道4
  • MySQL
  • 思绪幻觉
我的应用程序中有一个模型(
记录
),几乎有5亿行。这个模型有32个字段,但对于特定的Sphinx搜索,我只关心
name
token
name
是我使用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
。。。其中,
num\u tokens\u i\u need
通常为数千(少于10000)

上述查询需要5-8分钟才能完成。然而,当我这么做时:

Record.search("red", indices: %w(records), max_matches: num_tokens_i_need).map(&:token).uniq
搜索速度非常快(在几百毫秒内返回数百万条记录),但由于
.uniq
调用,我没有返回我需要的
num\u令牌

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

如果看到我的sphinx.conf或其他内容会有所帮助,请让我知道。

注意分组是在内存中完成的,因此,要获得分组搜索结果,每个文档的属性都需要在内存中的某个位置。考虑到您的记录索引中有数百万个文档,我猜这就是速度缓慢的原因

请记住,在第二个示例中,数百万条记录可能与您的查询相匹配,但它们并不是全部由Sphinx返回的(匹配只在字段上进行,不涉及属性),这就是为什么查询速度更快的部分原因

关于更好的前进道路的一些想法:

  • 如果您只是想从名称完全匹配的记录实例中获取令牌,那么SQL可能是一个更好的工具。即使使用部分匹配,使用数据库的模糊匹配也可能更快
  • 如果您只是关注令牌的数量,而不是令牌的值,那么Sphinx确实不是合适的工具。它的构建没有考虑聚合,因此它没有针对您正在运行的查询进行调优
  • 如果关键字值(在您的示例中,
    red
    )是已知的集合(而不是用户提供的),那么您可能可以缓存这些值并定期(每天一次?)重新计算它们

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

如果有人愿意解释为什么投票失败,我将不胜感激。
Record.search("red", indices: %w(records), max_matches: num_tokens_i_need).map(&:token).uniq