1

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

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

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

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

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

编辑:

字段 'rate' 只是 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   
4

2 回答 2

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())显示转换为字符串的速率字段是这样的(也许您可以使用关键字字段 for 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))。参数值也不是字符串。

于 2017-03-13T18:43:09.960 回答
0

我假设rateinteger,如果是这样,脚本不应该是这样的。如果我正确理解了您的过滤,如果没有,请纠正我:

 "script": "(doc['price'].value * doc['rate'].value) > 4000", <--replace params with doc
      "params": {"1000": "1.75"}
于 2016-12-18T16:25:34.720 回答