Esfinge - Quando usar 'tem' e 'índices' para campos
-
21-09-2019 - |
Pergunta
Instalei a Esfinge e o pensamento-sphinx há alguns dias no meu Ruby no Rails 2.3.2, e a pesquisa básica funciona muito bem. Isso significa, sem condições. Agora, quero filtrar a pesquisa com algumas condições.
Eu tenho o modelo de anúncio, e o índice parece o seguinte:
define_index do
indexes title, :as => :title, :sortable => true
indexes description, :as => :description, :sortable => true
end
Talvez eu esteja errado, mas notei isso apenas quando adicionei o :sortable => true
Sintaxe a esses atributos, eu poderia usá -los como condições em minha pesquisa. Caso contrário, não encontrará nada.
Agora, também estou usando o plugin Acts_as_taggable_on, que gerou minhas duas tabelas: tags e taggings. Eu não tenho um modelo para tags, eu só tenho acts_as_taggable_on :tags, :categories
no meu modelo de anúncios.
O que eu gostaria de fazer agora é filtrar por tags. Então, tentei adicionar ao meu índice has tags(:id), :as => :tag_ids
sem sorte, e também indexes tags(:id), :as => :tag_ids
Mas também não funcionou.
Como posso construir os índices para que eu possa fazer algo assim:
Announcement.search 'some word', :conditions => {:tag_ids => some_id}
E também, que é o diferente entre has
e indexes
Obrigado, Brian
Solução
Deixe -me responder suas perguntas ao contrário. indexes whatever
Espera uma string, é isso que a Sphinx procurará o texto que você fornece.
Por outro lado, has whatever
não adiciona esse conteúdo aos campos pesquisáveis. Ele espera números principalmente, porque você usa essas coisas para classificar e filtrar depois que a Sphinx já fez a pesquisa.
Finalmente, eu acredito que você quer has tags(:id), :as => :tag_ids
em seu modelo e :with => {:tag_ids => some_id}
em sua pesquisa em vez de usar :conditions
. As condições são usadas nos campos de texto que você indexou, como uma maneira de executar pesquisas de texto em campos específicos, em vez de todos os campos indexados. Com é usado para filtrar os resultados usando os atributos que você especificou has whatever
.