【问题标题】:ElasticSearch error while sending data发送数据时出现 ElasticSearch 错误
【发布时间】:2016-05-14 19:11:55
【问题描述】:

我正在尝试将 JSON 发送到 elasticSearch。我尝试过使用 Postman 和 SOAPUI 数据是

[{"column1": "abc", "column2": "def", "column3": "dghi", "column4": "jkl", "column5": "mno"}, {"column1": "pqr", "column2": "stu", "column3": "vwx", "column4": "", "column5": ""}]

我收到以下错误

{
  "error": {
    "root_cause": [
      {
        "type": "mapper_parsing_exception",
        "reason": "failed to parse"
      }
    ],
    "type": "mapper_parsing_exception",
    "reason": "failed to parse",
    "caused_by": {
      "type": "not_x_content_exception",
      "reason": "Compressor detection can only be called on some xcontent bytes or compressed xcontent bytes"
    }
  },
  "status": 400
}

但是当我发布一个 JSON 数组时,即

{"column1": "abc", "column2": "def", "column3": "dghi", "column4": "jkl", "column5": "mno"}

然后它工作正常。我是 ElasticSearch 的新手,所以不确定出了什么问题。

【问题讨论】:

    标签: json elasticsearch


    【解决方案1】:

    先尝试使用大括号,然后为数组命名。试试看它是否有效。

    例如:

    {root:[1, 2, 3, 4, 5]}
    

    可能会起作用,因为它包含在一个对象中。

    更好;当我尝试使用JSON.stringify(); 时,我发现它会将数组转换为 JSON,如下所示:

    {1, 2, 3, 4, 5}
    

    【讨论】:

    • -1,虽然这会导致正确答案,但这并不是真正的解释性,否定的语气确实没有帮助。原始问题确实有有效的 JSON,它是一个单元素数组。这个问题回答的问题是 ElasticSearch 要求最外层的文档是 JSON 对象,而不是 JSON 数组或标量值。示例重构也很好,在这种情况下不会花费太长时间。
    【解决方案2】:

    我最近使用 curl 遇到了这个问题,这是一个简单的错字。我没有使用内联 json,而是使用文件。我忘了在文件名前加上@符号。

    curl -XPUT -H'Content-Type:application/json' localhost:9200/twitter -d@mappings.json
    

    【讨论】:

      【解决方案3】:

      感谢@hellol11

      当我更改为时它起作用了

          {root :
      [
          {"column1": "abc", "column2": "def", "column3": "dghi", "column4": "jkl", "column5": "mno"},
          {"column1": "pqr", "column2": "stu", "column3": "vwx", "column4": "", "column5": ""}
      
      ]}
      

      【讨论】:

      • 你不需要在 root 周围加上引号吗?
      【解决方案4】:

      我在尝试 POST 到 ES 的 Python 脚本(使用请求)中遇到了这个问题。解决方法只是使用json.dumps()将json对象转换为字符串

      示例(Python 代码段):

      import json
      import requests
      
      headers={'Content-Type': 'application/json'}
      data={'hello':'barney'} 
      
      response = requests.post('https://<my_es_domain>/<my_es_ix>/<my_doc_type>', data=json.dumps(data), headers=headers)
      

      【讨论】:

        【解决方案5】:

        在Windows环境下,我解决了这个问题。

        -d plus double quotation(") 
        

        并用反斜杠加上双引号(\")将名称括起来

        命令>

        curl (more-option) -d "{\"column1\": \"abc\", \"column2\": \"def\", \"column3\": \"dghi\", \"column4\": \"jkl\", \"column5\": \"mno\"}"
        

        【讨论】:

          【解决方案6】:

          我在尝试发布到 elasticsearch 但使用节点 js 时遇到了同样的错误。我使用 node-fetch 包向 elasticsearch 发出 PUT 请求。这很奇怪,因为在邮递员上使用完全相同的东西我没有收到错误,但我在节点 js 上收到了错误。我最初是在做:

          const current = {
              "id" : "123456789"
          }
          const options = {
              method: "POST",
              headers: {
                  "Content-Type": "application/json"
              },
              body: current
          }
          

          事实证明,当我将其更改为时,错误得到了修复:

          body: JSON.stringify(current)
          

          【讨论】:

            【解决方案7】:

            在弹性搜索中,如果您想发布批量数据,那么每个列表对象都必须在新行中。所以如果您使用 sense 则将所有内容都放在新行中,或者如果从代码中使用则添加换行符 \n.. .

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-24
              • 2021-03-02
              • 2020-11-22
              • 2020-08-31
              • 2014-03-03
              • 1970-01-01
              相关资源
              最近更新 更多