发送数据时出现ElasticSearch错误

时间:2016-02-04 23:11:16

标签: json elasticsearch

我正在尝试向elasticSearch发送JSON。我尝试过使用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的新手,所以不确定出了什么问题。

7 个答案:

答案 0 :(得分:7)

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

例如:

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

可能有效,因为它包含在一个对象中。

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

{1, 2, 3, 4, 5}

答案 1 :(得分:6)

谢谢@ hellol11

当我改为

时它起作用了
    {root :
[
    {"column1": "abc", "column2": "def", "column3": "dghi", "column4": "jkl", "column5": "mno"},
    {"column1": "pqr", "column2": "stu", "column3": "vwx", "column4": "", "column5": ""}

]}

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

我在Python脚本(使用请求)中遇到此问题,尝试并发布到ES。解决方法只是使用json.dumps()

将json对象转换为字符串。

示例(Python snipit):

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)

答案 4 :(得分:1)

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

-d plus double quotation(") 

和带有反斜杠加上双引号(\“)

的环绕名称

命令&GT;

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

答案 5 :(得分:0)

在弹性搜索中,如果要发布批量数据,则每个列表对象必须在新行中。如果您使用sense,则在New行中创建所有内容,或者如果在代码中使用,则添加新行字符\ n ..

答案 6 :(得分:0)

在尝试发布到Elasticsearch但使用Node 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)