2014-11-04 11 views
5

tôi cần phải tập hợp một mảng như sauTập hợp mảng các giá trị trong elasticsearch

Hai ví dụ tài liệu:

{ 
    "_index": "log", 
    "_type": "travels", 
    "_id": "tnQsGy4lS0K6uT3Hwzzo-g", 
    "_score": 1, 
    "_source": { 
     "state": "saopaulo", 
     "date": "2014-10-30T17", 
     "traveler": "patrick", 
     "registry": "123123", 
     "cities": { 
      "saopaulo": 1, 
      "riodejaneiro": 2, 
      "total": 2 
     }, 
     "reasons": [ 
      "Entrega de encomenda" 
     ], 
     "from": [ 
      "CompraRapida" 
     ] 
    } 
}, 
{ 
    "_index": "log", 
    "_type": "travels", 
    "_id": "tnQsGy4lS0K6uT3Hwzzo-g", 
    "_score": 1, 
    "_source": { 
     "state": "saopaulo", 
     "date": "2014-10-31T17", 
     "traveler": "patrick", 
     "registry": "123123", 
     "cities": { 
      "saopaulo": 1, 
      "curitiba": 1, 
      "total": 2 
     }, 
     "reasons": [ 
      "Entrega de encomenda" 
     ], 
     "from": [ 
      "CompraRapida" 
     ] 
    } 
}, 

tôi muốn tổng hợp các mảng cities, để tìm hiểu tất cả các cities các traveler đã đi đến. Tôi muốn một cái gì đó như thế này:

{ 
    "traveler":{ 
     "name":"patrick" 
    }, 
    "cities":{ 
     "saopaulo":2, 
     "riodejaneiro":2, 
     "curitiba":1, 
     "total":3 
    } 
} 

Trường hợp total là chiều dài của mảng cities trừ 1. Tôi cố gắng tập hợp các điều khoản và số tiền, nhưng không thể sản lượng đầu ra mong muốn.

Thay đổi trong cấu trúc tài liệu có thể được thực hiện, vì vậy nếu bất cứ điều gì như thế sẽ giúp tôi, tôi rất vui được biết.

+0

Bạn có bản đồ cho chỉ mục đó mà bạn có thể chia sẻ không? –

Trả lời

11

trong tài liệu được đăng ở trên "thành phố" không phải là mảng json, nó là đối tượng json. Nếu thay đổi cấu trúc tài liệu là một khả năng tôi sẽ thay đổi thành phố trong tài liệu là một mảng của đối tượng

tài liệu ví dụ:

cities : [ 
    { 
    "name" :"saopaulo" 
    "visit_count" :"2", 

    }, 
    { 
    "name" :"riodejaneiro" 
    "visit_count" :"1", 

    } 
] 

Sau đó bạn sẽ cần phải thiết lập các thành phố là loại nested trong ánh xạ lập chỉ mục

"mappings": { 
     "<type_name>": { 
      "properties": { 
       "cities": { 
        "type": "nested", 
        "properties": { 
        "city": { 
         "type": "string" 
        }, 
        "count": { 
         "type": "integer" 
        }, 
        "value": { 
         "type": "long" 
        } 
        } 
       }, 
       "date": { 
        "type": "date", 
        "format": "dateOptionalTime" 
       }, 
       "registry": { 
        "type": "string" 
       }, 
       "state": { 
        "type": "string" 
       }, 
       "traveler": { 
        "type": "string" 
       } 
      } 
     } 
     } 

Sau đó bạn có thể sử dụng số nested aggregation để nhận số thành phố cho mỗi người dùng. Truy vấn sẽ trông giống như sau:

{ 
    "query": { 
     "match": { 
     "traveler": "patrick" 
     } 
    }, 
    "aggregations": { 
     "city_travelled": { 
     "nested": { 
      "path": "cities" 
     }, 
     "aggs": { 
      "citycount": { 
       "cardinality": { 
        "field": "cities.city" 
       } 
      } 
     } 
     } 
    } 
} 
+0

Nhưng điều này không phải là "saopaulo", kể từ khi tôi viếng thăm nó vào ngày 30 và ngày 31? –

+0

@PatrickVillela yeah tôi hiểu lầm câu hỏi tôi đã chỉnh sửa câu trả lời bằng cách sử dụng cardinality http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-aggregations-metrics-cardinality-aggregation.html cung cấp tổng số các thành phố riêng biệt như muốn tuy nhiên người ta sẽ phải trừ -1 vào tài khoản cho tổng số, có lẽ tổng số không phải là một phần của "thành phố" đối tượng/lĩnh vực anyways và là một lĩnh vực riêng biệt bên ngoài – keety

+0

Được rồi, tôi sẽ cố gắng nó đúng và trả lại cho bạn –

Các vấn đề liên quan