【发布时间】:2017-05-13 04:35:28
【问题描述】:
在我们的一个新项目中,我们受到这篇文章 http://project-a.github.io/on-site-search-design-patterns-for-e-commerce/#generic-faceted-search 的启发,因为我们做了我们的“平面”结构。虽然我已经让它在文章描述的范围内工作,但我在选择方面时遇到了问题。我希望有人可以给出一些尝试的提示,这样我就不必再次将我们所有的聚合重做为单独的聚合计算。
问题基本上是我们使用单个聚合来一次计算所有“方面”,但是当我添加一个过滤器(fx。检查品牌名称)时,它会在返回时“删除”所有其他品牌聚合体。我基本上想要的是它应该在计算其他方面时使用该品牌作为过滤器,而不是在计算品牌聚合时。这是必要的,因此用户可以选择多个品牌。
查看https://www.contorion.de/search/Metabo_Fein/ou1-ou2?q=Winkelschleifer&c=bovy(上面文章中描述的网站),我选择了“Metabo”和“Fein”制造商(Hersteller),展开 Hersteller 菜单它显示所有制造商,而不仅仅是那些制造商选择。所以我知道这是有可能的,我希望有人能提示如何编写聚合/过滤器,这样我就能得到“正确的电子商务方面行为”。
关于 ES 中的产品,我有以下结构:(与原始文章中的相同,尽管命名为“C#'ified”)
"attributeStrings": [
{
"facetName": "Property",
"facetValue": "Organic"
},
{
"facetName": "Property",
"facetValue": "Without parfume"
},
{
"facetName": "Brand",
"facetValue": "Adidas"
}
]
因此,上述产品有 2 个属性/方面组 - 具有 2 个值的属性(有机、无香精)和具有 1 个值的品牌(阿迪达斯)。 在没有任何过滤器的情况下,我从以下查询计算聚合:
"aggs": {
"agg_attr_strings_filter": {
"filter": {},
"aggs": {
"agg_attr_strings": {
"nested": {
"path": "attributeStrings"
},
"aggs": {
"attr_name": {
"terms": {
"field": "attributeStrings.facetName"
},
"aggs": {
"attr_value": {
"terms": {
"field": "attributeStrings.facetValue",
"size": 1000,
"order": [
{
"_term": "asc"
}
]
} } } } } } } }
现在,如果我选择属性“有机”和品牌“阿迪达斯”,我将构建相同的聚合,但使用过滤器来应用这两个约束(这是不是有点问题...):
"aggs": {
"agg_attr_strings_filter": {
"filter": {
"bool": {
"filter": [
{
"nested": {
"query": {
"bool": {
"filter": [
{
"term": {
"attributeStrings.facetName": {
"value": "Property"
}
}
},
{
"terms": {
"attributeStrings.facetValue": [
"Organic"
]
}
}
]
}
},
"path": "attributeStrings"
}
},
{
"nested": {
"query": {
"bool": {
"filter": [
{
"term": {
"attributeStrings.facetName": {
"value": "Brand"
}
}
},
{
"terms": {
"attributeStrings.facetValue": [
"Adidas"
]
}
}
]
}
},
"path": "attributeStrings"
}
}
]
}
},
"aggs": {
"agg_attr_strings": {
"nested": {
"path": "attributeStrings"
},
"aggs": {
"attr_name": {
"terms": {
"field": "attributeStrings.facetName",
},
"aggs": {
"attr_value": {
"terms": {
"field": "attributeStrings.facetValue",
"size": 1000,
"order": [
{
"_term": "asc"
}
]
} } } } } } } }
我可以看到这个模型的唯一方法是计算每个选定方面的聚合并以某种方式合并结果。但这似乎非常复杂,并且有点违背了文章中描述的模型的意义,所以我希望有一个更干净的解决方案,有人可以给出一些尝试的提示。
【问题讨论】:
标签: elasticsearch aggregate facet