2012-05-02 39 views
6

Tôi có tài liệu mà giống như thế này (đây là hai ví dụ):Elasticsearch sắp xếp theo chủ chốt tài liệu lồng nhau duy nhất trong mảng

{ 
    "id": 1234, 
    "title": "the title", 
    "body": "the body", 
    "examples": [ 
     { 
      "evidence_source": "friend", 
      "source_score": 15 
     }, 
     { 
      "evidence_source": "parent", 
      "source_score": 12 
     } 
    ] 
} 

{ 
    "id": 6346, 
    "title": "new title", 
    "body": "lots of content", 
    "examples": [ 
     { 
      "evidence_source": "friend", 
      "source_score": 10 
     }, 
     { 
      "evidence_source": "parent", 
      "source_score": 27 
     }, 
     { 
      "evidence_source": "child", 
      "source_score": 4 
     } 
    ] 
} 

Định dạng của tiểu tài liệu trong examples mảng sẽ luôn có một số evidence_sourcesource_score nhưng sẽ có một số lượng thay đổi của các tài liệu phụ này, mỗi tài liệu có giá trị evidence_source khác nhau.

Tôi tự hỏi liệu có thể sắp xếp tài liệu với định dạng này dựa trên một trong các giá trị source_score phù hợp với giá trị evidence_source cụ thể không. Tôi thực sự muốn để có thể làm điều này:

  • Sắp xếp tài liệu theo source_score giảm dần nơi liên quan evidence_sourcefriend. Thứ tự kết quả của tài liệu id s sẽ là 1234,6346.
  • Sắp xếp tài liệu theo số source_score giảm dần nơi có liên quan evidence_sourceparent. Thứ tự kết quả của tài liệu id s sẽ là 6346,1234.

Kết quả gần nhất mà tôi tạo ra để thực hiện điều gì đó như thế này là 12 nhưng tôi không tin rằng họ nhận được chính xác những gì tôi muốn làm.

Bất kỳ ý tưởng nào về cách tôi có thể thực hiện việc này? Tôi đã dự tính một số ý tưởng dựa trên việc lập chỉ mục các tài liệu phụ examples riêng biệt này, nhưng tôi khá mới với elasticsearch và vì vậy tôi đang tìm kiếm một số lời khuyên về cách đạt được mục tiêu của mình theo cách đơn giản nhất (có thể là đường ống- dream ...)

Cập nhật: Bài đăng trên elasticsearch mailing list dường như cho biết điều này là không thể, nhưng tôi tự hỏi nếu ai đó ở đây có bất kỳ ý tưởng khác!

+0

có các tài liệu phụ ánh xạ như các tài liệu lồng nhau hoặc là đối tượng? Có bao nhiêu hồ sơ bạn mong đợi có trong chỉ mục của bạn? – imotov

+0

Ngay bây giờ, tôi thực sự không lập bản đồ đặc biệt chút nào, nhưng tôi sẵn sàng thử nghiệm với các ánh xạ khác nhau để đến chức năng mà tôi đang tìm kiếm. Tôi hy vọng vào thứ tự 100 triệu bản ghi tổng số được lưu trữ. –

+0

Bạn có kế hoạch có bao nhiêu loại bằng chứng khác nhau? – imotov

Trả lời

18

hỗ trợ sắp xếp dựa trên các lĩnh vực bên trong các văn bản lồng nhau đã được thêm vào elasticsearch trong 0.90:

https://github.com/elasticsearch/elasticsearch/issues/2662

Các phân loại hỗ trợ lĩnh vực lồng nhau có các thông số sau trên đầu của các loại đã tồn tại tùy chọn:

  • nested_path - Xác định đối tượng lồng nhau cần sắp xếp. Trường sắp xếp thực tế phải là trường trực tiếp bên trong đối tượng lồng nhau này. Mặc định là sử dụng đối tượng lồng nhau được thừa hưởng ngay lập tức nhất từ ​​trường sắp xếp .
  • nested_filter - Bộ lọc các đối tượng bên trong bên trong đường dẫn lồng nhau phải khớp với để giá trị trường của nó là được tính đến bằng cách sắp xếp. Trường hợp thông thường là lặp lại truy vấn/ bộ lọc bên trong bộ lọc hoặc truy vấn lồng nhau. Theo mặc định, không có nested_filter đang hoạt động.

Với dữ liệu ví dụ của bạn, truy vấn sau đây sẽ cho bạn những gì bạn đang sau:

{ 
    "query": { 
    "match_all": {} 
    }, 
    "sort": [ 
    { 
     "examples.source_score": { 
     "order": "desc", 
     "nested_path": "examples", 
     "nested_filter": { 
      "term": { 
      "examples.evidence_source": "friend" 
      } 
     } 
     } 
    } 
    ] 
} 
+0

Có thể sử dụng truy vấn ở trên khi có mối quan hệ cha mẹ con không? –

+0

@PrasadBhosale Không thể thực hiện được vì nó chỉ dành cho đối tượng lồng nhau. https://www.elastic.co/guide/en/elasticsearch/guide/current/nested-sorting.html – sangheestyle

+0

Có thể sử dụng truy vấn bool bên trong bộ lọc lồng nhau không? –

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