2016-04-25 6 views
0

Meine Suche funktioniert gut. Aber ich muss "1" oder "2" eingeben, um Ergebnisse von "Mitbewohner" oder "Untermiete" zu erhalten. Modell hat eine Spalte namens category_id, die eine ganze Zahl ist. Modell Category hat Spalte :name, die eine Zeichenfolge ist.Wie kann ich category.name mithilfe von elasticsearch in Rails suchen?

So habe ich category_id 1 mit „Mitbewohner“ und 2 „untervermietet“

unten ist mein Gehäuse Modell:

class Housing < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :title, use: :slugged 
    include Elasticsearch::Model 
    include Elasticsearch::Model::Callbacks 

    belongs_to :user 
    belongs_to :category 

    validates :title, :presence => true 
    validates :category_id, :presence => true 
    validates :created_at, :presence => false 
    validates :user_email, :presence => true 
    validates :description, :presence => false 
    validates_length_of :title, :maximum => 30 

    def self.search(query) 
     __elasticsearch__.search(
     { 
      query: { 
      # multi_match: { 
      simple_query_string: { 
       query: query, 
       fields: ['title^10', 'category_id'] 
      } 
      } 
     } 
    ) 
    end 

end 

Wie kann ich das beheben fields: ['title^10', 'category_id'] So können Benutzer „Mitbewohner“ suchen anstatt muss integer "1" suchen, um das Ergebnis des Mitbewohners zu erhalten?

Ich versuchte fields: ['title^10', 'category.name'], aber nicht funktioniert.

Antwort

0

fields: ['title^10', 'category.name'] wird nicht funktionieren, wenn Sie richtige Zuordnung definiert haben. Elasticsearch kennt Ihre Assoziationen nicht. ES ist ein Dokumentenspeicher und sucht mit seinem eigenen Dokumentenspeicher nach Datensätzen. Wenn Sie also Ihren Kategorienamen nicht zu dem in ES gespeicherten Dokument hinzufügen, können Sie ihn nicht durchsuchen.

TL;DR

eine Abbildung definieren. Beispiel:

mapping dynamic: 'strict' do 
    indexes :category do 
     indexes :name 
    end 
    indexes :title 
end 

Hier Kategorie wird nun als verschachteltes Objekt in Ihrem Index gespeichert werden und somit durchsuchbar ist category.name mit

+0

Dies funktioniert nicht .. –

+0

'Kategorie has_many: housings' und' Gehäuse belongs_to: Category' ist was ich habe Beziehung. Soll ich es ändern? –

+0

Wo definieren Sie diese Zuordnung? Wenn Sie es in einem Wohnungsmodell definieren, das eine Assoziation "gehört zu: Kategorie" hat, dann sollte es gut funktionieren. Sie müssen jedoch alle Attribute indizieren, nach denen Sie suchen müssen. Hier habe ich nur 'category.name' und' title' indiziert. Denken Sie daran, dass Sie Ihre Indizes zuerst neu erstellen müssen, da Elasticsearch Ihre Dokumente bereits in einem anderen Format indiziert hat. –

Verwandte Themen