2014-07-18 87 views
14

Jestem bardzo nowy w Elasticsearch i mam pytanie dotyczące hierarchicznego tokenizera ścieżki. Oto mój przykładowy kod:Elasticsearch - użycie tokenu hierarchii ścieżek w celu uzyskania dostępu do różnych poziomów kategorii

Mój kod mapowania:

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" 
     } 
     } 
    } 
    } 
} 

To mój PUT:

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

To mój Zapytanie:

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

A wynik:

{ 
    ... 
    "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 
      } 
     ] 
     } 
    } 
} 

Jak dotąd wszystko jest dobrze. To, czego szukam, to w jaki sposób mogę utworzyć segmenty na przykład tylko dla pierwszej kategorii. Jak uzyskać taki wynik:

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

Dziękuję za pomoc.

Odpowiedz

11

Jedyny sposób, w jaki to zrobiłem, polega na użyciu składni wykluczenia w celu wykluczenia poziomów, których nie chcesz.

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

powróci

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

Jeśli wybierzesz książkę, możesz poszukać takiego

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

powróci

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