Отображение эластичного динамического поля

#elasticsearch #elastic-stack

#elasticsearch #эластичный-стек

Вопрос:

  ES version 6.8.12
  

Я хочу сопоставить все типы с заданным полем в индексе, в нем должны храниться все типы данных, а не привязанные к определенному типу.
я сталкиваюсь с проблемой, когда строка хранится в поле длинного типа.

 [WARN ] 2020-09-14 06:34:36.470 [[main]>worker0] elasticsearch - Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>"5f4632bab98bdd75a267546b", :_index=>"cdrindex", :_type=>"doc", :routing=>nil}, #<LogStash::Event:0x38a5506>], :response=>{"index"=>{"_index"=>"cdrindex", "_type"=>"doc", "_id"=>"5f4632bab98bdd75a267546b", "status"=>400, "error"=>{"type"=>"mapper_parsing_exception", "reason"=>"failed to parse field [caller_id_number] of type [long] in document with id '5f4632bab98bdd75a267546b'", "caused_by"=>{"type"=>"illegal_argument_exception", "reason"=>"For input string: "Anonymous""}}}}}
  

Ответ №1:

Затем вам нужно выбрать тип данных text или keyword .

В вашем сопоставлении вам нужно явно указать caller_id_number тип данных на один из указанных выше вместо того, чтобы позволить Elasticsearch решать за вас.

Например:

 PUT your-index
{
  "mappings": {
    "properties": {
      "caller_id_number": {
        "type": "text"
      },
      ...
    }
  }
}
  

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

 PUT your-index
{
  "mappings": {
    "dynamic_templates": [
      {
        "sources": {
          "match": "caller_*",
          "mapping": {
            "type": "text"
          }
        }
      }
    ],
    "properties": {
      "specific_field": {
        "type": "long"
      }
    }
  }
}
  

При приведенном выше динамическом отображении все поля, начинающиеся с caller_ , будут автоматически отображаться как text , в то время как specific_field будут отображаться как long

Комментарии:

1. тогда мне нужно указать все возможные типы, верно? можете ли вы привести мне пример, если вас смутили «свойства»: { «caller_id_number»: { «тип»: «текст» }, «свойства»: { «caller_id_number»: { «тип»: «строка» },….

2. Не просто текст, поскольку он будет работать для любого типа значений

3. он показывает ошибку, illegal_argument_exception не могли бы вы, пожалуйста, показать мне что-нибудь более подробное «cdrindex» — это мое имя индекса, а em_id и caller_id_number — это два поля спасибо.

4. { «_index»: «cdrindex», «_type»: «doc», «_id»: «5f3eeeb73861893e3b52cde7», «_score»: 1, «_source»: { «caller_id_number»: 2674607107, «log_entry»: «{«_id»=> BSON:: ObjectId(‘ 5f3eeeb73861893e3b52cde7’), «идентификатор вызывающего абонента»=>»2674607107″ }», «@ версия»: «1» } } это мой документ, поданный «caller_id_number» может содержать любое неопределенное значение, которое затрудняет вставку в индекс для «Logstash»

5. Что вы делаете при запуске GET cdrindex ? Пожалуйста, обновите свой вопрос с полученным результатом