49

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

以下のドキュメントの場合、ビデオのタイトルに「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"
    }
}]
4

6 に答える 6

59

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

'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最初のビデオとdescription22 番目のビデオにあるため、すべてのビデオ フィールドに両方があるため)。

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

于 2012-02-10T13:54:31.823 に答える
40

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

これが将来誰かに役立つことを願っています。

于 2011-11-15T19:04:40.163 に答える
3

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

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

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

于 2019-03-25T14:58:14.713 に答える
0

より一般的な答えを出すには:

  • 一度に 1 つのフィールドを検索する場合は、オブジェクト (ネストなし) を使用します。これは、内部的にフィールドが次のようにフラット化されているためです。

Elasticsearch のオブジェクト

  • title:test AND description:myオブジェクトは境界を気にしないため、複数のフィールド( など) で検索する必要がある場合は、ネストを使用します。一方、ネストされたフィールドは内部で個別の Lucene ドキュメントを作成し、Lucene の BlockJoin を介してすばやく結合します。

Elasticsearch のネストされたフィールド

  • 複数のフィールドを検索し、子ドキュメントを頻繁に更新する場合は、(異なる Elasticsearch ドキュメント間で)親子関係を使用します (ネストされたドキュメントを更新すると、アンサンブル全体が更新されるため)。基本的に、クエリのパフォーマンスと更新のパフォーマンスを交換したい場合は、クエリが内部で 2 つのステップで実行されるためです。

Elasticsearch has-child クエリ

注: 上の図は、Sematext のElasticsearch トレーニング クラスからのものです(開示: これらのクラスを提供しています)。

于 2021-09-15T14:54:39.943 に答える