2016-12-18 3 views
0

Я пытаюсь отфильтровать результаты с помощью запроса на скрипт. я могу получить доступ к значениям параметров с помощью закодированного значения поля, как это:Запрос сценария Elasticsearch получить параметр по значению поля

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

Но если я пытаюсь получить значение поля с доком нет фильтрации и я могу видеть все результаты.

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

Есть ли какое-либо решение для динамического получения значения параметра?

EDIT:

поле 'Скорость' является только ID. Это Integer, но это не значение, которое мне нужно. Идея состоит в том, чтобы передавать каждый раз различное значение через параметр, вместо этого часто изменяя поле «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 
+0

Это строка, к которой вы пытаетесь получить доступ? и какова фильтрация, которую вы ожидаете? – Kulasangar

ответ

0

Я принимаю rate как integer, если это не сценарий выглядеть таковым. Если я правильно понял вашу фильтрацию, если нет, пожалуйста, поправьте меня:

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

doc ['rate']. Значение целое, но это не значение, которое мне нужно. Он будет часто меняться, поэтому идея заключалась в том, чтобы передать его как параметр. В этом контексте «ставка» - это всего лишь идентификатор. Надеюсь, это лучшее объяснение. – Pusic

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)). Также значения параметров не являются строками.

Смежные вопросы