我有带有类别字段的产品。使用聚合,我可以获得所有子类别的完整类别。我想限制构面中的级别。
例如,我有以下方面:
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": ".* > .* > .*" 对我不起作用。
auto, tools & travel > luggage tags
"exclude": ".* > .* > .*"
我需要根据搜索获得不同级别的存储桶。 有时是第一级,有时是第二或第三级。当我想要第一级时,我不希望第二级出现在存储桶中。以此类推。
Elasticsearch 6.4版
最后,我已经能够弄清楚以下技术。
我已经实现了custom analyzer使用路径层次结构标记器,并且创建了称为的多字段,categories以便您可以categories.facets用于聚合/构面并使用进行普通文本搜索categories。
custom analyzer
categories
categories.facets
定制分析器仅适用于 categories.facets
请注意"fielddata": "true"我所在领域的财产categories.facet
"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,即它不会考虑出现多个>
exclude
regular expression
>
让我知道是否有帮助。