elasticsearch - 从第一个数组元素访问值 - 过滤
问题描述
在花了一个周末寻找答案后,我决定向你寻求帮助。我有一个产品索引。变体是产品中对象的嵌套列表,我在喂食索引时按库存数量和其他一些条件对它们进行排序。我正在尝试按弹性响应中第一个变量的值对产品进行排序(包括在查询中传递的过滤器)。这是我正在寻找的示例。缩短的弹性响应结构:
{
"id": 6346,
"name": "name",
"variants": [
{
"variant_id": 1,
"stock_quantity": 20,
"price": 9.9
},
{
"variant_id": 2,
"stock_quantity": 15,
"price": 20.9
},
{
"variant_id": 3,
"stock_quantity": 0,
"price": 16.9
}
]
}
让我们按价格 gte 15 过滤列表:
{
"id": 6346,
"name": "name",
"variants": [
{
"variant_id": 2,
"stock_quantity": 15,
"price": 20.9
},
{
"variant_id": 3,
"stock_quantity": 0,
"price": 16.9
}
]
}
现在我尝试通过响应中第一个变体的价格对产品进行排序。到目前为止我试图做什么?
按脚本排序
"sort":
{
"_script": {
"order": "desc",
"type": "number",
"script": {
"source": "return params['_source']['variants'][0].gross_price"
}
}
}
这一直有效,直到我开始过滤列表。在 variant.gross_price gte 15 案例中,脚本从源文档返回值:9.9,而不是我预期的 20.9。我跳过了出于性能原因不推荐参考源的事实。
按字段排序
"sort":
{
"variants.gross_price": {
"nested": {
"path": "variants",
"filter": {
"bool": {
"filter": [
{
"range": {
"variants.gross_price": {
"gt": "15"
}
[...]
我不知道为什么,但是这样我就没有从响应中得到第一个变体的价格,而是产品中最便宜的变体的价格——在这种情况下是 16.9。
我还在变体中添加了标志“include_in_parent”,并尝试通过脚本中的“doc['variants.gross_price'].values”获取值,但效果与第一个相同。
所以..我还能尝试做什么?
我正在寻找来自 6.5 版本的更新Max_children。
解决方案
你可以试试下面的脚本。
"sort": {
"_script": {
"type": "number",
"script": {
"inline": "if(doc['variants.gross_price'].value > 15) {max = doc['variants.gross_price'].value;}, abs(max)",
"order" : asc
}
}
}
推荐阅读
- crm - 是否可以在 Zoho CRM 中自动从销售订单转换为采购订单?
- r - R将行随机分成两半
- html - 如何在将 css 应用于图像时将图像与 a 标签链接?
- python - 如何间接重命名目录中的文件?
- html - 有谁知道为什么我的缩略图没有显示?
- python - 如何在 Python 运行时获取类属性的类型注释
- node.js - Docker MERN 部署 - 热重载不起作用
- sql - 选择在一个字符串列中从另一个字符串中出现最少的记录
- node.js - 根据打字稿,Mongo $push 运算符不接受对象:“没有重载匹配此调用”
- image - 如何使用相同的js代码在多个编辑器上启用summernote图像上传?