2016-03-28 21 views
2

RoR'da çok eşleşmeli sorgu ile ilgili bir sorun yaşıyorum. Elastic Search yapılandırılmış ve çalışıyor, ancak şu ana kadar çalışmış gibi görünen kümeler oluşturmaya çalışıyorum, fakat nedense, toplandığım alanda arama yapamıyorum.Elasticsearch: Yuvalanmış alanlarda çok eşleme sorgusu

settings :index => { :number_of_shards => 1 } do 
     mapping do 
      indexes :id, index: :not_analyzed 
      indexes :name 
      indexes :summary 
      indexes :description 

      indexes :occasions, type: 'nested' do 
      indexes :id, type: 'integer' 
      indexes :occasion_name, type: 'string', index: :not_analyzed 

      ... 

      end 
     end 
     end 




    def as_indexed_json(options = {}) 
    self.as_json(only: [:id, :name, :summary, :description], 
       include: { 
        occasions:   { only: [:id, :occasion_name] }, 
        courses:    { only: [:id, :course_name] }, 
        allergens:   { only: [:id, :allergen_name] }, 
        cookingtechniques: { only: [:id, :name] }, 
        cuisine:    { only: [:id, :cuisine_name]} 
       }) 
    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^9", "summary^8", "cuisine_name^7", "description^6", "occasion_name^6", "course_name^6", "cookingtechniques.name^5"], 
       operator: "and" 
      } 
     } 
    end 

Ben toplayarak am alan olur "occasion_name" nin ayrı multi_match_query belirtilen tüm alanları arama yapabilmek duyuyorum: Bu benim modelden özüdür. Alanın doğru endekslendiğini kontrol ettim (elastik arama başlığı eklentisi kullanarak). Ayrıca, kümelenmiş occasion_names ile yönlerini görünümümde görüntüleyebiliyorum. Adayı kaldırma ve occasion_name'da arama da dahil olmak üzere düşünebileceğim her şeyi denedim, ancak yine de hayır şansı. (elasticsearch-rayils gemini kullanıyorum)

Herhangi bir yardım çok takdir edilecektir.

Düzenleme: bende

bu raylardan sorguyu ES:

@search= 
    #<Elasticsearch::Model::Searching::SearchRequest:0x007f91244df460 
    @definition= 
    {:index=>"recipes", 
    :type=>"recipe", 
    :body=> 
     {:query=> 
     {:multi_match=> 
      {:query=>"Christmas", 
      :type=>"best_fields", 
      :fields=>["name^9", "summary^8", "cuisine_name^7", "description^6", "occasion_name^6", "course_name^6", "cookingtechniques.name^5"], 
      :operator=>"and"}}, 
     :aggs=> 
     {:occasion_aggregation=> 
      {:nested=>{:path=>"occasions"}, :aggs=>{:id_and_name=>{:terms=>{:script=>"doc['occasions.id'].value + '|' + doc['occasions.occasion_name'].join(' ')", :size=>35}}}}}}}, 

Bu içeriği anlamsızdır (test için kullandığım benim kukla tarifleri 1'i için dizine alır tüm örneğidir - sadece) test etmek için kullanabilir: I m

: 2

{ 
"_index": "recipes", 
"_type": "recipe", 
"_id": "7", 
"_version": 1, 
"_score": 1, 
"_source": { 
"id": 7, 
"name": "Mustard-stuffed chicken", 
"summary": "This is so good we'd be surprised if this chicken fillet recipe doesn't become a firm favourite. Save it to your My Good Food collection and enjoy", 
"description": "Heat oven to 200C/fan 180C/gas 6. Mix the cheeses and mustard together. Cut a slit into the side of each chicken breast, then stuff with the mustard mixture. Wrap each stuffed chicken breast with 2 bacon rashers – not too tightly, but enough to hold the chicken together. Season, place on a baking sheet and roast for 20-25 mins.", 
"occasions": [ 
{ 
"id": 9, 
"occasion_name": "Christmas" 
} 
, 
{ 
"id": 7, 
"occasion_name": "Halloween" 
} 
, 
{ 
"id": 8, 
"occasion_name": "Bonfire Night" 
} 
, 
{ 
"id": 10, 
"occasion_name": "New Year" 
} 
], 
"courses": [ 
{ 
"id": 9, 
"course_name": "Side Dish" 
} 
, 
{ 
"id": 7, 
"course_name": "Poultry" 
} 
, 
{ 
"id": 8, 
"course_name": "Salad" 
} 
, 
{ 
"id": 10, 
"course_name": "Soup" 
} 
], 
"allergens": [ 
{ 
"id": 6, 
"allergen_name": "Soya" 
} 
, 
{ 
"id": 7, 
"allergen_name": "Nut" 
} 
, 
{ 
"id": 8, 
"allergen_name": "Other" 
} 
, 
{ 
"id": 1, 
"allergen_name": "Dairy" 
} 
], 
"cookingtechniques": [ 
{ 
"id": 15, 
"name": "Browning" 
} 
], 
"cuisine": { 
"id": 1, 
"cuisine_name": "African" 
} 
} 
} 

DÜZENLEME ... @rahulroc tarafından önerildiği gibi durumlar için arama çalışması için anaged, ama şimdi başka bir şeye arayamazsınız

def multi_match_query(query) 
    { 
     nested:{ 
      path: 'occasions', 
      query:{ 
     multi_match: 
     { 
      query: query, 
      type: "best_fields", 
      fields: ["name^9", "summary^8", "cuisine_name^7", "description^6", "occasion_name^6", "course_name^6", "cookingtechniques.name^5"], 
      operator: "and" 
     } 
    } 

     } 
    } 
end 

GÜNCELLEME: eklemek, birden çok iç içe geçmiş alanlar - Dinlenmeye eklemek çalışıyorum Benim birikimlerimden ancak ben daha önce olduğu gibi benzer bir problemle karşılaşıyorum. Son hedefim, toplamaları filtreler olarak kullanmaktır, bu yüzden sorguma yaklaşık 4 tane daha yuvalanmış alan eklemem gerekir (ayrıca alanları aranabilir hale getirmek istiyorum). @rahulroc + tarafından sağlanan çalışma sorgusu aşağıdadır. İçemediğim yuvalanmış alan. İndeksleme açısından daha önce olduğu gibi her şey çalışıyor ve yeni eklenen alan için birikimleri görüntüleyebiliyorum, ancak üzerinde arama yapamıyorum.

def multi_match_query(query) 
     { 

     bool: { 
      should: [ 
       { 
        nested:{ 
         path: 'occasions', 
         query: { 
          multi_match: 
          { 
             query: query, 
             type: "best_fields", 
             fields: ["occasion_name"] 

            } 
         } 
        } 
       }, 

       { 
        nested:{ 
         path: 'courses', 
         query: { 
          multi_match: 
           { 
            query: query, 
            type: "best_fields", 
            fields: ["course_name"] 

           } 
         } 
        } 
       }, 

       { 
        multi_match: { 
         query: query, 
         fields:["name^9", "summary^8", "cuisine_name^7", "description^6"], 

        } 
       } 
      ] 
     } 


     } 
    end 
+0

Raylara aşina değilim, ancak bazı ES deneyimlerim var. ElasticSearch'e gönderilen JSON sorgusunu gösterebiliyor musunuz? – Cfreak

+0

Merhaba, sadece ilk gönderimi düzenledim - sorguyu ekledim. Teşekkürler – martini

+0

occasion_name yuvalanmış bir alandır. – Rahul

cevap

3

ayrı bir iç içe oluşturmanız gerekir: - (Sorun sadece yeni bir alandır Geri kalan alanlar hala çalışıyor ve aranabilir) Ben bu sorgunun farklı varyasyonlar denedi ama işe gelemedi iç içe geçmiş bir alanı eşleştirmek için madde

"query": { 
    "bool": { 
     "should": [ 
      { 
       "nested": { 
        "path": "occassions", 
        "query": { 
         "multi_match": { 
          "query": "Christmas", 
          "fields": ["occassion_name^2"] 
         } 
        } 
       } 
      }, 
      { 
       "multi_match": { 
        "query": "Christmas", 
        "fields":["name^9", "summary^8", "cuisine_name^7", "description^6","course_name^6"]    } 
      } 
     ] 
    } 
} 
+0

eşleme sorgusunda doğrudan erişilemiyor Öneriniz için, düzenleme çalışması 2'ye göre arama çalışmalarını yapmayı başardım, ancak şimdi başka bir şey arayamıyorum – martini

+0

Diğer alanlar yuvalanmış kapsamına ait değil özel günler. Diğer alanların kendi alanlarında olması gerekir. Bool-should cümlede ayrı cümleler yap. Bir seferde tam sorguyu sağlayacağım. – Rahul

+0

Soruyu – Rahul

İlgili konular