2016-01-25 2 views
2

Используя данные из текущей версии Elasticsearch: The Definitive Guide, то есть:Elasticsearch: как искать вычисляемых полей

[{ 
    "first_name" : "John", 
    "last_name" : "Smith", 
    "age" :  25, 
    "about" :  "I love to go rock climbing", 
    "interests": [ "sports", "music" ] 
}, { 
    "first_name" : "Jane", 
    "last_name" : "Smith", 
    "age" :   32, 
    "about" :  "I like to collect rock albums", 
    "interests": [ "music" ] 
}, { 
    "first_name" : "Douglas", 
    "last_name" : "Fir", 
    "age" :   35, 
    "about":  "I like to build cabinets", 
    "interests": [ "forestry" ] 
}] 

Я пытаюсь запустить простой расчет (я включен Groovy сценариев) с помощью данные запроса:

{ 
    "query": { 
     "filtered": { 
      "filter": { 
       "range": { 
        "max_age": { 
         "gt": 150 
        } 
       } 
      } 
     } 
    }, 
    "script_fields": { 
     "max_age": { 
      "script": "_source.age * 5" 
     } 
    } 
} 

Но ES не возвращает никаких данных. Как я могу выполнить поиск по вычисленным полям? Это даже лучше, если мне не нужно включать скрипты.

ответ

3

script_fields вычисляются после фазы запроса, то есть during the fetch phase, поэтому вы не можете ссылаться на поля сценария внутри своих запросов.

Что вам нужно для достижения еще можно сделать, хотя, с помощью script filter, например:

{ 
    "query": { 
    "bool": { 
     "must": { 
     "script": { 
      "script": { 
      "inline": "doc['age'].value * factor > max_age", 
      "params": { 
       "factor": 5, 
       "max_age": 150 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Вместо того чтобы давать MAX_AGE как определенное количество, можно использовать что-то вроде «max_age = DOC. field_a.values.max();» –

+0

@ M.Prabhakaran можно вычислить максимальное значение значений в массиве внутри самого скрипта. – Val

+0

Можете ли вы привести мне пример? –

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