2016-11-24 40 views
6

let ben Belgesi aşağıdaki arama yanıt olarak tüm Üst düzey alanları ile iç içe nesneleri gelmiş demek eşleşen alın:ElasticSearch - sadece

{ 
    id: 1, 
    name: "xyz", 
    users: [{ 
     name: 'abc', 
     surname: 'def' 
    }, { 
     name: 'xyz', 
     surname: 'wef' 
    }, { 
     name: 'defg', 
     surname: 'pqr' 
    }] 
} 

Ben sadece arama tepki olarak tüm Üst düzey alanları ile iç içe nesneleri eşleştirme Get istiyorum. Ben adı 'abc' olan kullanıcılar için/filtre ararsanız Yani , ben bunu nasıl

{ 
    id: 1, 
    name: "xyz", 
    users: [{ 
     name: 'abc', 
     surname: 'def' 
    }] 
} 

tepki

altına istiyor?

Referans: select matching objects from array in elasticsearch iç içe geçmiş dışındaki tüm kök alanları olan ve daha sonra sadece iç içe alanda iç hit eşleşen, o zaman belirterek böyle bir önceki cevabı yeniden kullanabilirsiniz ile ok iseniz

+0

Beklenen çıktı nedir? – Backtrack

+0

Yani temelde yukarıdaki gibi sonuç almak için 'GET' sorgusuna ihtiyacım var? – Kulasangar

+0

Söz konusu beklenen çıktı eklendi –

cevap

6

biraz daha karmaşık kaynak filtreleme parametre: geç Belki

{ 
    "_source": { 
    "includes": [ "*" ], 
    "excludes": [ "users" ] 
    }, 
    "query": { 
    "nested": { 
     "path": "users", 
     "inner_hits": {  <---- this is where the magic happens 
     "_source": [ 
      "name", "surname" 
     ] 
     }, 
     "query": { 
     "bool": { 
      "must": [ 
      { 
       "term": { 
       "users.name": "abc" 
       } 
      } 
      ] 
     } 
     } 
    } 
    } 
} 
+0

Btw, inner_hits'i boş tutarak iç içe nesnelerin tüm alanlarını alabiliriz, yani "inner_hits": {} –

+0

Evet, '_source' öğesini 'iç_hits 'bölümüne ekledim adı ve soyadı ' – Val

+0

belirtilen daha fazla bir şey var mı? – Val

0

, benim iç içe ilişkiye elemanı sınırlamak için sıralama iç içe kullanmak, burada bir örnek:

"sort": { 
    "ouverture.periodesOuvertures.dateDebut": { 
     "order": "asc", 
     "mode": "min", 
     "nested_filter": { 
     "range": { 
      "ouverture.periodesOuvertures.dateFin": { 
      "gte": "2017-08-29", 
      "format": "yyyy-MM-dd" 
      } 
     } 
     }, 
     "nested_path": "ouverture.periodesOuvertures" 
    } 
    }, 

5.5 ES'den (sanırım), iç içe geçmiş sorgudaki filtreyi kullanabilirsiniz. İşte iç içe sorgu filtresinin bir örneği kullandığım: Bu yardımcı olabilir

{ 
      "nested": { 
       "path": "ouverture.periodesOuvertures", 
       "query": { 
       "bool": { 
        "must": [ 
        { 
         "range": { 
         "ouverture.periodesOuvertures.dateFin": { 
          "gte": "2017-08-29", 
          "format": "yyyy-MM-dd" 
         } 
         } 
        }, 
        { 
         "range": { 
         "ouverture.periodesOuvertures.dateFin": { 
          "lte": "2017-09-30", 
          "format": "yyyy-MM-dd" 
         } 
         } 
        } 
        ], 
        "filter": [ 
        { 
         "range": { 
         "ouverture.periodesOuvertures.dateFin": { 
          "gte": "2017-08-29", 
          "format": "yyyy-MM-dd" 
         } 
         } 
        }, 
        { 
         "range": { 
         "ouverture.periodesOuvertures.dateFin": { 
          "lte": "2017-09-30", 
          "format": "yyyy-MM-dd" 
         } 
         } 
        } 
        ] 
       } 
       } 
      } 
      } 

Hope;)

Artı ES son sürümünde değilse (5.5) inner_hits Sorgunuzla yavaşlatacağı Including inner hits drastically slows down query results