2016-08-29 5 views
0

Ich muss Facetten für meine App tun. Für den Moment möchte ich Facetten auf der Ergebnisseite nach der Suche erscheinen. Ich bin auf Schienen und sorry für mein schlechtes Englisch, ich bin Französisch.Wie Implantat Facetten mit elasticsearch auf Schienen

Ich habe 2 Modelle: Camping.rb und Caracteristiquetest.rb. Ich habe den Verein has_many/gehört_to gemacht. In caracteristiquestest, habe ich eine Spalte camping_id und andere String-Spalten "piscine" und "Barbecue".

Also, nach vielen Tests, fand ich eine Lösung, um einen Beitrag mit dem Wert "non" auf caracteristiquetest.barbecue (siehe nach) zu finden. Jetzt versuche ich dies auf App zu implantieren.

Ich habe einen Fehler:

C: /Sites/campsite/app/models/camping.rb: 66: Syntaxfehler, unerwartete ':', in der Erwartung => {caracteristiquetest.barbecue: " nicht "}}]^ C: /Sites/campsite/app/models/camping.rb: 66: Syntaxfehler, unerwartet '}', erwartet keyword_end {caracteristiquetest.barbecue:" non "}}]^ C: /Sites/campsite/app/models/camping.rb:85: Syntaxfehler, unerwartet Ende der Eingabe, erwartet keyword_end

Wie kann man das beheben? By the way, nach der Befestigung, wie kann ich dies auf meine Sicht implantieren? Ich möchte diese Funktion nach der Suche implantieren, damit der Benutzer "Grill" "Ja"/"Nein" filtern kann.

Danke für Ihre Hilfe.

_search mit head_plugin Elasticsearch Wenn ich diese laufen, ich habe das gute Ergebnis

{ 
"query": { 
    "bool": { 
    "must": [ 
     {"term": 
     {"caracteristiquetest.barbecue": "non"}}] 
    } 
} 
} 

campings_controller.rb

def homesearch 
     @campings = Camping.custom_search((params[:q].present? ? params[:q] : '*')) 
    end 

#Page de résultats 
    def result 
    if params[:q].blank? 
     redirect_to action: :index and return 
    else 
    @campings = Camping.custom_search((params[:q].present? ? params[:q] : '*')).page(params[:page]).per(14).results 
    end 

    end 

camping.rb

mapping do 
    indexes :name, boost: 8 
    indexes :adresse 
    indexes :commune, boost: 10 
    indexes :description 
    indexes :nomdep, boost: 10 
    indexes :nomregion, boost: 10 
    indexes :ville_id 
    indexes :region_id 
    indexes :departement_id 
    indexes :latitude 
    indexes :longitude 
    indexes :etoile 
    indexes :user_id 
    indexes :caracteristiquetest_id 
    #On implante les données du modèle supplémentaire 
    indexes :caracteristiquetests, type: 'nested' do 
     indexes :id, type: 'integer' 
     indexes :piscine, type: 'string' 
     indexes :barbecue, type: 'string' 
     indexes :camping_id, type: 'integer' 
    end 
end 

    def as_indexed_json(options = {}) 
    self.as_json(only: [:name, :adresse, :code_postale, :commune, :description, :nomdep, :nomregion, :latitude, :longitude, :etoile, :caracteristiquetest_id], 
    include: {caracteristiquetest: {only: [:id, :piscine, :barbecue, :camping_id]}}) 
    end 

    class << self 
    def custom_search(query) 
     __elasticsearch__.search(query: multi_match_query(query), aggs: aggregations) 
    end 

    def multi_match_query(query) 
     { 
     multi_match: { 
      query: query, 
      type: "best_fields", 
      fields: ["name^6", "nomdep^10", "commune^8", "nomregion^7"], 
      operator: "and" 
     } 
     } 
    end 
def aggregations 
    { 
query: { 
    bool: { 
    must: [ 
     {term: 
     {caracteristiquetest.barbecue : "non"}}] 
    } 
} 
} 
    end 
    end 

homesearch.html.erb

<div class="container"> 
    <div class="row"> 
     <div class="search"> 
        <%= form_tag(result_path, method: :get) %> 
         <%= text_field_tag :q, params[:q], class:"search-query form-control" %> 
        <%= submit_tag "GO", class:"btn btn-danger", name: nil %> 
     </div> 
    </div> 
</div> 
+0

Sie versuchen '.facets' auf etwas zu nennen, die' nil' ist. In deinem Fall ist '@ camping'' nil'. Dies liegt wahrscheinlich daran, dass Sie sie niemals in der Controller-Aktion festlegen, die die Vorlage 'result.html.erb' rendert. Ich sehe, dass Sie "@ camping" in der Aktion "index", aber nicht in der Aktion "result" festlegen. –

+0

@CarlosRamirezIII Du hast recht, es ist ein Fehler, ich vergesse das "s" zu @camping. Ich habe den Beitrag bearbeitet. Jetzt habe ich einen anderen Fehler undefinierte Methode 'Facetten 'für # nicolaswecandoit

Antwort

1

Sie versuchen, mit der results Schnittstelle der Antwort von Elasticsearch zurück zu interagieren. Versuchen Sie, direkt mit dem response Objekt, z.

# don't call `.results` here because you want the full response object 
@campings = Camping.__elasticsearch__.search(...) 

Gemäß der Dokumentation

Das zurückgegebene Antwort-Objekt ist eine reiche Wrapper um die JSON von Elasticsearch zurückgegeben, die den Zugang zur Antwort Metadaten und die tatsächlichen Ergebnisse („Hits“).

Quelle: http://www.rubydoc.info/gems/elasticsearch-model/#Search_results

Sie sollten in der Lage sein, herauszufinden, wie die Facetten zu holen und andere Daten, die Sie benötigen, indem der resultierende JSON Prüfen und Lesen der Elasticsearch Dokumentation selbst.

https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

+0

Danke für diese Antwort @Carlos Ich entferne .Ergebnisse in @campings = Camping.elasticsearch ... Ich habe immer ein Fehler "undefined Methode' Facetten 'für # "JSON ist das Problem? Was kann ich tun ? Entschuldigung für Noob-Fragen ... – nicolaswecandoit

+0

Sie rufen '.facets', aber das ist möglicherweise nicht der Methodenname, den Sie benötigen. Mein Vorschlag wäre, die @ @ campings-Variable zu überprüfen und zu sehen, welche Methoden darauf definiert wurden. Da es sich nur um eine ElasticSearch-JSON-Antwort handelt, sollte die Elasticsearch-Dokumentation selbst hilfreich sein, um herauszufinden, wie auf die Facetten der Antwort zugegriffen werden kann. Bitte lesen Sie die Dokumentation und sehen Sie, wie das Antwortobjekt strukturiert ist und wo sich die Facetten befinden. –

+0

Ok ich werde das tun, ich werde zurück sein. Sicherlich Elasticsearch ist esy nicht für den Anfänger :) Nur eins: wie kann es prüfen? – nicolaswecandoit