Мыслящий сфинкс без условий

У меня есть следующая модель:

class Article < ActiveRecord::Base

  define_index do
    indexes content
    indexes :name, sortable: true
    has type
  end
end

и специальный тип статьи:

class About < Article
end

и то же самое для Contact

Я хотел бы иметь доступное для поиска действие индексирования статей без статей с типом «О программе» или «Контакты».

class ArticlesController < ApplicationController
  load_and_authorize_resource

  def index
    @articles = Article.search(params[:search],
                               :with_all => {:type => nil},
                               :page => params[:page],
                               :per_page => 10)
  end
end

Но переменная экземпляра @articles каждый раз содержит также статьи «О программе» и «Контакты».

Это очень странно (кажется, что will_paginate все портит):

@articles = Article.search(
  :without =>  {:type => %w(About Contact)}).include?(About.first) # false

@articles = Article.search(
  :without =>  {:type => %w(About Contact)},
  :page => 1,
  :per_page => 1000).include?(About.first) # true

=============================================================================

Наконец я сделал:

class Article < ActiveRecord::Base

  define_index do
    indexes content
    indexes :name, sortable: true

    has "CRC32(type)", :as => :article_type, :type => :integer
  end
end

а также:

class ArticlesController < ApplicationController

  load_and_authorize_resource

  def index
     @articles = Article.search(params[:search],
                               :without =>  {:article_type => ["About".to_crc32, "Contact".to_crc32]},
                               :page => params[:page],
                               :per_page => 10)
  end
end

и это работает. Спасибо, парни!


person Ch4rAss    schedule 11.03.2012    source источник


Ответы (3)


Из Часто задаваемые вопросы о Thinking Sphinx:

Фильтрация строковых атрибутов

Хотя у вас могут быть строковые столбцы в качестве атрибутов в Sphinx, они не сохраняются как строки. Вместо этого Sphinx вычисляет алфавитный порядок и присваивает каждой строке целочисленное значение, чтобы сделать их полезными для сортировки. Однако это означает, что почти невозможно фильтровать эти атрибуты.

Итак, чтобы обойти это, есть два варианта: во-первых, вместо этого используйте целочисленные атрибуты, если это возможно. Это работает для небольших наборов результатов (например, пол). В противном случае вы можете захотеть вручную преобразовать строку в целочисленное значение CRC:

has "CRC32(category)", :as => :category, :type => :integer

Таким образом, вы можете отфильтровать его следующим образом:

Article.search 'pancakes', :with => { :category => 'Ruby'.to_crc32 }

Конечно, это не удивительно чисто, но вполне сработает. Вы также должны принять к сведению, что кодирование CRC32 может иметь коллизии, поэтому это не идеальное решение.

person fuzzyalej    schedule 11.03.2012

Исключить тип «Информация и контакт» из таких условий, как -

@articles = Article.search(params[:search],
             :without => {:type => %w(About Contact)},
             :page => params[:page],
             :per_page => 10)

OR

Я не очень уверен в ниже, но вы можете попробовать ..

  define_index do
    indexes content
    indexes :name, sortable: true
    indexes(:type), :as => :article_type
  end

    @articles = Article.search(params[:search],
                 :without => {:article_type => %w(About Contact)},
                 :page => params[:page],
                 :per_page => 10)

Кроме того, убедитесь, что в ваших записях базы данных атрибут типа вставлен правильно.

person Sandip Ransing    schedule 11.03.2012
comment
Я попробовал это, но в результате я все еще получаю статьи с типом «Контакт» и «Статья». - person Ch4rAss; 11.03.2012
comment
@articles = Article.search( :without =› {:type =› %w(О контакте)}, :page =› 1, :per_page =› 1000).include?(About.first) #=› true - person Ch4rAss; 11.03.2012

Не могли бы вы использовать «with» вместо «with_all»? Например:

@articles = Article.search(params[:search],
                               :with => {:type => nil},
                               :page => params[:page],
                               :per_page => 10)
person Jimmy Baker    schedule 11.03.2012
comment
В этом случае я получаю: ошибка searchd (статус: 1): неверный или усеченный запрос - person Ch4rAss; 11.03.2012