我有带有类别字段的产品。使用聚合,我可以获得所有子类别的完整类别。我想限制构面中的级别。
例如,我有以下方面:
auto, tools & travel (115)
auto, tools & travel > luggage tags (90)
auto, tools & travel > luggage tags > luggage spotters (40)
auto, tools & travel > luggage tags > something else (50)
auto, tools & travel > car organizers (25)
使用像
"aggs": {
"cat_groups": {
"terms": {
"field": "categories.keyword",
"size": 10,
"include": "auto, tools & travel > .*"
}
}
}
我越来越喜欢
"buckets": [
{
"auto, tools & travel > luggage tags",
"doc_count": 90
},
{
"key": "auto, tools & travel > luggage tags > luggage spotters",
"doc_count": 40
},
{
"key": "auto, tools & travel > luggage tags > something else",
"doc_count": 50
},
{
"key": "auto, tools & travel > car organizers",
"doc_count": 25
}
]
但是我想限制水平。例如我只想得到的结果auto, tools & travel > luggage tags
。如何限制水平?顺便说一句,"exclude": ".* > .* > .*"
对我不起作用。
我需要根据搜索获得不同级别的存储桶。 有时是第一级,有时是第二或第三级。当我想要第一级时,我不希望第二级出现在存储桶中。以此类推。
Elasticsearch 6.4版
最后,我已经能够弄清楚以下技术。
我已经实现了custom analyzer
使用路径层次结构标记器,并且创建了称为的多字段,categories
以便您可以categories.facets
用于聚合/构面并使用进行普通文本搜索categories
。
定制分析器仅适用于 categories.facets
请注意"fielddata": "true"
我所在领域的财产categories.facet
PUT myindex
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "my_tokenizer"
}
},
"tokenizer": {
"my_tokenizer": {
"type": "path_hierarchy",
"delimiter": ">"
}
}
}
},
"mappings": {
"mydocs": {
"properties": {
"categories": {
"type": "text",
"fields": {
"facet": {
"type": "text",
"analyzer": "my_analyzer",
"fielddata": "true"
}
}
}
}
}
}
}
POST myindex/mydocs/1
{
"categories" : "auto, tools & travel > luggage tags > luggage spotters"
}
POST myindex/mydocs/2
{
"categories" : "auto, tools & travel > luggage tags > luggage spotters"
}
POST myindex/mydocs/3
{
"categories" : "auto, tools & travel > luggage tags > luggage spotters"
}
POST myindex/mydocs/4
{
"categories" : "auto, tools & travel > luggage tags > something else"
}
您可以尝试以下查询。再次,我实现了Filter
Aggregation,
因为您只需要特定的单词以及Terms
Aggregation
。
{
"size": 0,
"aggs":{
"facets": {
"filter": {
"bool": {
"must": [
{ "match": { "categories": "luggage"} }
]
}
},
"aggs": {
"categories": {
"terms": {
"field": "categories.facet"
}
}
}
}
}
}
{
"took": 43,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 11,
"max_score": 0,
"hits": []
},
"aggregations": {
"facets": {
"doc_count": 4,
"categories": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "auto, tools & travel ",
"doc_count": 4
},
{
"key": "auto, tools & travel > luggage tags ",
"doc_count": 4
},
{
"key": "auto, tools & travel > luggage tags > luggage spotters",
"doc_count": 3
},
{
"key": "auto, tools & travel > luggage tags > something else",
"doc_count": 1
}
]
}
}
}
}
POST myindex/_search
{
"size": 0,
"aggs":{
"facets": {
"filter": {
"bool": {
"must": [
{ "match": { "categories": "luggage"} }
]
}
},
"aggs": {
"categories": {
"terms": {
"field": "categories.facet",
"exclude": ".*>{1}.*>{1}.*"
}
}
}
}
}
}
请注意,我以这样的方式添加exclude
了一个regular expression
,即它不会考虑出现多个>
让我知道是否有帮助。
问题内容: 如何为特定类型执行ElasticSearch聚合?我意识到您可以在请求网址中指定索引和/或类型,但是我想对两种不同的类型进行汇总。 谢谢! 问题答案: 您可以按类型过滤聚合,然后使用子聚合。例如:
我想在前端获得所有woocommerce类别的子类别,结果如下: 这是我所拥有的(但不是我想要的): 这段代码显示了类别和子类别,但是子类别不在应该在的地方,子类别就像这样的单独链接:
有一个类别,具有以下(重要)属性: 我正在尝试实现类别/子类别的概念。一个类别可以有零个或多个子类别。一个类别只能有一个父类别(可以为null)。对于顶级类别,parentCategory=null。 现在,我有一个所有类别的列表,
我目前有一个代码片段,其中对于每个类别,它将找到子类别: 将递归获取一个类别的子级: 目前,使用,只检索子类别的子类别,因此如果每个子类别都有自己的子类别,则不会将其保存到子类别中。 我如何显示子子类别给我们的子类别? 我想用我的代码做的是获取一个父级,获取它的子级,然后将这些子级中的每一个视为父级,递归地获取它的子级,但是我的JSON输出并没有反映这一点。只有父对象有子对象-子对象没有子对象(尽
我想基于当前类别及其父类别显示内容。为此,我需要知道当前类别是否是特定父类别的子类别。 例如,以下是我的类别: 汽车 跑车 意大利跑车 肮脏的 现在,我想在类别树下的每个类别存档中显示内容。例如,汽车、跑车和意大利跑车。 对于第一个类别,我可以使用WooCommerce的条件标记: 但是没有。所以我不能检查,如果分类“意大利跑车”是“汽车”的孩子。 有办法吗?
在我开始之前,我请求您的帮助,因为我有非常基本的html和css技能,而且绝对没有php知识! 我想在目录标题和描述下面category.php模板上显示子类别。我在stackoverflow上找到了一个完美工作的代码(我添加了一个div类): 但是,当对不包含任何子类别的类别或子类别的页面收费时,会显示以下文本:“无类别”。 在上面的php代码中,当没有子类别时,是否可以隐藏任何文本?非常感谢