2015-09-01 14 views
6

Tôi không thể tạo tập hợp elasticsearch + bộ lọc để làm việc với các trường lồng nhau. Giản đồ dữ liệu (phần liên quan) là như thế này:Kết hợp Elasticsearch không hoạt động với các trường kiểu lồng nhau

"mappings": { 
    "rb": { 
    "properties": { 
     "project": { 
     "type": "nested", 
     "properties": { 
      "age": { 
      "type": "long" 
      }, 
      "name": { 
      "type": "string", 
      "index": "not_analyzed" 
      } 
     } 
     }  
    } 
    } 
} 

Về cơ bản "rb" đối tượng chứa một lĩnh vực lồng nhau gọi là "dự án", trong đó có hơn hai lĩnh vực - "Tên" và "tuổi". Truy vấn Tôi đang chạy:

"aggs": { 
    "root": { 
    "aggs": { 
     "group": { 
     "aggs": { 
      "filtered": { 
      "aggs": { 
       "order": { 
       "percentiles": { 
        "field": "project.age", 
        "percents": ["50"] 
       } 
       } 
      }, 
      "filter": { 
       "range": { 
       "last_updated": { 
        "gte": "2015-01-01", 
        "lt": "2015-07-01" 
       } 
       } 
      } 
      } 
     }, 
     "terms": { 
      "field": "project.name", 
      "min_doc_count": 5, 
      "order": { 
      "filtered>order.50": "asc" 
      }, 
      "shard_size": 10, 
      "size": 10 
     } 
     } 
    }, 
    "nested": { 
     "path": "project" 
    } 
    } 
} 

Truy vấn này được cho là để tạo ra top 10 dự án (trường project.name) mà phù hợp với bộ lọc ngày, được sắp xếp theo độ tuổi trung bình của họ, bỏ qua các dự án có ít hơn 5 đề cập trong cơ sở dữ liệu . Chỉ nên tính toán trung bình cho các dự án phù hợp với bộ lọc (phạm vi ngày).

Mặc dù có hơn một trăm nghìn đối tượng trong cơ sở dữ liệu, truy vấn này tạo ra danh sách trống. Không có lỗi, chỉ phản hồi trống. Tôi đã thử nó cả trên ES 1.6 và ES 2.0-beta.

Trả lời

7

Tôi đã sắp xếp lại truy vấn tổng hợp của bạn một chút và tôi có thể nhận được một số kết quả hiển thị. Điểm chính là loại kể từ khi bạn tập hợp xung quanh loại nested, tôi đã lấy ra tập hợp filter trên trường last_updated và di chuyển nó lên cấu trúc phân cấp như tập hợp đầu tiên. Sau đó, kết hợp số nested trên trường project và cuối cùng là termspercentile.

Điều đó dường như hoạt động khá tốt. Vui lòng thử.

{ 
    "size": 0, 
    "aggs": { 
    "filtered": { 
     "filter": { 
     "range": { 
      "last_updated": { 
      "gte": "2015-01-01", 
      "lt": "2015-07-01" 
      } 
     } 
     }, 
     "aggs": { 
     "root": { 
      "nested": { 
      "path": "project" 
      }, 
      "aggs": { 
      "group": { 
       "terms": { 
       "field": "project.name", 
       "min_doc_count": 5, 
       "shard_size": 10, 
       "order": { 
        "order.50": "asc" 
       }, 
       "size": 10 
       }, 
       "aggs": { 
       "order": { 
        "percentiles": { 
        "field": "project.age", 
        "percents": [ 
         "50" 
        ] 
        } 
       } 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Nó hoạt động! Tôi chỉ cần tăng shard_size lên 100 để thực sự nhận được 10 giá trị trở lại. Bạn có nhớ giải thích tại sao biến thể ban đầu của tôi không hoạt động? Nó là một hạn chế trong ES mà nó không hỗ trợ các bộ lọc bên trong các lĩnh vực lồng nhau? – extesy

+1

Bên trong tập hợp 'lồng nhau', bạn chỉ có thể tham chiếu các trường lồng nhau. Bên cạnh đó, nó có ý nghĩa hơn để đầu tiên lọc ra dữ liệu dựa trên 'last_updated' và chỉ sau đó để hoạt động trên dữ liệu lồng nhau. – Val

+0

@Val - Bạn có thể vui lòng cho tôi biết cách tôi có thể làm điều đó cho nhóm đa nhiệm không? Câu hỏi riêng tư - http://stackoverflow.com/questions/43451667/elasticsearch-ordering-aggregation-by-nested-aggregation-on-nested-field –

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