如何处理 Elasticsearch 索引中的空值

arc*_*123 5 null elasticsearch elasticsearch-query

我有一个 SQL 表,正在导出到 Elasticsearch。

其中一列是可为空的数字字段,某些记录中存在空值。

当我们尝试为表建立索引时,会出现以下错误:

表的 ETL(BigQuery -> ElasticSearch)作业之一:MLS 已对索引 20000 中的 10000 个块进行 ES 失败,可能是由于对象不兼容。

Failing BigQuery Table: MLS

Stack Trace of the error:

Traceback (most recent call last): File "/Users/asif/zodiacbackend/zodiacbackend/tasks.py", line 205, in
Run Code Online (Sandbox Code Playgroud)

insertIntoES helpers.bulk(es, doc_generator(dataframe,table)) 文件“/Users/asif/zodiacbackend/env/lib/python3.7/site-packages/elasticsearch/helpers/actions.py”,第 300 行,批量好的,streaming_bulk(客户端,操作,*args,**kwargs)中的项目:文件“/Users/asif/zodiacbackend/env/lib/python3.7/site-packages/elasticsearch/helpers/actions.py”,第230行,在streaming_bulk **kwargs文件“/Users/asif/zodiacbackend/env/lib/python3.7/site-packages/elasticsearch/helpers/actions.py”中,第158行,在_process_bulk_chunk中引发BulkIndexError(“%i文档(s) ) 索引失败。" % len(errors), 错误) elasticsearch.helpers.errors.BulkIndexError: ('2 个文档索引失败。', [{'index': {'_index': 'mls', '_type':'mls','_id':'b100qHABEFI45Lp-z3Om','状态':400,'错误':{'type':'illegal_argument_exception','reason':'不同类型的映射器[Lot_Size_Sq_Ft], current_type [text], merged_type [long]'}, 'data': { 'Lot_Size_Sq_Ft': Decimal('13504')}}}])

如何让系统识别空值?

Ami*_*wal 11

用户 WittyID 错过了一些重要的事情,例如:

\n\n
    \n
  1. 的值null_value必须与您的字段具有相同的数据类型,因此在他的示例中,他声明了integer字段但定义NULLnull_values, 会抛出异常,这在官方链接json_parse_exception中提到important如下所示:
  2. \n
\n\n
\n

null_value 需要与字段具有相同的数据类型。例如,长字段不能有字符串 null_value。

\n
\n\n
    \n
  1. 唯一null_value影响数据的索引方式,它不会修改 _source 文档,因此在源文档中,您传递的任何内容都将被存储,而不是参数中提到的,null_values并且在查询时您还需要使用值null_value参数。
  2. \n
\n\n

简而言之,nullES 无法识别,因此您可以定义自定义值,null然后使用它来索引和查询null值。使用下面的示例很容易解释整个事情,任何人都可以尝试:

\n\n

创建索引

\n\n
{\n  "mappings": {\n    "properties": {\n      "my_signed_integer": {\n        "type":"integer",\n        "null_value": -1 --> note we defining `null` values as `-1`.\n      }\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

索引文档

\n\n
    \n
  1. 存储null整数文档

    \n\n

    {\n "my_number" : null\n }

  2. \n
\n\n

如果您从 ES 获取此文档,它将返回如下:

\n\n
{\n   "_index": "so-6053847",\n   "_type": "_doc",\n   "_id": "1",\n   "_version": 1,\n   "_seq_no": 0,\n   "_primary_term": 1,\n   "found": true,\n   "_source": {\n      "my_number": null. --> As explained earlier, in source its stored as `null`.\n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. 指数非负值

    \n\n

    {\n“我的号码”:10\n}

  2. \n
\n\n

搜索查询以获取具有null值的整数

\n\n
{\n  "query": {\n    "term": {\n      "my_signed_integer": -1 -->notice same `null_value`, you need to mention\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
 "hits": [\n         {\n            "_index": "so-6053847",\n            "_type": "_doc",\n            "_id": "1",\n            "_score": 1.0,\n            "_source": {\n               "my_signed_integer": null --> notice it shows `null`, not `-1`\n            }\n         }\n      ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

搜索查询其他数字(不为空),即在我们的例子中10

\n\n
{\n  "query": {\n    "term": {\n      "my_signed_integer": 10\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果

\n\n
"hits": [\n         {\n            "_index": "so-6053847",\n            "_type": "_doc",\n            "_id": "2",\n            "_score": 1.0,\n            "_source": {\n               "my_signed_integer": 10 -->source matches the indexed value for this doc\n            }\n         }\n      ]\n
Run Code Online (Sandbox Code Playgroud)\n