如何实现Stack Overflow之类的搜索

Moh*_*ain 6 search ruby-on-rails

我使用SphinxThinking Sphinx实现了全文搜索.我想添加列式搜索.有点像:-(以Stack Overflow为例)

假设您想要查看与您相关的活动,只需输入:

  user:me
Run Code Online (Sandbox Code Playgroud)

然后它将返回一个结果,其中包含与piemesons相关的所有问题和答案.

如果你输入

 votes:15
Run Code Online (Sandbox Code Playgroud)

然后它将返回一个结果,所有问题都标记为超过15票.

如果你输入

  user:me votes:15
Run Code Online (Sandbox Code Playgroud)

然后它会以15票以上的票数返回属于你的所有问题和答案.

我怎么能实现这个呢?

现在我的搜索结果基于全文搜索.如何包含这些功能?

在Sphinx或Solr或任何其他搜索引擎中可以使用任何选项吗?

ska*_*lee 2

:with思考狮身人面像的选项。

首先,您必须在索引定义中定义这些属性(查看此处的属性部分)。

has views_count, :as => :views, :type => :integer
has user.id, :as => :user, :type => :integer
Run Code Online (Sandbox Code Playgroud)

然后你可以搜索这样的帖子:

Post.search '', :with => {:views => 12..maxint, :user => User.first.id}
Run Code Online (Sandbox Code Playgroud)

(我不确定是否有更优雅的给出开放范围的可能性,但 12..max_int 应该足够了)

两件重要的事情:

  1. 如果你想计算相关对象(例如响应),你应该使用计数器缓存
  2. 如果您的“用户”是多态关联,我建议"CRC32(CONCAT(user_type, user_id))"而不是user.id