mysql - 思维狮身人面像排名和统计

标签 mysql ruby-on-rails thinking-sphinx

我正在尝试设置从 Sphinx 索引中获取一些数字的功能,但不确定如何获取我想要的信息。

我有一个包含文章的 mysql 数据库,为该数据库设置了 sphinx 索引和全文搜索,一切正常。我想要的是得到一些数字:

  1. 搜索文本(关键字或关键短语)在所有文章中出现的次数(更有可能仅限于“从 X 到 Y 的时间间隔内的文章”)
  2. 与之前相同,但 2 个关键字或关键短语(即“x AND y”)在同一篇文章中出现的次数

我正在做类似于第一次手动使用我制作的bat文件的事情

indexer ind_core -c c:\%SOME_PATH%\development.sphinx.conf --buildstops stats.txt 10000 --buildfreqs

这为我生成了一个包含所有重复关键字以及它们在早期开发阶段出现的频率的文本,这有助于形成我感兴趣的关键字列表。现在我正在尝试做同样的事情,但只是为了有限的预先确定的关键字列表并集成到我的 Rails 项目中,以便将来能够构建图表。

我尝试运行一些查询,例如

@testing = Article.search 'Keyword1 AND Keyword2', :ranker => :wordcount

但我不确定它是如何工作的以及如何处理结果,以及这是否是我正在寻找的。

我尝试的另一种方法是手动 mysql 查询,例如

 SELECT id,title,WEIGHT() AS w FROM ind_core WHERE MATCH('@title keyword1 | keyword2') OPTION ranker=expr('sum(hit_count)');

但我也不知道如何处理这里的结果(以及如何将其实际实现到我现有的 Rails 项目中),并且每个查询仅限 20 行(我认为我可以在设置中的某处进行更改) ?)。但至少看看 mysql 结果,我感兴趣的是所有文章(或设定时间范围内的所有文章)的 hit_count。

关于如何做到这一点有什么想法吗?

更新: 我发现当前的方法是添加

@testing = Article.search params[:search], :without => {:is_active => false}, :ranker => :bm25

具有某些条件的 Controller (这样它就不会从 nil 搜索中出错)。 :is_active 是我的软删除标志,不想搜索已删除的条目,所以不要介意。在 View 中我只是显示

<%= @testing.total_entries %>

如果我理解正确的话,它会显示 sphinx 找到的匹配项数量(几乎就是我正在寻找的内容)。

最佳答案

因此,要计算每个文档的点击次数,您几乎走在正确的 rails 上,只需将其输入 Ruby/Thinking Sphinx 即可。

获取原始 Sphinx 结果(如果不需要 ActiveRecord 对象):

search = Article.search "foo",
  :ranker     => "expr('SUM(hit_count)')",
  :select     => "*, weight()",
  :middleware => ThinkingSphinx::Middlewares::RAW_ONLY

…这将返回一个哈希数组,您可以使用 weight() 字符串键作为命中计数,使用 sphinx_internal_id 字符串键作为模型的主键key(id是Sphinx自己的主键,不太有用)。

或者,如果您想使用 ActiveRecord 对象,Thinking Sphinx 能够将每个搜索结果包装在一个辅助对象中,该对象将适当的方法传递给底层模型实例,但让 weight 做出响应来自 Sphinx 的值:

search = Article.search "foo",
  :ranker     => "expr('SUM(hit_count)')",
  :select     => "*, weight()"; ""
search.context[:panes] << ThinkingSphinx::Panes::WeightPane
search.each do |article|
  puts article.weight
end

请记住,必须在评估搜索之前添加 Pane ,因此如果您在 Rails 控制台中对此进行测试,则需要避免让控制台检查 search 变量(我通常通过在初始搜索调用末尾添加 ; "" 来实现。

在这两种情况下,正如您所注意到的,搜索结果都是分页的 - 您可以使用 :page 选项来确定您想要的结果页,并使用 :per_page 确定每个请求中返回的记录数。总共有 1000 个结果的标准限制,但可以使用 the max_matches setting 进行更改.

现在,如果您想要关键字在所有 Sphinx 记录中出现的次数,那么在利用 Thinking Sphinx 的搜索选项的同时,最好的方法是获取聚合 SUM 的原始结果 - 类似于上面的第一个选项。

search = Article.search "foo",
  :ranker     => "expr('SUM(hit_count)')",
  :select     => "SUM(weight()) AS count",
  :middleware => ThinkingSphinx::Middlewares::RAW_ONLY
search.first["count"]

关于mysql - 思维狮身人面像排名和统计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49519336/

相关文章:

mysql - 使用jsp插入mysql数据库抛出异常

ruby-on-rails - Geokit Rails - 查找在其范围内包含点(位置)的所有用户

ruby-on-rails - Thinking Sphinx - 与 bool 字段的嵌套关联

ruby-on-rails - 设计路线助手在测试期间不再为人所知

ruby-on-rails - 如何将条件 "IS NOT NULL"添加到 Thinking Sphinx 搜索中

ruby-on-rails - 使用 Thinking Sphinx 时,Delta 索引无法在服务器上运行

python - 如何在 python flask 中使用 mysql.connection 数据库池

mysql - 我可以从 sql 中的选择中获取比率吗?

java - 如何防止准备好的语句更新 TIMESTAMP 列?

mysql - Activerecord 对 sql 的转换不正确