2017-01-25 7 views
1

node.js sdkを使用して、すべてのフィールドでテキストを検索し、その結果をサブセットにフィルタリングし、次にカスタムインデックスに基づいて集計するelasticsearchクエリを実行しています。フィルタと集計を使用したElastic Searchクエリは集計を返しません

私は、クエリの構文が正しいことを確認するためにフィルタと集計を含むesドキュメントといくつかのスタックオーバーフローに関する質問を見てきましたが、クエリの実行時に構文エラーは表示されません。私のクエリは私のデータセット内の2000以上のドキュメントをヒットしますが、レスポンスオブジェクトには集計は含まれていません。

var search_text = "Chase Bank"; 
var doctype_selections = ["mortgage"]; 

es.search({ 
    index: index_list, 
    type: 'page', 
    body: { 
     query: { 
      filtered: { 
       query: { 
        match: { 
         _all: { 
          "query": search_text, 
          "operator": "and" 
         } 
        }, 
        filter: { 
         terms: { 
          document_type: doctype_selections 
         } 
        } 
       } 
      } 
     }, 
     aggs: { 
      "top_tag_hits":{ 
       terms: { 
        field: "agg_index", 
        size: agg_size 
       }, 
       aggs: { 
        "hits":{ 
         top_hits: { 
          size: agg_size 
         } 
        } 
       } 
      } 
     }, 
    }, 
    explain: true, 
    size: result_size, 
}).then(function (resp) { 
    var hits = resp.hits.hits; 
    var aggs = resp.aggregations; 
    console.log(resp); 
    response.send(aggs); 
}, function (err) { 
    console.trace(err.message); 
    response.send(err.message); 
}); 

私が正しく動作しているとわかったことは、query->filter query->aggregation on filtered queryです。フィルタと集約を削除すると、クエリ自体が意図した通りに機能します。フィルタを削除しても集計とクエリを保持すると、それは機能し、集計を返します。集計を削除してフィルタを保持すると、意図したとおりに機能します。

クエリの集約部分全体が単に無視されているようです。問題は何ですか?

答えて

0

集約は、検索後に返される検索結果に作用します。あなたはどのようにここだそのown filter

+0

をしかし、それは集約前にフィルタリングすることは可能でしょうか? – GrantD71

+0

はい各集計は独自のフィルタを持つことができます –

0

を使用する必要があるクエリから結果を取得し、集計を計算して、また、各凝集を

をフィルタリングするためにその可能post_filterに見ることができますフィルター集約を使用せずに必要なものを達成することができました。私はboolクエリとしてクエリを構築し、別々mustfilter句を追加:

es.search({ 
    index: index_list, 
    type: 'page', 
    body: { 
     query: { 
      bool: { 
       must: [ 
        {match: { _all: { 
          "query": search_text, 
          "operator": "and" 
          }}}, 
       ], 
       filter: [ 
        {terms: {document_type: doctype_selections}} 
       ] 
      } 
     }, 
     aggs: { 
      "top_tag_hits":{ 
       terms: { 
        field: "agg_index", 
        size: agg_size 
       }, 
       aggs: { 
        "hits":{ 
         top_hits: { 
          size: agg_size 
         } 
        } 
       } 
      } 
     }, 
    }, 
    explain: true, 
    size: result_size, 
}).then(function (resp) { 
    var hits = resp.hits.hits; 
    var aggs = resp.aggregations; 
    console.log(resp); 
    console.log(aggs); 
    response.send(aggs); 
}, function (err) { 
    console.trace(err.message); 
    response.send(err.message); 
}); 
関連する問題