7

Tôi đang sử dụng elasticsearch và cần phải thực hiện tìm kiếm khía cạnh cho đối tượng thứ bậc như sau:faceting thứ bậc với Elasticsearch

  • loại 1 (10)
    • tiểu thể loại 1 (4)
    • tiểu thể loại 2 (6)
  • loại 2 (X)
    • ...

Vì vậy, tôi cần phải nhận được khía cạnh cho hai đối tượng có liên quan. Tài liệu nói rằng nó có thể để có được loại đó của khía cạnh giá trị số, nhưng tôi cần nó cho chuỗi http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-facets-terms-stats-facet.html

Dưới đây là một chủ đề thú vị, rất tiếc là cũ: http://elasticsearch-users.115913.n3.nabble.com/Pivot-facets-td2981519.html

Liệu nó có thể với tìm kiếm đàn hồi? Nếu có, tôi có thể làm như thế nào?

Trả lời

3

Hiện tại, elasticsearch không hỗ trợ tạo mặt bằng phân cấp ngoài hộp. Nhưng phiên bản 1.0 sắp tới có một mô-đun aggregations mới, có thể được sử dụng để có được các loại mặt này (giống như các khía cạnh trục hơn là các khía cạnh phân cấp). Phiên bản 1.0 hiện đang ở giai đoạn thử nghiệm, bạn có thể tự mình download the second beta và tự mình thử nghiệm. Ví dụ bạn có thể trông như

curl -XPOST 'localhost:9200/_search?pretty' -d ' 
{ 
    "aggregations": { 
     "main category": { 
     "terms": { 
      "field": "cat_1", 
      "order": {"_term": "asc"} 
     }, 
     "aggregations": { 
      "sub category": { 
       "terms": { 
        "field": "cat_2", 
        "order": {"_term": "asc"} 
       } 
      } 
     } 
     } 
    } 
}' 

Ý tưởng là để có một lĩnh vực khác nhau cho mỗi mức độ đánh bóng mặt và xô khía cạnh của bạn dựa trên các điều khoản của cấp độ đầu tiên (cat_1). Những tập hợp này sau đó sẽ có các nhóm con, dựa trên các điều khoản của cấp độ thứ hai (cat_2). Kết quả có thể trông giống như

{ 
    "aggregations" : { 
    "main category" : { 
     "buckets" : [ { 
     "key" : "category 1", 
     "doc_count" : 10, 
     "sub category" : { 
      "buckets" : [ { 
      "key" : "subcategory 1", 
      "doc_count" : 4 
      }, { 
      "key" : "subcategory 2", 
      "doc_count" : 6 
      } ] 
     } 
     }, { 
     "key" : "category 2", 
     "doc_count" : 7, 
     "sub category" : { 
      "buckets" : [ { 
      "key" : "subcategory 1", 
      "doc_count" : 3 
      }, { 
      "key" : "subcategory 2", 
      "doc_count" : 4 
      } ] 
     } 
     } ] 
    } 
    } 
} 
+0

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

5

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ác vấn đề liên quan