2016-11-12 2 views
0

Ich verwende Elasticsearch und die Elasticsearch Rails gem. Ich habe zwei Modelle, die über ActiveRecord verknüpft sind, und ich versuche, sie mit Elasticsearch zu indizieren und zu durchsuchen.Elasticsearch Rails Indizierung Ausgabe

Hier ist mein Speicher Modell

store.rb

has_many :addresses 
has_many :jobs 

def as_indexed_json 
    self.as_json(include: { 
    customer: { include: { addresses: {}, jobs: {} } }, 
    vendors: {} 
    }) 
end 

settings index: { number_of_shards: 1 } do 
    mapping dynamic: 'false' do 
    indexes :id 
    indexes :store_number 
    indexes :manager 
    indexes :customer do 
     indexes :first_name 
     indexes :addresses do 
     indexes :city 
     indexes :state 
     end 
     indexes :jobs do 
     indexes :job_number 
     end 
    end 
    end 
end 

hier ist meine Adresse Modell:

def as_indexed_json 

end 

settings index: { number_of_shards: 1 } do 
    mapping dynamic: 'false' do 
    indexes :city 
    indexes :state 
    end 
end 

ich auch Searchkit als mein Frontend UI verwenden. Sokekit ist in der Lage, alle im Filialmodell vorhandenen Attribute (Filialnummer und Manager) zu aggregieren und anzuzeigen. Es ist jedoch nicht möglich, die verschachtelten Elemente anzuzeigen. Mit anderen Worten, ich kann die job_numbers nicht unter Jobs, die sich unter customer befinden, aggregieren und abrufen. Ich bin in der Lage, den Namen des Kunden usw. zu sehen. Ich habe versucht mit Typ: "geschachtelt" neben Jobs und allen anderen Objekten, aber das macht keinen Unterschied. Ich habe versucht, den as_indexed_json auch ohne Glück zu justieren. Hat jemand eine Idee dazu? Ich bin auf dieses hier gestoßen.

Antwort

0

bereiten as_indexed_json Methode diese zu ändern:

def as_indexed_json() { 
    hash = self.as_json() 
    hash['jobs'] = self.jobs.map(&:job_number) 
    hash['address_state'] = self.addresses.map(&:state) 
    hash['address_city'] = self.addresses.map(&:city) 
    hash 
} 

Überschreibung der search in Ihrem store Modell wie folgt aus:

def self.search(query) 
    @search_definition = { 
    query: {} 
    } 
    unless query.blank? 
    @search_definition[:query] = { 
    bool: { 
     should: [ 
     { 
      multi_match: { 
      query: query, 
      fields: ['store_number', 'manager', 'jobs', 'address_state', 'address_city'], 
      operator: 'and' 
      } 
     } 
     ] 
    } 
    } 
    else 
    @search_definition[:query] = { match_all: {} } 
    end 
    __elasticsearch__.search(@search_definition) 
end 

Sie müssen auch die Mapping-Einstellungen zu ändern, wie folgt aussehen:

settings index: { number_of_shards: 1 } do 
    mapping do 
    indexes :store_number, analyzer: 'keyword' 
    indexes :jobs, analyzer: 'keyword' 
    indexes :address_state, analyzer: 'keyword' 
    indexes :address_city, analyzer: 'keyword' 
    indexes :manager, type: 'multi_field' do 
      indexes :manager, analyzer: 'snowball' 
      indexes :tokenized, analyzer: 'simple' 
    end 
    end 
end 

Thes Die Einstellungen für den Index sind nur Beispiele. Sie können verschiedene types, analyzers und tokenizers verwenden, die Ihrem Anwendungsfall am besten dienen.

Damit Sie werden die Ergebnisse erhalten, wenn Sie ein Geschäft suchen, indem sie Felder indiziert ist und auch mit job_number, city und auch state, Obwohl, wenn Sie die Zuordnungen als Filter, die Suchmethode und die Abbildung unterschiedlich sein verwenden möchten.

+0

Danke für all das, ich denke, ich folge, was Sie sagen. Ich denke, das einzige, worüber ich mir nicht sicher bin, ist, wenn Sie sagen, dass Sie die as_indexed_json-Methode außer Kraft setzen. Adressen und Jobs sind auf dem Kundenmodell. Also, sollte ich das im Kundenmodell platzieren? Die Hierarchie mit dem, was ich habe, ist Geschäft -> Kunde -> Adresse oder Geschäft -> Kunde -> Jobs. Ich verstehe die self.addresses.map (&: city), will nur sicher sein wo ich sie hinstelle. Danke nochmal für die Hilfe dazu. –

+0

@MikeRiley aus dem Code, den Sie gepostet haben, das 'Store'-Modell' has_many' 'Adressen' und der' Store' auch 'has_many'' Jobs', ich gehe davon aus, dass 'store' Ihr durchsuchbares Modell ist, dh Sie suchen wollen 'Speichern' Datensätze. Wenn das der Fall ist, geht alles, was ich gepostet habe, in das "Store" -Modell. –

Verwandte Themen