ThinkingSphinx with_all OR查询

时间:2015-10-28 15:17:11

标签: ruby thinking-sphinx

我试图返回start_date end_date落在日期范围内的结果。我在我的TS查询中使用with_all,如下所示:

range = (start_date..end_date)
with_all = { start_date: [range], end_date: [range] }

但是,这不起作用,因为我认为这需要 start_dateend_date落在范围内。

我需要做什么才能在 start_dateend_date落在范围内时返回结果?

1 个答案:

答案 0 :(得分:0)

经过多次非摇滚相关的敲击后,我找到了一个有效的解决方案。

srange  = date_range[:start].to_datetime.utc.beginning_of_day.to_i
erange  = date_range[:end].to_datetime.utc.end_of_day.to_i

# * full range falls within start_date & end_date
# * start_date & end_date is within the full range
# * end range is within start_date & end_date
# * start range is within start_date & end_date

sphinx_select = "
*, (IF(
#{srange} >= start_date AND
#{srange} <= end_date AND
#{erange} >= start_date AND
#{erange} <= end_date, 1, 0) +

IF(
start_date >= #{srange} AND
start_date <= #{erange} AND
end_date   >= #{srange} AND
end_date   <= #{erange}, 1, 0) +

IF(
#{srange} <= start_date AND
#{srange} <= end_date AND
#{erange} >= start_date AND
#{erange} <= end_date, 1, 0) +

IF(
#{srange} >= start_date AND
#{srange} <= end_date AND
#{erange} >= start_date AND
#{erange} >= end_date, 1, 0)) as in_date_range"

MyModel.search('',
               select: select,
               where: {"in_date_range" => [1,2,3,4]})