Все, что вам нужно знать о безболезненных контекстах

Добро пожаловать в четвертую часть семинара. Как обычно, чтобы каждая статья была максимально компактной, я буду сокращать запросы до фрагментов. Если вы хотите увидеть полный код, обратитесь к моей странице GitHub для этого семинара.

Этот мастер-класс будет отличаться от других. Нам нужно смотреть на безболезненные контексты. Прямо во второй части скриптового воркшопа. Как только вы начнете писать сценарии — встроенные или сохраненные, вызываемые конвейерами, шаблонами поиска или обновлениями — вы будете бороться с контекстами. Каждый раз, когда вы читаете, создаете или обновляете поля — а потому имеет смысл с самого начала получить четкую картину. Сказав это: давайте прыгать прямо!

Будьте готовы к путанице!

Контекст предоставляет переменные и поля, классы и методы, а также какие значения могут быть возвращены. Так сказать: ваш скрипт может отлично работать в конвейере, но он терпит неудачу в поле времени выполнения. И даже хуже; ваш сохраненный сценарий безупречно работает в вашем конвейере, но если вы используете его для обновления, он дает сбой. Чтобы получить представление о том, сколько контекстов существует, посетите официальную документацию.

Короче говоря: контекст обеспечивает и устанавливает границы, в которых будет работать ваш сценарий.

Мы не будем охватывать все контексты, просто их слишком много. Но мы рассмотрим те, которые мы уже использовали в мастерской:

  • ingest-процессор (конвейеры)
  • обновлять
  • update_by_query
  • переиндексировать
  • поля времени выполнения
  • поля

Таблица распутывания

Пожалуйста, используйте следующую таблицу в качестве краткого справочника.

Пожалуйста, обратитесь к официальной документации по стандартному API для классов, которые доступны во всех доступных контекстах (по крайней мере, в одном из перечисленных выше) и специализированному API загрузки для процессоров загрузки / API специализированных полей для полей времени выполнения/среды выполнения. -отображения».

соревнование

Чтобы показать вам, как справляться с различными контекстами, мы решим одну и ту же задачу во всех контекстах. Это наши данные:

PUT companies/_doc/1
{ "ticker_symbol" : "ESTC",
  "market_cap" : 8000000000,
  "share_price" : 82.5 }

У нас есть рыночная капитализация и цена акций, теперь мы будем использовать различные API для расчета акций в обращении.

поглощающий-процессор-контекст

Конвейеры могут получить доступ к источнику документа напрямую через переменную «ctx-map» и «dot-notion»:

double outstanding = ctx.market_cap / ctx.share_price;
ctx['outstanding'] = (long)outstanding

К полям также можно обращаться с помощью «ctx[имя-поля]», называемого «понятием-скобкой»:

double outstanding = ctx['market_cap'] / ctx['share_price'];
ctx['outstanding'] = (long)outstanding

Какая разница, спросите вы? «Квадратное понятие» обеспечивает большую гибкость. Поля типа ctx[‘a b’] возможны, в то время как "dot-notion" предотвращает вызов типа "ctx.a b". Чтобы быть в безопасности, используйте «точечное понятие» как можно больше.

Если вы хотите использовать классы Java, проверьте ingest API для пакета java.lang и общий API для поддерживаемых классов. Painless поддерживает довольно большое количество классов Java.

Обратитесь к официальной документации для получения дополнительной информации и поддерживаемых методов и API.

Контексты update-, update_by_query- и переиндексации используют карту «ctx._source» для доступа к полям документа:

double out = ctx._source.market_cap / ctx._source.share_price;
ctx._source.outstanding = (long)out

Контекст обновления также предоставляет переменную ctx.now с текущей отметкой времени. update_by_query и переиндекс не предоставляют эту переменную.

Контексты update-, update_by_query- и переиндексации предоставляют специальную переменную «op». Что позволяет удалить документ при необходимости:

"script" : {
  "source": """
  ctx.op = 'delete'      
  """
}

Для очистки данных, например, документов с пустыми полями компании, проверка их и дополнительное удаление с помощью «ctx.op = delete» было бы практическим вариантом использования update_by_query.

Пожалуйста, ознакомьтесь с примерами для update- и update_by_query на GitHub-странице этого семинара.

контекст переиндексации

Контекст переиндексации не предоставляет никаких дополнительных переменных или методов, кроме update или update_by_query. Вот только пример скрипта, который обращается к карте «ctx._source» по «точке-понятию»:

POST _reindex
{ "source": {
    "index": "companies" },
  "dest": {
    "index": "companies_new" },
  "script": {
    "source": 
  """
  double outstanding = ctx._source.market_cap / ctx._source.share_price;
  ctx._source.outstanding_reindexed = (long)outstanding 
  """
} }

runetime_field-контекст

Контекст runtime_field использует «doc-map» для доступа к полям документа. Эта карта доступна только для чтения.

"runtime_mappings": {
    "outstanding": {
      "type": "long",
      "script": {
        "lang": "painless", 
        "source": 
"""
long result;
double outstanding = doc.market_cap.value / doc['share_price'].value;
result = (long)outstanding; 
emit(result);
"""
      }
    }
  },
  "fields": ["outstanding"]

runtime_field-context — это единственный, который использует метод emit для возврата результатов. emit не может возвращать нулевые значения, и должен быть возвращен хотя бы один объект, поэтому проверяйте значения перед их отправкой.

контекст полей

Поля сценария очень похожи на контекст поля времени выполнения. Однако шаблоны grok и dissect недоступны — runtime_fields предоставляет эти методы.

GET companies/_search
{
  "script_fields": {
    "free_float": {
      "script": {
        "source": 
"""
long result;
double outstanding = doc.market_cap.value / doc['share_price'].value;
result = (long)outstanding; 
return (result)
"""
} } } }

Если был создан только один объект, метод возврата не нужен. Если было создано более одного объекта, будет возвращен последний измененный объект. Чтобы избежать путаницы, используйте метод возврата.

Поля со сценариями также не нуждаются в параметре fields для отображения возвращаемых объектов — в отличие от отображений во время выполнения.

Заключение

Если вы попали сюда: Поздравляем! Теперь вы должны иметь возможность перемещаться по различным контекстам. Не стесняйтесь читать официальную документацию, если ваш сценарий не работает, характеристики различных контекстов могут сбивать с толку!

Если Google привел вас сюда, вы можете проверить также начало серии или вся серия.

И как всегда: полные запросы и код доступны на GitHub page for this Workshop.

Первоначально опубликовано на https://cdax.ch.