首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导致缓慢搜索的ThinkingSphinx group_by

导致缓慢搜索的ThinkingSphinx group_by
EN

Stack Overflow用户
提问于 2017-01-30 18:06:16
回答 1查看 76关注 0票数 0

设置:

  • Rails 4
  • MySQL
  • ThinkingSphinx

我的应用程序中有一个模型(Record),有近5亿行。这个模型有32个字段,但对于某个狮身人面像搜索,我唯一关心的两个字段是nametokenname是我使用狮身人面像搜索的对象,而token是我希望返回以在Rails中执行其他操作的工具。

我建立的索引是:

代码语言:javascript
复制
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上对name进行查询,并让它在数组中返回不同的token字符串。

我现在拥有的是:

代码语言:javascript
复制
Record.search("red", indices: %w(records), max_matches: num_tokens_i_need, group_by: :token_attr)

..。其中num_tokens_i_need通常在数千(不到10,000)的地方。

上面的查询需要5-8分钟才能完成.然而,当我简单地做:

代码语言:javascript
复制
Record.search("red", indices: %w(records), max_matches: num_tokens_i_need).map(&:token).uniq

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

基本上,我需要做的是有一个快速狮身人面像搜索,它给出了一个特定术语的确切数目(如“红色”)。

如果看到我的sphinx.conf或其他东西会有帮助的话,请告诉我。

EN

回答 1

Stack Overflow用户

发布于 2017-01-31 02:18:46

狮身人面像博士注意到分组是在内存中完成的,因此,要获得分组搜索结果,每个文档的属性都需要在某个时候存储在内存中。考虑到记录索引中有几百万个文档,我猜这是导致缓慢的原因。

请记住,在第二个示例中,数百万条记录可能与查询匹配,但它们并非全部由Sphinx返回(匹配完全在字段上完成,属性不涉及),这也是查询速度快得多的原因之一。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41942571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档