2011-11-15 25 views
27

Tamam, şimdiye kadar bunu çözemedim. Birinin umuduyla biraz içgörü sunabilir.Yuvalanmış nesneleri elastik arama ile arama

Aşağıdaki belgeler dikkate alındığında, video başlığında "test" olan bir videoyla tüm belgeleri nasıl arayabilirim? HTTP API kullanıyorum. (Temel olarak, elastik arama ile iç içe nesneleri aramak nasıl? Oraya belgeler olmalı biliyorum ama gerçekten herhangi bulmak mümkün olmamıştır.)

[{ 
    id:4635, 
    description:"This is a test description", 
    author:"John", 
    author_id:51421, 
    video: { 
     title:"This is a test title for a video", 
     description:"This is my video description", 
     url:"/url_of_video" 
    } 
}, 
{ 
    id:4636, 
    description:"This is a test description 2", 
    author:"John", 
    author_id:51421, 
    video: { 
     title:"This is an example title for a video", 
     description:"This is my video description2", 
     url:"/url_of_video2" 
    } 
}, 
{ 
    id:4637, 
    description:"This is a test description3", 
    author:"John", 
    author_id:51421, 
    video: { 
     title:"This is a test title for a video3", 
     description:"This is my video description3", 
     url:"/url_of_video3" 
    } 
}] 

cevap

24

Tamam, KKO! Sonunda bu sayfaları buldum (önceden dokümanlar ile daha fazla zaman geçirmeliydim) ve videoyu barındıran özelliği şu şekilde ayarlıyoruz: iç içe geçmiş, ardından iç içe geçmiş sorguları kullan.

http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-query.html

http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-nested-filter.html

Umut bu birileri yol olur.

+1

Vide'yi yerleştirmeniz gerekmiyor. Http://www.elasticsearch.org/blog/2010/02/12/yourdatayoursearch.html adresine ve aşağıdaki cevabıma bakın. – dira

+0

Güncellenmiş link: http://www.elasticsearch.org/blog/your-data-your-search/ – swatkins

+1

Bu blog yazısını gerçekten faydalı buldum: http://www.elasticsearch.org/blog/managing -relations-inside-elasticsearch/ – Quin

42

Videoyu yerleştirmeniz gerekmez; onu normal bir alan olarak haritalayabilirsiniz. Hangisi

'video:title': "This is a test title for a video3", 
'video:description':"This is my video description3", 
'video:url':"/url_of_video3" 

depolayacak Ve video.title:'test' aramak anlamına gelir.

Elde ettiğim kadarıyla, iç içe geçmiş alanlar, birden çok iç içe geçmiş öğeniz olduğunda ve yalnızca iç içe geçmiş öğeler için bir sorgu oluşturmak istediğinizde kullanışlıdır. Örneğin, ama hepsi de, test saniyede ilk video ve description2 olduğundan bu (size sahte bir sonuç verecektir Video iç içe değildi video.title: 'test' and video.description: 'description2' arayabilir ve isterseniz bu verileri

[{ 
    id:4635, 
    description:"This is a test description", 
    author:"John", 
    author_id:51421, 
    video: [ 
     { 
     title:"This is a test title for a video", 
     description:"This is my video description", 
     url:"/url_of_video" 
     }, 
     { 
     title:"This is an example title for a video", 
     description:"This is my video description2", 
     url:"/url_of_video2" 
     } 
    ] 
}, 
{ 
    id:4637, 
    description:"This is a test description3", 
    author:"John", 
    author_id:51421, 
    video: [ 
     { 
     title:"This is a test title for a video3", 
     description:"This is my video description3", 
     url:"/url_of_video3" 
     } 
    ] 
}] 

sahip İkinizin de sahip olduğu video alanı.

Bu durumda, videoyu yuvalanmış olarak eşlerseniz, her videoyu ayrı bir varlık olarak hatırlayacak ve bu koşullara uyan bireysel videoları arayacak, video.title: 'test' and video.description: 'description2' için hiçbir şey döndürmeyecek, video.title: 'example' and video.description: 'description2' için bir sonuç döndürecektir .

+6

Bu cevap, bir alt diziyi veya nesneyi yuvalamak ve basitçe saklamak arasında önemli bir ayrım sağlar. Yuvalama, kişinin dizinine ek belgeler oluşturur ve @swatkins vakasında gereksiz yere işleri zorlaştırır. –

+0

Dizeler listesi olan bir alana ne dersiniz? Bu listenin en az bir eşleşmesi olan listenin ve belgelerin yalnızca öğelerini nasıl alırsınız? –

İlgili konular