Elastic Search / Tire: Wie ordne ich ein Assoziationsattribut zu?

Ich benutzeReifen für die elastische Suche. In meiner Bewerbung habe ich 2 Modelle; Preis und Produkt.

Ich versuche, meine Preisklasse zu durchsuchen und das Produkt zu verwenden, zu dem es gehört:name Attribut für das Suchfeld. Im Moment, wenn ich ein Produkt namens hatteProduct 1 Wenn Sie "pro", "prod" oder "duct" eingeben, werden keine Ergebnisse angezeigt. Wenn Sie jedoch "Produkt" oder "Produkt" eingeben, werden die Ergebnisse angezeigt. Ich glaube, das Problem liegt in meiner Zuordnung. Ich habe mir die Abfrage und deren:

...localhost:3000/search/results?utf8=%E2%9C%93&query=product

Wenn ich denke, sollte es sein:

...localhost:3000/search/results?utf8=%E2%9C%93&query:product=product

Nach dieser Frage zu urteilen:Die ElasticSearch-Zuordnung funktioniert nicht

Ich weiß nicht, wie ich meine machen sollparams[:query] den ... nehmenproduct.name nur wenn. Ich habe versucht zu benutzen:string params[:query], default_field: "product.name" aber das hat nicht funktioniert.

Ich möchte das nicht benutzen_all Feld.

Hier ist mein Code:

Preis.rb

  include Tire::Model::Search
  include Tire::Model::Callbacks

  def self.search(params)
    tire.search(load: true, page: params[:page], per_page: 20) do
       query do
         boolean do
            must { string params[:query] } if params[:query].present?
            must { term :private, false }
         end
       end
       sort do
         by :date, "desc"
         by :amount, "asc"
       end
    end
  end

  def to_indexed_json
    to_json( include: { product: { only: [:name] } } )
  end

  mapping do
    indexes :id,        type: "integer"
    indexes :amount,    type: "string", index: "not_analyzed"
    indexes :date,      type: "date",   index: "not_analyzed"
    indexes :private,   type: "boolean"
    indexes :product do
      indexes :name, type: "string", analyzer: "custom_analyzer"
    end
  end

  settings analysis: {
    analyzer: {
      custom_analyzer: {
        tokenizer: [ "whitespace", "lowercase" ],
        filter: [ "ngram_filter", "word_delimiter_filter" ],
        type: "custom"
      }
    },
    filter: {
      ngram_filter: {
        type: "nGram",
        min_gram: 2,
        max_gram: 15
      }
    },
    filter: {
      word_delimiter_filter: {
        type: "word_delimiter",
        generate_word_parts: true,
        generate_number_parts: true,
        preserve_original: true,
        stem_english_possessive: true
      }
    }
  }

Hat jemand Vorschläge oder weiß, wie man das Abfragefeld so einstellt, dass nur der Produktname verwendet wird?

Vielen Dank.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage