Добавить поле с динамически сопоставленным значением для всех документов - PullRequest
0 голосов
/ 10 февраля 2020

Существует индекс shakespeare с документами, похожими на следующие:

{
        "_index" : "shakespeare",
        "_type" : "line",
        "_id" : "24",
        "_score" : 1.0,
        "_source" : {
          "play_name" : "Henry IV",
          "speech_number" : 1,
          "line_number" : "1.1.22",
          "text_entry" : "Forthwith a power of English shall we levy;",
          "speaker" : "KING HENRY IV",
          "line_id" : 1
        }
      },

У меня есть файл / таблица / et c., Который выглядит следующим образом

+---------+--------------+
| line_id | is_a_good_line |
+---------+--------------+
|       1 |            1 |
|       2 |            1 |
|       3 |            0 |
|       4 |            0 |
|       5 |            1 |
+---------+--------------+

Я хочу, чтобы для каждого документа в индексе shakespeare было новое поле is_a_good_line со значением, соответствующим отображению из таблицы (на основе line_id). Итак, для приведенного выше примера значение is_a_good_line должно быть равно 1, как показано ниже:

{
        "_index" : "shakespeare",
        "_type" : "line",
        "_id" : "24",
        "_score" : 1.0,
        "_source" : {
          "play_name" : "Henry IV",
          "speech_number" : 1,
          "line_number" : "1.1.22",
          "text_entry" : "Forthwith a power of English shall we levy;",
          "speaker" : "KING HENRY IV",
          "is_a_good_line" : 1,
          "line_id" : 1
        }
      },

Я нашел способ просто добавить новое поле для всех документов со значением stati c:

POST shakespeare/_update_by_query
{
  "script": {
    "inline": "ctx._source.is_a_good_line = 0",
    "lang": "painless"
  }
}

Как добавить новое поле со значением, определенным в таблице сопоставления выше (на основе значения line_id)?

1 Ответ

1 голос
/ 11 февраля 2020

Существует несколько вариантов: от написания простой программы, которая анализирует файл / таблицу и соответствующим образом обновляет соответствующие документы, до определения конвейера Logsta sh, который выполняет ту же работу, используя соответствующие плагины ввода / вывода. Конечно, вы не можете полагаться на Elasticsearch только для анализа внешнего файла.

Если вы хотите go для опции программы, это может быть что-то такое же простое, как сценарий bash, который анализирует файл и curls _update_by_query с таким запросом

{
  "query": {
    "match": { "line_id": <the_line_id_fetched_from_the_file>
  },
  "script": {
    "inline": "ctx._source.is_a_good_line = <the_is_a_good_line_value_from_the_file>",
    "lang": "painless"
  }
}

или вы можете разработать ту же программу на вашем любимом языке, используя одну из многих официальных клиентских библиотекasticsearch: https://www.elastic.co/guide/en/elasticsearch/client/index.html

Если вместо этого вы хотите go для опции конвейера Logsta sh, вы можете захотеть взглянуть на плагин ввода файлов и плагин вывода asticsearch ( обратите внимание на опцию script, в частности) и, возможно, на плагин csv filter (в зависимости от структуры данных в вашем файле / таблице).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...