Giải pháp trước hoạt động thực sự tốt cho đến khi bạn không có thẻ nhiều cấp trên một tài liệu. Trong trường hợp này một tập hợp đơn giản không hoạt động, bởi vì cấu trúc phẳng của các trường lucene kết hợp các kết quả trên tập hợp nội bộ. Xem ví dụ dưới đây:
DELETE /test_category
POST /test_category
# Insert a doc with 2 hierarchical tags
POST /test_category/test/1
{
"categories": [
{
"cat_1": "1",
"cat_2": "1.1"
},
{
"cat_1": "2",
"cat_2": "2.2"
}
]
}
# Simple two-levels aggregations query
GET /test_category/test/_search?search_type=count
{
"aggs": {
"main_category": {
"terms": {
"field": "categories.cat_1"
},
"aggs": {
"sub_category": {
"terms": {
"field": "categories.cat_2"
}
}
}
}
}
}
Đó là câu trả lời sai lầm mà tôi đã có trên ES 1.4, nơi các lĩnh vực trên việc tổng hợp nội bộ được pha trộn với một mức độ tài liệu:
{
...
"aggregations": {
"main_category": {
"buckets": [
{
"key": "1",
"doc_count": 1,
"sub_category": {
"buckets": [
{
"key": "1.1",
"doc_count": 1
},
{
"key": "2.2", <= WRONG
"doc_count": 1
}
]
}
},
{
"key": "2",
"doc_count": 1,
"sub_category": {
"buckets": [
{
"key": "1.1", <= WRONG
"doc_count": 1
},
{
"key": "2.2",
"doc_count": 1
}
]
}
}
]
}
}
}
Một giải pháp có thể sử dụng các đối tượng lồng nhau.Đây là các bước để thực hiện:
1) Xác định một kiểu mới trong lược đồ với các đối tượng lồng nhau
POST /test_category/test2/_mapping
{
"test2": {
"properties": {
"categories": {
"type": "nested",
"properties": {
"cat_1": {
"type": "string"
},
"cat_2": {
"type": "string"
}
}
}
}
}
}
# Insert a single document
POST /test_category/test2/1
{"categories":[{"cat_1":"1","cat_2":"1.1"},{"cat_1":"2","cat_2":"2.2"}]}
2) Chạy một truy vấn kết hợp lồng nhau:
GET /test_category/test2/_search?search_type=count
{
"aggs": {
"categories": {
"nested": {
"path": "categories"
},
"aggs": {
"main_category": {
"terms": {
"field": "categories.cat_1"
},
"aggs": {
"sub_category": {
"terms": {
"field": "categories.cat_2"
}
}
}
}
}
}
}
}
Đó là câu trả lời, bây giờ chính xác, mà tôi đã có:
{
...
"aggregations": {
"categories": {
"doc_count": 2,
"main_category": {
"buckets": [
{
"key": "1",
"doc_count": 1,
"sub_category": {
"buckets": [
{
"key": "1.1",
"doc_count": 1
}
]
}
},
{
"key": "2",
"doc_count": 1,
"sub_category": {
"buckets": [
{
"key": "2.2",
"doc_count": 1
}
]
}
}
]
}
}
}
}
Cùng một giải pháp có thể được mở rộng t o một khía cạnh phân cấp cao hơn hai cấp.
cảm ơn! cũng tìm thấy lỗi trên github và bài liên quan nói rằng nó sẽ được sửa trong ES 1.0. Thực hiện đã có sẵn trong phiên bản beta 2. chơi với nó ngay bây giờ :) cảm ơn! – zonder