【问题标题】:Thinking sphinx ranking and statistics思考狮身人面像排名和统计
【发布时间】:2018-03-27 17:46:21
【问题描述】:

我正在尝试设置从我的 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

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

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

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

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

我尝试的另一种方法是手动 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 匹配的数量(几乎就是我要找的)。

【问题讨论】:

  • 只是想确认一下:你想要匹配的记录数,还是给定关键字出现的次数?
  • 给定关键字出现在同一个文档中的次数,这意味着 sphinx 术语中的 hit_count,因此匹配的记录数,而不仅仅是关键字计数。

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


【解决方案1】:

所以,要计算出每个文档的点击次数,您几乎走在正确的轨道上,只需将其导入 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 字符串键作为模型的主键(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 来确定返回的记录数每个请求。总共有 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"]

【讨论】:

  • 感谢您的建议!实际上我昨天想出了一些东西,这就是我所做的:在控制器中我把@ testing = Article.search params[:search], :without => {:is_active => false}, :ranker => :bm25 (is_active 是我的软删除标志,不想搜索已删除的条目)并且在视图中我只是显示了@ testing.total_entries 编号。如果我理解它是正确的,它会显示它找到的符合我的搜索条件的文章总数,所以几乎是 hit_count!除非我误读了文档的某些部分并且我得到的数字是其他的。
  • 术语在每个结果中出现的次数 (hit_count) 与至少有一个匹配项的记录数 (total_entries) 之间存在区别。
猜你喜欢
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多