【问题标题】:Unable to use painless in elasticsearch query无法在弹性搜索查询中使用无痛
【发布时间】:2019-12-22 16:34:43
【问题描述】:

我有以下查询,它使用无痛脚本来创建 script_score, 用于排序。

以下是我的创作脚本 -

PUT /listings/_doc/1
{
  "prod_id" : 1,
  "currency" : "USD",
  "price" : 1
}

PUT /listings/_doc/2
{
  "prod_id" : 2,
  "currency" : "INR",
  "price" : 60
}

PUT /listings/_doc/3
{
  "prod_id" : 3,
  "currency" : "EUR",
  "price" : 2
}

PUT /listings/_doc/4
{
  "prod_id" : 5,
  "currency" : "MYR",
  "price" : 1
}

数据看起来像这样 -

{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "prod_id" : 1,
          "currency" : "USD",
          "price" : 1
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "prod_id" : 2,
          "currency" : "INR",
          "price" : 60
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "prod_id" : 3,
          "currency" : "EUR",
          "price" : 2
        }
      },
      {
        "_index" : "products",
        "_type" : "_doc",
        "_id" : "5",
        "_score" : 1.0,
        "_source" : {
          "prod_id" : 5,
          "currency" : "MYR",
          "price" : 1
        }
      }
    ]
  }
}

我尝试运行的查询 -

GET products/_search
{
    "query": {
        "function_score": {
            "query": {
                "match_all": {}
            },
            "functions": [{
                "script_score": {
                    "script": {
                        "params": {
                            "usd": 1,
                            "isCheckOutUsd" : true,
                            "sgdBuy": 0.72,
                            "sgdSpot": 0.72,
                            "myrBuy": 0.24,
                            "myrSpot": 0.24,
                            "inrBuy": 0.014,
                            "inrSpot": 0.014,
                            "eurBuy": 1.12,
                            "eurSpot": 1.12
                        },
                         "source": """
                            double valueForComparision = 0;

                            if(doc.currency.value == 'usd'){
                                valueForComparision = doc.price.value;
                            }
                            else{
                                if(params.isCheckOutUsd){
                                    String temp = doc.currency.value + "Buy";       
                                    valueForComparision = doc.price.value / params[temp];
                                }
                                else{
                                    String temp = doc.currency.value + "Spot";      
                                    valueForComparision = doc.price.value / params[temp];
                                }
                            }
                            return valueForComparision;     
                        """
                    }
                }
            }]
        }
    },
    "sort": [
    {
      "_score": {
        "order": "desc"
      }
    }
  ]
}

我正在关注此文档作为参考 - https://www.elastic.co/guide/en/elasticsearch/painless/master/painless-walkthrough.html

【问题讨论】:

    标签: elasticsearch elasticsearch-painless


    【解决方案1】:

    你的 if 条件需要是一个布尔值

    改变这个

    if('isCheckOutUsd')
    

    到这里:

    if(params.isCheckOutUsd)
    

    【讨论】:

    • 这个运气好吗?
    • 现在遇到不同的错误,更新问题
    • 您在if(params.isCheckOutUsd) 之后缺少并打开花括号
    • 得到wrong_method_type_exception,我能得到eurBuy in temp
    • 不确定 doc.price.value / 'temp' 应该做什么,但您不能将 long 除以字符串(请参阅错误消息)
    猜你喜欢
    • 2022-06-19
    • 1970-01-01
    • 2021-10-31
    • 2021-12-02
    • 2019-11-15
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    相关资源
    最近更新 更多