2017-01-11 17 views
1

2レベルのネスト(ドキュメントごとに別々の最小値)で最小(最小)値を探しようとしています。Python elasticsearch文書あたりのネストされた値のDSL集計/メトリック

これまでのところ、私は、検索結果内のすべてのネストされた値の最小値をカウントするが、ドキュメントごとに分離することはできません。

私の例のスキーマ:

class MyExample(DocType): 
    myexample_id = Integer() 
    nested1 = Nested(
     properties={ 
      'timestamp': Date(), 
      'foo': Nested(
       properties={ 
        'bar': Float(), 
       } 
      ) 
     } 
    ) 
    nested2 = Nested(
     multi=False, 
     properties={ 
      'x': String(), 
      'y': String(), 
     } 
    ) 

そして、これは私が検索し、集計しています方法です:

from elasticsearch_dsl import Search, Q 

search = Search().filter(
    'nested', path='nested1', inner_hits={}, 
    query=Q(
     'range', **{ 
      'nested1.timestamp': { 
       'gte': exampleDate1, 
       'lte': exampleDate2 
      } 
     } 
    ) 
).filter(
    'nested', path='nested2', inner_hits={'name': 'x'}, 
    query=Q(
     'term', **{ 
      'nested2.x': x 
     } 
    ) 
).filter(
    'nested', path='nested2', inner_hits={'name': 'y'}, 
    query=Q(
     'term', **{ 
      'nested2.y': y 
     } 
    ) 
) 

search.aggs.bucket(
    'nested1', 'nested', path='nested1' 
).bucket(
    'nested_foo', 'nested', path='nested1.foo' 
).metric(
    'min_bar', 'min', field='nested1.foo.bar' 
) 

は基本的に私は何をする必要があるか、すべてのネストされたnested1分間値を得ることです各ユニークなMyExampleの.foo.bar値(固有のmyexample_idフィールドを持っています)

答えて

2

ドキュメントごとに最小値が必要な場合は、すべてのnestedバケットをbu myexample_idフィールドオーバーcket terms集約:

search.aggs..bucket(
    'docs', 'terms', field='myexample_id' 
).bucket(
    'nested1', 'nested', path='nested1' 
).bucket(
    'nested_foo', 'nested', path='nested1.foo' 
).metric(
    'min_bar', 'min', field='nested1.foo.bar' 
) 

注それは各ドキュメントのバケットを作成する必要があるため、この凝集は計算することが非常に高価であるかもしれないということ。このようなユースケースの場合、script_fieldとして、またはアプリケーション内で、ドキュメント単位で最小値を計算する方が簡単かもしれません。

+1

私は、この最小値をインデックス時に計算し、文書のルートレベルに保存することを提案するつもりでした。 '入れ子になった'文書やスクリプトを使って、いくつかのレベルのaggsよりもはるかにパフォーマンスが向上します。 – Val

関連する問題