2011-11-15 23 views
27

これまでのところ、これを把握することはできませんでした。誰かが洞察力を提供できると願っています。弾性検索でネストされたオブジェクトを検索する方法

以下のドキュメントがあると、ビデオタイトルに「テスト」のあるビデオを含むすべてのドキュメントを検索するにはどうすればよいですか?私はHTTP APIを使用しています。 (基本的には、どのように弾性検索でネストされたオブジェクトを検索するには?私はそこにドキュメントが存在しなければならない知っているが、私は本当にすべてを見つけることができませんでした。)

[{ 
    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" 
    } 
}] 

答えて

24

OK、RTFM!私は最終的にこれらのページを見つけました(事前にドキュメントにもっと時間をかけていたはずです)。ビデオを保持するプロパティを入れ子にしてネストされたクエリを使用します。

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

希望これは、道路下に誰かを助けます。

+1

必ずしもビデオをネストする必要はありません。下記のhttp://www.elasticsearch.org/blog/2010/02/12/yourdatayoursearch.htmlと私の答えをご覧ください。 – dira

+0

更新されたリンクは次のとおりです。http://www.elasticsearch.org/blog/your-data-your-search/ – swatkins

+1

このブログの記事は本当に役立ちました。http://www.elasticsearch.org/blog/managing -relations-inside-elasticsearch/ – Quin

42

必ずしもビデオをネストする必要はありません。通常のフィールドとしてマップすることができます。それは

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

を格納しますそして、あなたはvideo.title:'test'を検索できることを意味します。

ネストされたフィールドは、複数のネストされたアイテムがあり、ネストされたアイテムに対してのみクエリを作成する場合に便利です。たとえば、あなたがたがすべてで、testが第二の最初のビデオとdescription2であるので、それは(あなたに偽の結果を与える、ビデオが入れ子になっていませんでしたvideo.title: 'test' and video.description: 'description2'を検索し、希望の場合、このデータ

[{ 
    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" 
     } 
    ] 
}] 

を持ちます両方とも持っているビデオフィールド)。

この場合、ネストされたビデオをマップすると、各ビデオが別のエンティティとして記録され、その条件に適合する個々のビデオが検索されます。video.title: 'test' and video.description: 'description2'の場合は何も返しません。video.title: 'example' and video.description: 'description2'の場合、 。

+6

この回答は、ネストとサブアレイまたはオブジェクトの単純な格納を区別する重要な点を提供します。入れ子にすると、インデックスに余分な文書が作成され、@swatkinsの場合は不必要に複雑になります。 –

+0

文字列のリストを持つフィールドはどうですか?リストの要素とそのフィールドのリストに少なくとも1つの一致がある文書のみを取り出す方法は? –

関連する問題