elasticsearch,hierarchy,categories,Path,elasticsearch,Hierarchy,Categories" /> elasticsearch,hierarchy,categories,Path,elasticsearch,Hierarchy,Categories" />

Path Elasticsearch-使用路径层次标记器访问不同级别的类别

Path Elasticsearch-使用路径层次标记器访问不同级别的类别,path,elasticsearch,hierarchy,categories,Path,elasticsearch,Hierarchy,Categories,我是Elasticsearch的新手,对路径的层次标记器有一个疑问。下面是我的代码示例: 我的映射代码: PUT /my_index { "settings": { "analysis": { "analyzer": { "path-analyzer": { "type": "custom", "tokenizer": "path-tokenizer" } }, "tokeni

我是Elasticsearch的新手,对路径的层次标记器有一个疑问。下面是我的代码示例:

我的映射代码:

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"
        }
      }
    }
  }
}
这是我的建议:

PUT /my_index/my_type/1
{
  "group_path": ["Book.Thriller.Adult","DVD.Comedy.Kids"]
}
这是我的疑问:

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

{
   ...
   "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
            }
         ]
      }
   }
}
到目前为止一切都很好。我要寻找的是,我如何才能创建桶,例如仅为第一个类别创建桶。我怎样才能得到这样的结果:

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

谢谢您的帮助。

我发现唯一的方法是使用排除语法排除您不需要的级别

    {
   "aggs": {
      "category": {
         "terms": {
            "field": "group_path",
            "size": 0, 
            "exclude" : ".*\\..*"
         }
      }
   }
}
然后会回来

aggregations: {
     category: {
       buckets: [
          {
             key: Book
             doc_count: 1
          }
          {
             key: DVD
            doc_count: 1
          }
       ]
     }
}
aggregations: {
     category: {
       buckets: [
          {
             key: Book.Thriller
             doc_count: 1
          }
       ]
     }
}
如果选择book,则可以按如下方式进行搜索

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

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