elasticsearch - 如何从另一个索引/类型按聚合排序
问题描述
我有一个网上商店,需要按总销售数据进行排序。产品文件示例:
{
"id": 123,
"title": "foo product",
"picture": "https://i.picsum.photos/id/959/200/300.jpghttps://i.picsum.photos/id/959/200/300.jpg"
}
销售文件示例:
{
"product_id": 123,
"date": "2020-01-01",
"sales": 5
},
{
"product_id": 123,
"date": "2020-01-02",
"sales": 6
},
{
"product_id": 123,
"date": "2020-01-03",
"sales": 2
},
{
"product_id": 123,
"date": "2020-01-05",
"sales": 88
}
请注意,没有任何销售的日子不在sales
索引/类型中。
现在:
- 我需要过滤在用户定义的时间段内销售量大于/小于 X 的所有产品(甚至能够过滤销售额 = 0)
- 我需要根据该时间段内的销售额对 asc/desc 进行排序(升序也意味着它应该从没有销售额的产品开始)。
- 我还需要在该结果中匹配的产品文档
- 我还应该能够对产品索引中的其他字段进行排序
我该如何继续执行此操作?我的背景来自 Solr,我会为此使用流式表达。
更新
我要为此悬赏。我发现这可以通过使用聚合和嵌套来实现。
如果我的数据结构必须为此有所不同,请描述。提前致谢!
解决方案
在 elasticsearch 中连接两个索引是不可能的。
有几个选项:
加入类型- 但它不是 rdbms 方式
您可以过滤
sales
索引并使用产品集合查询query
的结果返回sales
以获取产品详细信息。
要对缺失值进行排序,您应该使用missing
参数。
参考
要获取范围,3to10, more than 30
您应该使用 [范围聚合](聚合范围查询弹性搜索)
GET /_search
{
"aggs" : {
"sale_ranges" : {
"range" : {
"field" : "sales",
"ranges" : [
{ "to" : 10 },
{ "from" : 10, "to" : 20 },
{ "from" : 20 }
]
}
}
}
}
没有销售就无法轻松获得产品。为了得到那个,
- 您需要从您的产品表中获取所有产品
- 您需要借助上述步骤获取销售表中缺少的产品。
推荐阅读
- python - 使用输入命令选择网站地址
- python - 如何修复不存在的在线 Jython 错误
- javascript - 使用事件时对此进行分类
- excel - 基于条件的Excel条件格式
- javascript - 数据验证错误“无法读取未定义的属性‘拆分’”
- r - R中的Plot()函数:如何将默认箱线图更改为点图?
- makefile - 使用 GCC 和 Make 构建依赖列表
- powershell - 未经手动接受,无法使用注册表项远程卸载 Google Chrome
- java - 在 Java 中通过 DFS 执行拓扑排序时答案不正确
- python - 利用 Pandas (StatsModels) 在多元回归上创建一个 for 循环