Elasticsearch脚本查询按字段值获取参数

问题描述 投票:0回答:3

我正在尝试使用脚本查询过滤结果。 我可以使用硬编码字段值访问参数值,如下所示:

"script": "doc['price'].value * params.1000 > 4000",
      "params": {"1000": "1.75"}

但是,如果我尝试使用 doc 获取字段值,则不会进行过滤,我可以看到所有结果。

    "script": "doc['price'].value * params.doc['rate'] > 4000",
      "params": {"1000": "1.75"}

有没有办法动态获取参数值?

编辑:

字段“费率”只是 ID。它是整数,但不是我需要的值。这个想法是通过参数每次传递不同的值,而不是频繁更新字段“rate”。希望这是更好的解释...

示例:

"script": "doc['price'].value * params.doc['rate'] > 4000",
  "params": {
              "1000": "1.75",
              "1001": "3.75",
              "1002": "5"
            }

if 
'price' == 10 &&
'rate' == 1002
result should be: 10 * 5 > 4000  

if 
'price' == 10 &&
'rate' == 1001
result should be: 10 * 3.75 > 4000

if 
'price' == 7 &&
'rate' == 1000
result should be: 7 * 1.75 > 4000   
elasticsearch elasticsearch-painless
3个回答
0
投票

我假设

rate
integer
,如果是这样的话,脚本不应该是这样的。如果我正确理解了您的过滤,如果不正确,请纠正我:

 "script": "(doc['price'].value * doc['rate'].value) > 4000", <--replace params with doc
      "params": {"1000": "1.75"}

0
投票

你可以尝试这样的事情:

"script": {
    "lang": "painless",
    "inline": "doc['price'].value * params.get(doc['rate'].toString()) > 4000",
    "params": {
        "[1000]": 1.75,
        "[1001]": 3.75,
        "[1002]": 5
    }
}

为什么参数需要方括号我不知道,但是使用带有

Debug.explain(doc['rate'].toString())
的脚本显示转换为字符串的速率字段是这样的(也许您可以使用
rate
的关键字字段,在这种情况下我想参数可以与字段值具有完全相同的名称):

"error": {
    "caused_by": {
        "reason": null,
        "type": "painless_explain_error"
    },
    "class": "java.lang.String",
    "lang": "painless",
    ...
    "script": "Debug.explain(doc['rate'].toString())",
    ...
    "to_string": "[1000]",
},
...

我使用

params.get
是因为params是一个HashMap(再次,使用
Debug.explain(params)
找到)。而且参数值也不是字符串。


0
投票

有类似的用例,你可以这样做。

"script": {
             "source": "if (params.containsKey(doc['id'].value)) { return params[doc['id'].value] } else { return 0 }",
             "params": {
              "60378": 10.0,
              "50236": 5.0,
              "51233": 3.33
            }
          }

在访问参数值之前编写 if 检查可以使其安全查询,否则会因脚本异常而中断。

© www.soinside.com 2019 - 2024. All rights reserved.