2014-07-18 11 views
14

Tôi rất mới trong Elasticsearch và có câu hỏi về trình thông báo phân cấp của đường dẫn. Dưới đây là ví dụ mã của tôi:Elasticsearch - sử dụng trình thông báo phân cấp đường dẫn để truy cập các cấp độ khác nhau của các loại

đang lập bản đồ của tôi:

PUT /my_index 
{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "path-analyzer": { 
      "type": "custom", 
      "tokenizer": "path-tokenizer" 
     } 
     }, 
     "tokenizer": { 
     "path-tokenizer": { 
      "type": "path_hierarchy", 
      "delimiter": "." 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "my_type": { 
     "dynamic": "strict", 
     "properties": { 
     "group_path": { 
      "type": "string", 
      "index_analyzer": "path-analyzer", 
      "search_analyzer": "keyword" 
     } 
     } 
    } 
    } 
} 

Đây là PUT của tôi:

PUT /my_index/my_type/1 
{ 
    "group_path": ["Book.Thriller.Adult","DVD.Comedy.Kids"] 
} 

Đây là Query tôi:

GET /my_index/my_type/_search?search_type=count 
{ 
    "aggs": { 
     "category": { 
     "terms": { 
      "field": "group_path", 
      "size": 0 
     } 
     } 
    } 
} 

Và kết quả:

{ 
    ... 
    "aggregations": { 
     "category": { 
     "buckets": [ 
      { 
       "key": "Book", 
       "doc_count": 1 
      }, 
      { 
       "key": "Book.Thriller", 
       "doc_count": 1 
      }, 
      { 
       "key": "Book.Thriller.Adult", 
       "doc_count": 1 
      }, 
      { 
       "key": "DVD", 
       "doc_count": 1 
      }, 
      { 
       "key": "DVD.Comedy", 
       "doc_count": 1 
      }, 
      { 
       "key": "DVD.Comedy.Kids", 
       "doc_count": 1 
      } 
     ] 
     } 
    } 
} 

Cho đến nay mọi thứ đều tốt. Những gì tôi đang tìm kiếm là làm thế nào tôi có thể tạo ra các thùng ví dụ chỉ cho thể loại đầu tiên. Làm cách nào để tôi có kết quả như vậy:

{ 
    ... 
    "aggregations": { 
     "category": { 
     "buckets": [ 
      { 
       "key": "Book", 
       "doc_count": 1 
      }, 
      { 
       "key": "DVD", 
       "doc_count": 1 
      } 
     ] 
     } 
    } 
} 

Cảm ơn bạn đã được trợ giúp.

Trả lời

11

Cách duy nhất tôi tìm thấy để thực hiện việc này là sử dụng cú pháp loại trừ để loại trừ các cấp bạn không muốn.

{ 
    "aggs": { 
     "category": { 
     "terms": { 
      "field": "group_path", 
      "size": 0, 
      "exclude" : ".*\\..*" 
     } 
     } 
    } 
} 

sẽ sau đó trở về

aggregations: { 
    category: { 
     buckets: [ 
      { 
      key: Book 
      doc_count: 1 
      } 
      { 
      key: DVD 
      doc_count: 1 
      } 
     ] 
    } 
} 

Nếu bạn chọn cuốn sách, sau đó bạn có thể tìm kiếm như thế này

{ 
    "query" : { 
     "filtered": { 
      "filter": { 
     "prefix": { 
      "group_path": "Book" 
     } 
      } 
     } 
    }, 
    "aggs" : { 
     "category": { 
     "terms": { 
      "field": "group_path", 
      "size": 0, 
      "include" : "Book\\..*", 
      "exclude": ".*\\..*\\..*" 
     } 
     } 
    } 
} 

sẽ sau đó trở về

aggregations: { 
    category: { 
     buckets: [ 
      { 
      key: Book.Thriller 
      doc_count: 1 
      } 
     ] 
    } 
} 
Các vấn đề liên quan