web-dev-qa-db-ja.com

elastic-searchでネストされたオブジェクトを検索する方法

OK、これまでのところこれを理解できませんでした。誰かが何らかの洞察を提供できることを願っています。

以下のドキュメントがある場合、ビデオタイトルに「test」が含まれるビデオを含むすべてのドキュメントを検索するにはどうすればよいですか? 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"
    }
}]
36
swatkins

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

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

これが将来の誰かを助けることを願っています。

32
swatkins

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

'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'を検索できます。

私の知る限り、ネストされたフィールドは、複数のネストされたアイテムがあり、ネストされたアイテムに対してのみクエリを実行する場合に役立ちます。たとえば、このデータを持っている

[{
    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'を検索し、ビデオがネストされていない場合、偽の結果が得られます(testが最初のビデオにあり、description2が2番目にありますが、あなたが両方持っているビデオフィールド)。

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

49
dira

Rest API URL形式で配置する場合

/_search?pretty&q=video.title:*test*

3

ネストされたオブジェクトの名前が一意である場合、.keywordサフィックスを使用できます。

{
        'query': {
            'term': {
                'title.keyword': "This is a test title for a video"               
            }
        }
}

これは、最初のサンプルエントリと一致する必要があります。 videoオブジェクト名はどこにも指定されていないことに注意してください。これは、titleサブオブジェクトを持つすべてのオブジェクトで一致します。

1
tsorn