【问题标题】:Specify custom logic in Thinking Sphinx query?在 Thinking Sphinx 查询中指定自定义逻辑?
【发布时间】:2015-01-18 23:34:15
【问题描述】:

我有一个 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,以及一个名为members 的整数的has_many 属性。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    三个部分:

    首先,您需要将 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}
    )
    

    不相关,但如果您的示例准确描述了您的模型/数据库,我会强烈建议将 public 列的名称更改为其他名称,因为 public 是关键字在 Ruby 中,可能会导致错误/混乱。

    【讨论】:

    • 谢谢,帕特!这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 2021-05-17
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    相关资源
    最近更新 更多