2012-03-11 2 views
0

У меня есть следующая модель:мышление Sphinx без условия

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 

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

ответ

2

От Thinking Sphinx FAQ:

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

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

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

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

Таким образом, вы можете фильтровать по нему так:

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

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

0

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

@articles = Article.search(params[:search], 
           :with => {:type => nil}, 
           :page => params[:page], 
           :per_page => 10) 
+0

В этом случае я получаю: ошибку Searchd (статус: 1): недействительный или усеченный запрос – Ch4rAss

1

Исключить О & Тип контакта от условий, таких как -

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

ИЛИ

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

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) 

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

+0

Я попытался это одно, но я все еще статьи с типом контакта и статьями в результате – Ch4rAss

+0

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

+0

попытаться восстановить индекс sphinx .. –

Смежные вопросы