私が達成したいのは、一意のペア (都市、州) による集計です。Elasticsearchのドキュメントによると、用語の集約では、同じドキュメント内の複数のフィールドから用語を収集することはサポートされていません。したがって、次のようなネストされた agg を作成しました。
{
"size": 0,
"aggs": {
"cities": {
"terms": {
"field": "address.city",
"size": 12
},
"aggs": {
"states": {
"terms": {
"field": "address.stateOrProvince"
},
"aggs": {
"topCity": {
"top_hits": {
"size": 1,
"sort": [
{
"price.value": {
"order": "desc" }}]}}}}}}}}
この集計の結果、次のような応答が得られます。
{
"aggregations": {
"cities": {
"buckets": [
{
"key": "las vegas",
"doc_count": 5927,
"states": {
"buckets": [
{ "key": "nv", "doc_count": 5840 },
{ "key": "nm", "doc_count": 85 }
]
}
},
{
"key": "jacksonville",
"doc_count": 5689,
"states": {
"buckets": [
{ "key": "fl", "doc_count": 2986 },
{ "key": "nc", "doc_count": 1962 },
{ "key": "ar", "doc_count": 290 }]}}]}}}
問題は、最も深い doc_count で並べ替えられた結果を取得する方法です。
予想される順序付きリストは次のようになります。
- ラスベガス、ネバダ州 (5840)
- フロリダ州ジャクソンビル (2986)
- ノースカロライナ州ジャクソンビル (1962)
- アーカンソー州ジャクソンビル (290)
- ラスベガス、nm (85)