Aggregationの対象をfilterするのではなく、Aggregationした結果をfilterしたいのですが可能でしょうか?
SQL脳でもうしわけないですが、副問合せした結果にあるterms等で完全一致した複数の条件でしぼりたいというのが要件となります。
さっそくのご回答ありがとうございます。
説明が悪かったので例を書いて説明させていただきます。
カラム名はわかりやすいように日本語とさせてください。
所属テーブル
"properties" : {
"ユーザID" : {
"type" : "string"
},
"ユーザ名" : {
"type" : "string"
},
"所属日" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"所属コード" : {
"type" : "string"
}
}
というindexがあると想定します。所属が変わるたびにレコードができるテーブルです。
データ例
ユーザID,ユーザ名,所属日,所属コード
001,日本 太郎,2016/01/16,0001
001,日本 太郎,2016/02/16,0002
001,日本 太郎,2016/03/16,0003
001,日本 太郎,2016/04/16,0004
002,日本 花子,2016/01/16,0001
002,日本 花子,2016/02/16,0002
002,日本 花子,2016/03/16,0005
002,日本 花子,2016/04/16,0006
・
・
・
この時に日付から何月何日にある所属の人は誰?ということを取得したいです。
下記にて何月何日に所属していたところはどこというのは取得できます。
{
"query" : {
"filtered": {
"filter": {
"range": {
"所属日": {
"lte": "2016/03/15"
}
}
}
}
},
"aggs": {
"top-tags": {
"terms": {
"field": "ユーザID"
},
"aggs": {
"top_tag_hits": {
"top_hits": {
"size" : 1
}
}
}
}
},
size: 0
}
上記で取得して、取得した後にプログラムでそのなかである所属の人だけということで
今実現してますが、それをいっぺんにできないかとのご相談です。
(件数が多いのでElasticSearch側で絞ってしまいたい)
いま、プログラムでどういうことをやられているのでしょうか?
プログラムでは、上記のクエリで全ユーザ分のある日付の所属情報を全て取得した後、例えば営業部所属の人だけというのを全件ループさせながらチェックしてます。
件数が多いため、取得する通信に時間がかかっており、営業部所属の人だけをElasticSearch側だけで絞って処理速度の改善を行いたいと考えております。
SQLだと下記となると思うのですが、それとElasticSeachでも実現できないかと。
SELECT
ユーザID,ユーザ名,所属日,所属コード
FROM
所属テーブル as a,
(SELECT MAX(所属日) AS ユーザID FROM 所属テーブル GROUP BY ユーザID) a1
WHERE
a.ユーザID = a1.ユーザID
AND
所属コード = '営業部' ・・・ ①
上記SQLをクエリで実現したく①の条件を付与することができずにいます。
This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.