在 Thinking Sphinx 查询中指定自定义逻辑?

Specify custom logic in Thinking Sphinx query?

我有一个 Thinking Sphinx (V3) 索引,看起来像这样(我使用的是 Rails 3.2):

ThinkingSphinx::Index.define(:search_table, :with => :active_record) do

    # fields
    indexes public

    # attributes
    has members.id, as: :members
end

search_table 索引的关键元素是一个布尔字段 public 和一个 has_many 整数属性,名为 members.

假设控制器中存在 member_id 值。我想在满足以下谓词的 Thinking Sphinx 查询中获取所有结果:

public = true OR (public = false AND (members CONTAINS member_id))

我已经尝试在 Thinking Sphinx 查询中指定自定义 SQL,但我被卡住了。谁能指出我正确的方向?

这三个部分:

首先,您需要将 public 作为属性而不是字段:

has public

然后,您可以使用 Sphinx 的 IN function(请注意 Sphinx 将 true/false 存储为 1/0)为您的搜索查询构造一个动态属性:

SearchTable.search(
  select: "*, public = 1 OR IN(members, #{member.id} AS public_or_member"
)

最后一步是按该动态属性过滤:

SearchTable.search(
  select: "*, public = 1 OR IN(members, #{member.id} AS public_or_member",
  with:   {public_or_member: true}
)

无关,但如果您的示例准确描述了您的 model/database,我会 高度 建议将 public 列的名称更改为某个名称否则,因为 public 是 Ruby 中的关键字,可能导致 bugs/confusion.