思维狮身人面像排名与统计

Thinking sphinx ranking and statistics

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

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

  1. 搜索文本(关键字或关键短语)在所有时间出现在所有文章中的次数(更有可能限于 "articles from time interval from X and to Y")
  2. 与之前相同,但 2 个关键字或关键短语(因此 "x AND y")出现在同一篇文章中的次数

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

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

它为我生成了一个 txt,其中包含所有重复的关键字以及它们在早期开发阶段出现的频率,这有助于形成我感兴趣的关键字列表。现在我正在尝试做同样的事情,但只是为了预定关键字的有限列表并集成到我的 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

在某些条件下进行控制器(因此它不会从 nil 搜索中出错)。 :is_active 是我的软删除标志,不想搜索已删除的条目,所以不要介意。在视图中,我只是显示

<%= @testing.total_entries %>

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

因此,要计算出每个文档的点击次数,您基本上是在正确的轨道上,只需将其输入 Ruby/Thinking Sphinx。

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

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

…这将 return 一个哈希数组,您可以使用 weight() 字符串键作为命中计数,并使用 sphinx_internal_id 字符串键作为模型的主键( 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

请记住,必须在 之前添加窗格 搜索被评估,因此如果您在 Rails 控制台中测试它,您需要避免让控制台检查 search 变量(我通常在初始搜索调用结束时添加 ; ""

如您所述,在这两种情况下,搜索结果都是分页的 - 您可以使用 :page 选项来确定您想要的结果页面,并使用 :per_page 来确定每个请求中 returned 的记录数。总体上有 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"]