我使用弹性搜索来获取所有产品的列表(比如相机),但我想从匹配查询中得到的结果中动态填充制造商列表。
{
"query": {
"match": {
"product_type" : "CAMERA"
}
}
}
给我一个这样的项目列表(删除不相关的数据后)
{
"_score": 11.234668,
"_source": {
"product_type": "CAMERA",
"mfg_name": "SONY"
}
}
我无法汇总文档中的所有mfg_name
,因为它也会包含其他产品的制造商。我想做什么,得到我查询的产品类型的所有mfg_name
。
弹性搜索本身是否支持?我可以链接我的查询,以便match
查询对aggs
查询的输出进行操作吗?或者我是否必须编写服务以逐个浏览项目并获取列表?
编辑:我使用它来获取聚合,因为默认情况下在文本字段上禁用了Fielddata
{
"size": 0,
"aggs" : {
"manufacturer" : {
"terms" : { "field" : "mfg_name.keyword", "size" : 500 }
}
}}
答案 0 :(得分:1)
您可以汇总查询结果。只需要在同一个查询中写下所有内容。
Aggregation over the query results
您应该将mfg_name字段编入索引为非分析字符串,以便能够对该字段进行聚合。否则你会得到奇怪的结果,比如SON的聚合,例如ONY的另一个聚合。
在此处回复以便能够粘贴代码。
更新索引
PUT my_index { "mappings": {
"doc": {
"properties": {
"mfg_name": { "type": "text" },
"mfg_name_na": { "type": "text" , index: "not_analyzed" }
}
}
}
}
我将mfg_name复制到非分析字段,以便您可以对原始字段进行全文搜索,然后对未经分析的字段进行聚合。
然后重新索引,你可以像这样查询:
{
"query": {
"match": {
"product_type": "CAMERA"
}
},
"aggs": {
"producers": {
"terms": {
"field": "mfg_name_na"
}
}
}
}
您应该收到一个包含带有所需数据的存储桶聚合的响应。