思考sphinx范围搜索

时间:2017-01-04 04:54:22

标签: thinking-sphinx

我想要一个只搜索当前记录的sphinx_scope。每个数据库记录都有一个字段status,其值为CURRENTARCHIVED

我已经实现了这个目标,但是我必须使用一个奇怪的结构才能到达那里;可能有更好的方法来做到这一点。

这就是我所拥有的:

指数/ letter_index.rb

ThinkingSphinx::Index.define :letter, :with => :real_time do
  # fields
  indexes title, :sortable => true
  indexes content

  # attributes
  has status, :type => :string
  has issue_date, :type => :timestamp
  has created_at, :type => :timestamp
  has updated_at, :type => :timestamp
end

模型/ letter.rb

class Letter < ActiveRecord::Base
  include ThinkingSphinx::Scopes
  after_save ThinkingSphinx::RealTime.callback_for(:letter)

  .. snip ..

  sphinx_scope(:archived) {
    {:with => {:status => "'ARCHIVED'"}}
  }

我遇到的问题是,如果我使用:with => {:status => 'ARCHIVED'},我的查询就会显示为

SELECT * FROM `letter_core` WHERE MATCH('search term') AND `status` = ARCHIVED AND `sphinx_deleted` = 0 LIMIT 0, 20
ThinkingSphinx::SyntaxError: sphinxql: syntax error, unexpected IDENT, expecting CONST_INT (or 4 other tokens) near 'ARCHIVED AND `sphinx_deleted` = 0 LIMIT 0, 20; SHOW META'

但是,如果我将其构造为:with => {:status => "'ARCHIVED'"},则会添加单引号并且查询成功。 :)

这是编写范围的正确方法,还是有更好的方法?

加分问题:我在哪里可以找到范围内允许的文档,例如:order:with:conditions等。

1 个答案:

答案 0 :(得分:0)

首先:对引号的需求是一个错误--Sphinx最近才允许对字符串属性进行过滤,因此为什么这不是很久以前的事情。我修补了Riddle(这是一个围绕Sphinx功能的纯Ruby包装的宝石,并由Thinking Sphinx使用),你可以在你的Gemfile中给出最新的旋转:

MPAndroidChart

至于Sphinx范围内的内容:可以进行正常搜索调用的任何内容。