思维狮身人面像排名与统计
Thinking sphinx ranking and statistics
我正在尝试设置从我的 Sphinx 索引中获取一些数字的功能,但不确定如何获取我想要的信息。
我有一个包含文章的 mysql 数据库,为该数据库设置了 sphinx 索引和全文搜索,一切正常。我想要的是得到一些数字:
- 搜索文本(关键字或关键短语)在所有时间出现在所有文章中的次数(更有可能限于 "articles from time interval from X and to Y")
- 与之前相同,但 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"]
我正在尝试设置从我的 Sphinx 索引中获取一些数字的功能,但不确定如何获取我想要的信息。
我有一个包含文章的 mysql 数据库,为该数据库设置了 sphinx 索引和全文搜索,一切正常。我想要的是得到一些数字:
- 搜索文本(关键字或关键短语)在所有时间出现在所有文章中的次数(更有可能限于 "articles from time interval from X and to Y")
- 与之前相同,但 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"]