【问题标题】:ElasticSearch sorting by multiple scriptsElasticSearch 按多个脚本排序
【发布时间】:2019-04-03 00:38:54
【问题描述】:

我正在尝试使用多个脚本对 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
          }
        }
      }
    ]
  },
}

谢谢!!

【问题讨论】:

    标签: sorting elasticsearch elastic-stack


    【解决方案1】:
    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 排序

    【讨论】:

      【解决方案2】:

      runtime fields 使用多个脚本进行排序变得容易得多。如果您使用的是 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 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-09
        • 2012-02-23
        • 1970-01-01
        • 1970-01-01
        • 2020-10-22
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        相关资源
        最近更新 更多