2012-01-19 18 views
5

¿Existe una forma simple de combinar los resultados de múltiples búsquedas de Thinking Sphinx en un solo resultado? Todas estas búsquedas están en el mismo modelo, pero las búsquedas tienen distintos términos de búsqueda. Lo que trato de hacer es combinar los resultados para que puedan ser ordenados por una columna de fecha y recibir la paginación adecuada.Combinar los resultados de múltiples consultas de Thinking Sphinx en un único resultado paginado

Digamos que tengo una clase de Pensador y una clase de Idea.

class Thinker < ActiveRecord::Base 
    has_many :ideas 
end 

class Idea < ActiveRecord::Base 
    belongs_to :thinker 

    define_index do 
    indexes text 
    has created_at 
    end 
end 

Y digo que tengo dos pensadores, Bob y Alice. Quiero combinar las siguientes búsquedas:

bob.ideas.search 'pancakes', :order => :created_at, :sort_mode => :desc 
alice.ideas.search 'waffles', :order => :created_at, :sort_mode => :desc 

... y de alguna manera combinarlos de manera que el conjunto de ideas de Alicia de Bob (panqueques) y de (gofres) se mezclan entre sí, ordenados por descendiendo created_at, y debidamente paginado por Pensando en la Esfinge. En el caso de uso real, podría tener entre 2 y 15 búsquedas para combinar de esta manera.

Sé que el método de búsqueda devuelve una matriz ThinkingSphinx :: Search <. Pensé en empalmar manualmente estos objetos, pero el hecho de que estoy buscando tanto la clasificación como la paginación hace que esto sea un poco complicado.

¿Hay alguna manera elegante de hacer esto en Thinking Sphinx o no me falta nada y tengo que rodar el mío?

Respuesta

0

Probablemente pueda hacer esto con bastante facilidad, pero necesita volver a escribir sus consultas para ser más genérico y buscar en el modelo Idea.

Idea.search 'pancakes | waffles', :with => {:thinker_id => [bob.id, alice.id]}, 
            :order => :created_at, 
            :sort_mode => :desc, 
            :match_mode => :boolean 

Y su modelo sería:

class Idea < ActiveRecord::Base 
    belongs_to :thinker 

    define_index do 
    indexes text 
    has created_at, thinker_id 
    end 
end 
+1

Una sugerencia, pero esta consulta encontraría también encontrar ideas de Bob que contengan 'galletas', y las ideas de alice que contengan 'pancakes' . Solo quiero que el término de búsqueda "panqueques" se aplique a las ideas de bob y "waffles" a las ideas de alice. –

1
first_search = bob.ideas.search 'pancakes', :order => :created_at, :sort_mode => :desc 
second_search = bob.ideas.search 'pancakes', :order => :created_at, :sort_mode => :desc 
results = first_search.flatten + second_search.flatten 

Ahora puede ordenar por fecha como usted desee

sorted_results = results.sort_by(&:date) 

esperanza esto ayuda

4

Pensando Sphinx trabajar con Kaminari. Así que ya tienes kaminari en tu gemfile. Solo tiene que hacer:

result = bob.ideas.search 'pancakes', :order => :created_at, :sort_mode => :desc 
result += alice.ideas.search 'waffles', :order => :created_at, :sort_mode => :desc 

El resultado ya no es un ThinkingSphinx :: Search. Es una matriz

result = Kaminari.paginate_array(result) 

Su puede utilizar la paginación y el tipo simple en consecuencia

Cuestiones relacionadas