我一直在使用elasticsearch查询和过滤一段时间但以前从未使用过聚合.我们可以使用我们的查询来定义聚合的想法对我来说似乎相当惊人,但我想要了解如何正确地做到这一点,这样我就不会犯任何错误.目前我的所有搜索查询都是这样设计的:
{
"query": {
},
"filter": {
},
"from": 0,
"size": 60
}
Run Code Online (Sandbox Code Playgroud)
现在,当我添加一些聚合桶时,结构变为:
{
"aggs": {
"all_colors": {
"terms": {
"field": "color.name"
}
},
"all_brands": {
"terms": {
"field": "brand_slug"
}
},
"all_sizes": {
"terms": {
"field": "sizes"
}
}
},
"query": {
},
"filter": {
},
"from": 0,
"size": 60
}
Run Code Online (Sandbox Code Playgroud)
但是,无论我在过滤器中提供什么信息,聚合的结果总是相同的.
现在,当我将查询结构更改为类似的内容时,它开始显示不同的结果:
{
"aggs": {
"all_colors": {
"terms": {
"field": "color.name"
}
},
"all_brands": {
"terms": {
"field": "brand_slug"
}
},
"all_sizes": {
"terms": {
"field": "sizes"
}
}
},
"query": {
"filtered": {
"query": {
},
"filter": {
}
}
},
"from": 0,
"size": 60
}
Run Code Online (Sandbox Code Playgroud)
这是否意味着我必须将搜索查询的结构更改为这种新的过滤类型的结构?还有其他解决方法可以让我在不改变那么多代码的情况下实现预期的结果吗?
另外,我观察到的另一件事是,如果我的brand_slug字段包含多个关键字,如"peter england",那么这两个关键字都会在不同的桶中返回,如下所示:
{
"buckets": [
{
"key": "england",
"doc_count": 368
},
{
"key": "peter",
"doc_count": 368
}
]
}
Run Code Online (Sandbox Code Playgroud)
我如何确保这两者最终都在这样的桶中:
{
"buckets": [
{
"key": "peter england",
"doc_count": 368
}
]
}
Run Code Online (Sandbox Code Playgroud)
更新:第二部分我能够通过不同的方式索引品牌,颜色和尺寸来实现:
"sizes": {
"type": "string",
"fields": {
"raw": {
"type": "string",
"index": "not_analyzed"
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7156 次 |
| 最近记录: |