Как обрабатывать нули в индексе Elasticsearch - PullRequest
2 голосов
/ 05 марта 2020

У меня есть таблица SQL, которую я экспортирую в Elasticsearch.

Один из столбцов - это поле числового значения c, которое может иметь значение null, с нулями в некоторых записях.

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

One of the ETL (BigQuery -> ElasticSearch) jobs for Table : MLS has been ES Failed Chunk of 10000 from index 20000 possibly due to incompatible objects.

Failing BigQuery Table: MLS

Stack Trace of the error:

Traceback (most recent call last): File "/Users/asif/zodiacbackend/zodiacbackend/tasks.py", line 205, in insertIntoES helpers.bulk(es, doc_generator(dataframe,table)) File "/Users/asif/zodiacbackend/env/lib/python3.7/site-packages/elasticsearch/helpers/actions.py", line 300, in bulk for ok, item in streaming_bulk(client, actions, *args, **kwargs): File "/Users/asif/zodiacbackend/env/lib/python3.7/site-packages/elasticsearch/helpers/actions.py", line 230, in streaming_bulk **kwargs File "/Users/asif/zodiacbackend/env/lib/python3.7/site-packages/elasticsearch/helpers/actions.py", line 158, in _process_bulk_chunk raise BulkIndexError("%i document(s) failed to index." % len(errors), errors) elasticsearch.helpers.errors.BulkIndexError: ('2 document(s) failed to index.', [{'index': {'_index': 'mls', '_type': 'mls', '_id': 'b100qHABEFI45Lp-z3Om', 'status': 400, 'error': {'type': 'illegal_argument_exception', 'reason': 'mapper [Lot_Size_Sq_Ft] of different type, current_type [text], merged_type [long]'}, 'data': { 'Lot_Size_Sq_Ft': Decimal('13504')}}}]) 

Как заставить систему распознавать нули?

Ответы [ 2 ]

1 голос
/ 05 марта 2020

Пользователь WittyID, пропустил некоторые важные вещи, такие как:

  1. значения null_value должны быть того же типа данных, что и ваше поле, поэтому в своем примере он объявил integer поле но определенная NULL как null_values, выдаст json_parse_exception, и это упоминается как important в официальной ссылке , как показано ниже:

Значение null_value должен быть того же типа данных, что и поле. Например, длинное поле не может иметь строку null_value.

null_value влияет только на то, как данные индексируются, он не изменяет документ _source, поэтому в исходном документе будет храниться , что бы вы ни передавали, а не тот, который указан в null_values param и во время запроса вам также необходимо использовать значение null_value param. .

Короче говоря, null не распознается в ES, поэтому вы можете определить свои собственные значения для null, а затем используйте его для индексации и запроса значений null. Все это легко объяснить с помощью приведенного ниже примера, который может попробовать любой:

Создать индекс

{
  "mappings": {
    "properties": {
      "my_signed_integer": {
        "type":"integer",
        "null_value": -1 --> note we defining `null` values as `-1`.
      }
    }
  }
}

Индекс do c

  1. store null integer docs

    {"my_number": null}

Если вы получить это сделать c от ES, оно будет возвращено, как показано ниже:

{
   "_index": "so-6053847",
   "_type": "_doc",
   "_id": "1",
   "_version": 1,
   "_seq_no": 0,
   "_primary_term": 1,
   "found": true,
   "_source": {
      "my_number": null. --> As explained earlier, in source its stored as `null`.
   }
}

Неотрицательное значение индекса

{"my_number": 10}

Поисковый запрос для получения целого числа, которое имело null значения

{
  "query": {
    "term": {
      "my_signed_integer": -1 -->notice same `null_value`, you need to mention
    }
  }
}

Результат:

 "hits": [
         {
            "_index": "so-6053847",
            "_type": "_doc",
            "_id": "1",
            "_score": 1.0,
            "_source": {
               "my_signed_integer": null --> notice it shows `null`, not `-1`
            }
         }
      ]

Запрос на поиск других чисел (не ноль) ie в нашем случае 10

{
  "query": {
    "term": {
      "my_signed_integer": 10
    }
  }
}

Результат

"hits": [
         {
            "_index": "so-6053847",
            "_type": "_doc",
            "_id": "2",
            "_score": 1.0,
            "_source": {
               "my_signed_integer": 10 -->source matches the indexed value for this doc
            }
         }
      ]
0 голосов
/ 05 марта 2020

Вы имеете дело с обычным головным уборщиком ES. Elasticsearch не индексирует нулевые значения (не только цифры c нули). Вы должны указать в своем отображении индекса, как вы хотите, чтобы любые обнаруженные нулевые значения были проиндексированы. Примерно так:

  "mappings": {
    "properties": {
      "nullable_numeric": {
        "type":       "integer",
        "null_value": -1 
      },
      "nullable_text": {
       "type":        "text",
       "null_value":  "NULL"
    }
  }

Как только вы это сделаете, ES будет знать, как правильно индексировать эти поля. Обратите внимание, что вам не нужно изменять необработанные данные, просто сообщите ES, как индексировать пустые значения для поиска .... что, кстати, не повлияет на документы при запросе ES.

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