使用 nest c# 的 Elasticsearch 过滤器组
Elasticsearch filter group by using nest c#
我正在使用弹性搜索来获取按类别分组的产品并对结果执行聚合....
如果我使用 categoryid(numeric) 作为字段,它会给出结果,但是当我尝试给出类别名称时,它会给出 Unsuccessful(400)
请看打击代码片段
我正在获取文档计数。我可以从同一个请求中获取文档数据吗?
ISearchResponse<Products> results;
results = _client.Search<Products>(s => s
//.Size(int.MaxValue)
.Query(q => q
.Bool(b => b
.Should(
bs => bs.Prefix(p => p.cat_name, "heli"),
bs => bs.Prefix(p => p.pr_name, "heli")
)
)
)
.Aggregations(a => a
.Terms("catname", t => t
.Field(f => f.categoryid)
.Size(int.MaxValue)
.Aggregations(agg => agg
.Max("maxprice", av => av.Field(f2 => f2.price))
.Average("avgprice", av => av.Field(f3 => f3.price))
.Max("maxweidht", av => av.Field(f2 => f2.weight))
.Average("avgweight", av => av.Field(f3 => f3.weight))
)
)
)
);
映射模型:
{
"product_catalog": {
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"@version": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"cat_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"categoryid": {
"type": "long"
},
"createdon": {
"type": "date"
},
"fulldescription": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"height": {
"type": "float"
},
"length": {
"type": "float"
},
"pr_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"price": {
"type": "long"
},
"productid": {
"type": "long"
},
"shortdescription": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"sku": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"updatedon": {
"type": "date"
},
"weight": {
"type": "float"
},
"width": {
"type": "float"
}
}
}
}
}
任何人都可以指导如何使用类别名称进行分组。
catname
字段的类型为 text
,因此您不能在聚合中默认使用它,因为 fielddata
is disabled 出于性能原因。
根据您的映射,我看到您也在为 keyword
以及 catname
编制索引,因此您可以使用此字段。
只需将您的术语聚合 .Field(f => f.categoryid)
的这一部分更改为
.Field(f => f.cat_name.Suffix("keyword"))
你应该很好。
我正在使用弹性搜索来获取按类别分组的产品并对结果执行聚合.... 如果我使用 categoryid(numeric) 作为字段,它会给出结果,但是当我尝试给出类别名称时,它会给出 Unsuccessful(400)
请看打击代码片段
我正在获取文档计数。我可以从同一个请求中获取文档数据吗?
ISearchResponse<Products> results;
results = _client.Search<Products>(s => s
//.Size(int.MaxValue)
.Query(q => q
.Bool(b => b
.Should(
bs => bs.Prefix(p => p.cat_name, "heli"),
bs => bs.Prefix(p => p.pr_name, "heli")
)
)
)
.Aggregations(a => a
.Terms("catname", t => t
.Field(f => f.categoryid)
.Size(int.MaxValue)
.Aggregations(agg => agg
.Max("maxprice", av => av.Field(f2 => f2.price))
.Average("avgprice", av => av.Field(f3 => f3.price))
.Max("maxweidht", av => av.Field(f2 => f2.weight))
.Average("avgweight", av => av.Field(f3 => f3.weight))
)
)
)
);
映射模型:
{
"product_catalog": {
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"@version": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"cat_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"categoryid": {
"type": "long"
},
"createdon": {
"type": "date"
},
"fulldescription": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"height": {
"type": "float"
},
"length": {
"type": "float"
},
"pr_name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"price": {
"type": "long"
},
"productid": {
"type": "long"
},
"shortdescription": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"sku": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"updatedon": {
"type": "date"
},
"weight": {
"type": "float"
},
"width": {
"type": "float"
}
}
}
}
}
任何人都可以指导如何使用类别名称进行分组。
catname
字段的类型为 text
,因此您不能在聚合中默认使用它,因为 fielddata
is disabled 出于性能原因。
根据您的映射,我看到您也在为 keyword
以及 catname
编制索引,因此您可以使用此字段。
只需将您的术语聚合 .Field(f => f.categoryid)
的这一部分更改为
.Field(f => f.cat_name.Suffix("keyword"))
你应该很好。