我尝试基于标签/构面创建类似电子商务的搜索过滤器。 我的标签是动态创建和索引的,如下所示:
{
"products": {
"properties": {
"name": {
"type": "text"
},
"labels": {
"type": "nested",
"properties": {
"id": {
"type": "keyword"
},
"typeId": {
"type": "keyword"
}
}
}
}
}
}
我想像其他所有电子商务网站一样搜索标签类型(例如屏幕尺寸)的OR运算,以及标签类型之间的AND运算。 我可以使用以下查询进行此操作:
{
"query": {
"bool": {
"must": [
{
"terms": {
"labels.id": [
"45inch",
"50inch"
]
}
},
{
"terms": {
"labels.id": [
"plasma",
"led"
]
}
}
]
}
}
}
现在我想要标签聚合,当添加一个简单的聚合时,一切看起来都不错,但这不是因为我错过了值:每个聚合都需要依靠应用了所有过滤器的数据集,除了自己的过滤器(更多信息: https://madewithlove.be/faceted-search-using-elasticsearch/最后一部分)。 这是最基本的工作汇总,但已过滤(已应用查询过滤器):
"aggs": {
"productLabels": {
"nested": {
"path": "labels"
},
"aggs": {
"innerAggregation": {
"terms": {
"field": "labels.typeId"
},
"aggs": {
"name": {
"terms": {
"field": "labels.id"
}
}
}
}
}
}
}
}
因此,我需要带有一些过滤器的全局聚合,除了他自己的过滤器之外,我需要一些帮助来过滤聚合。我已经有了这个,但是这是不正确的,因为它现在可以过滤具有所有装配工(包括他自己的)的所有标签类型:
"aggs": {
"allLabels": {
"global": {},
"aggs": {
"filteredLabels": {
"filter": {
"bool": {
"must": [
{
"terms": {
"labels.id": [
"45inch",
"50inch"
]
}
},
{
"terms": {
"labels.id": [
"plasma",
"led"
]
}
}
]
}
},
"aggs": {
"nestedLabels": {
"nested": {
"path": "labels"
},
"aggs": {
"labels": {
"terms": {
"field": "labels.typeId"
},
"aggs": {
"name": {
"terms": {
"field": "labels.id"
}
}
}
}
}
}
}
}
}
}
}
有人知道如何实现这一目标吗?
非常感谢!