ElasticSearch 按多个脚本排序



我正在尝试使用多个脚本对 Elastic 6.7 中的结果进行排序

不幸的是,我没有找到尝试很多组合的方法。

我不能只使用一个脚本来完成所有操作,因为过滤器和排序是动态的。

这是我的查询:

{
  "query": {
    "bool": {
      "must": [],
      "filter": []
    }
  },
  "sort": {
    "_script": [
      {
        "type": "number",
        "order": "desc",
        "script": {
          "lang": "painless",
          "source": "doc['status.keyword'].value == 'active' ? 1 : 0;"
        }
      },
      {
        "type": "number",
        "order": "desc",
        "script": {
          "lang": "painless",
          "source": "(doc['s_price'].value/doc['currency.usd_c'].value*params.cvs)",
          "params": {
            "cvs": 42.71
          }
        }
      }
    ]
  },
}

谢谢!!

POST /_update_by_query
{
  "script": {
    "source": "ctx._source.active += ctx._source['status.keyword'].value == 'active' ? 1 : 0;",
    "lang": "painless"
  },
  "query": {
    "match_all": {}
  }
}
GET /_search
{
    "query": {
        "function_score": {
            "query": {
                "bool": {
                  "must": [],
                  "filter": []
                }
              },
            "script_score" : {
                "script": {
                  "source": "(doc['s_price'].value/doc['currency.usd_c'].value*params.cvs)",
                  "params": {
                    "cvs": 42.71
                  }
                }
            }
        }
    },
    "sort": [{
        "active": "desc"
    },
    {
        "score": "desc"
    }]
}

使用批量更新为其中一个查询添加字段active。并使用function_score查询来计算另一个值。先按active排序,再按score排序

使用多个脚本对运行时字段进行排序变得更加容易。如果您使用的是 ES 7.11 或更高版本,只需为每个脚本定义一个运行时字段,并使用这些字段对数据进行排序:

{
    "query": {
        "bool": {
            "must": [],
            "filter": []
        }
    },
    "runtime_mappings": {
        "active": {
            "type": "long",
            "script": {
                "lang": "painless",
                "source": "emit(doc['status.keyword'].value == 'active' ? 1 : 0);"
            }
        },
        "price": {
            "type": "long",
            "script": {
                "lang": "painless",
                "source": "emit(doc['s_price'].value/doc['currency.usd_c'].value*params.cvs)",
                "params": {
                    "cvs": 42.71
                }
            }
        }
    },
    "sort": [
        {
            "active": {
                "order": "desc"
            }
        },
        {
            "price": {
                "order": "desc"
            }
        }
    ]
}

请注意,运行时字段中的脚本不能使用 return 来发出值,但您需要使用 emit 函数。

最新更新