2015-03-05 14 views
8

Giả sử tôi có một chỉ mục với tài liệu lồng nhau trông như thế này:Làm cách nào để tổng hợp các tài liệu lồng nhau được lọc trong Tìm kiếm Đàn hồi?

{ 
    "id" : 1234 
    "cars" : [{ 
      "id" : 987 
      "name" : "Volkswagen" 
     }, { 
      "id": 988 
      "name" : "Tesla" 
     } 
    ] 
} 

bây giờ tôi muốn có được một tập hợp đếm "xe hơi" tài liệu phù hợp với một tiêu chí nhất định, ví dụ khớp với truy vấn tìm kiếm. Nỗ lực ban đầu của tôi là truy vấn sau:

{ 
    "query" : { 
    "nested" : { 
     "path" : "cars", 
     "query" : { 
     "query_string" : { 
      "fields" : ["cars.name"], 
      "query" : "Tes*" 
     } 
     } 
    } 
    }, 
    "aggregations" : { 
    "cars" :{ 
     "nested" : { 
     "path" : "cars" 
     }, 
     "aggs" : { 
     "cars" : { 
      "terms" : { 
      "field" : "cars.id" 
      } 
     } 
     } 
    } 
    } 
} 

Tôi hy vọng sẽ nhận được kết quả tổng hợp chỉ với id của những chiếc xe có tên bắt đầu bằng "Tes". Tuy nhiên, tập hợp thay vì sử dụng tất cả các xe trong tài liệu cấp cao nhất cũng chứa tài liệu lồng nhau phù hợp. Tức là, trong ví dụ trên "Volkswagen" cũng sẽ được tính vì tài liệu cấp cao nhất cũng chứa một chiếc xe phù hợp.

Tôi làm cách nào để có được tập hợp các tài liệu lồng nhau phù hợp?

Trả lời

9

Trong thời gian có nghĩa là tôi đã figured it out: để đạt được điều này một tập hợp bộ lọc nên được bổ sung xung quanh các điều khoản hợp như vậy:

"aggregations" : { 
    "cars" :{ 
     "nested" : { 
     "path" : "cars" 
     }, 
     "aggs" : { 
     "cars-filter" : { 
      "filter" : { 
      "query" : { 
       "query_string" : { 
       "fields" : ["cars.name"], 
       "query" : "Tes*" 
       } 
      } 
      }, 
      "aggs" : { 
      "cars" : { 
       "terms" : { 
       "field" : "cars.id" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
+0

Bạn có chắc chắn mã này làm việc? Tôi gặp phải vấn đề tương tự, nhưng khi tôi thử mã, tôi nhận được một 'parsing_exception'" không có [truy vấn] đã đăng ký cho [truy vấn] " –

+0

Nó chắc chắn đã hoạt động khi tôi tạo truy vấn này, nhưng định dạng truy vấn của ES hasn ' t luôn luôn tương thích ngược. IIRC Tôi đã viết truy vấn này cho ES1.x, các phiên bản mới hơn có thể không chấp nhận nó. – Tiddo

+0

Có, @Tiddo - Tôi nhận được phản hồi tương tự như bạn. Không thể xem cách thực hiện việc này cho phiên bản hiện tại. Hãy cho tôi biết nếu bạn có bất cứ nơi nào với nó. – danieljames

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