在 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.
我有一个 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.