如何在没有id的情况下将数据插入Elasticsearch

时间:2014-07-15 10:53:59

标签: elasticsearch

我将数据插入ID为123的Elasticsearch

localhost:9200/index/type/123

但我不知道下一个id会插入什么

如何在localhost中将数据插入到没有id的Elasticsearch:9200 / index / type?

6 个答案:

答案 0 :(得分:9)

可以在不指定id的情况下执行索引操作。在这种情况下,将自动生成id。此外,op_type将自动设置为create。这是一个例子(注意使用POST而不是PUT):

$ curl -XPOST 'http://localhost:9200/twitter/tweet/' -d '{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}'

答案 1 :(得分:4)

就我而言,使用nodejs和elasticsearch包我是这样使用客户端:

  

client.index()

var elasticsearch = require ('elasticsearch');
let client = new elasticsearch.Client ({
    host: '127.0.0.1: 9200'
});

client.index ({
    index: 'myindex'
    type: 'mytype',
    body: {
        properti1: 'val 1',
        properti2: ['y', 'z'],
        properti3: true,
    }
}, function (error, response) {
    if (error) {
        console.log("error: ", error);
    } else {
        console.log("response: ", response);
    }
});

如果未指定 id ,elasticsearch将自动生成一个

答案 2 :(得分:1)

您可以使用POST请求创建新文档或数据对象,而无需在路径中指定id属性。

curl -XPOST 'http://localhost:9200/stackoverflow/question' -d '
{
  title: "How to insert data to elasticsearch without id in the path?"
}

答案 3 :(得分:0)

如果我们的数据没有自然ID,我们可以让Elasticsearch为我们自动生成一个ID。请求的结构发生了变化:我们不使用PUT动词(“将文档存储在此URL”),而是使用POST谓词(“将文档存储在此URL”)。 现在,URL仅包含_index_type

curl -X POST "localhost:9200/website/blog/" -H 'Content-Type: application/json' -d'
{
  "title": "My second blog entry",
  "text":  "Still trying this out...",
  "date":  "2014/01/01"
}
'

除了已为我们生成_id字段外,响应与我们之前看到的类似:

{
   "_index":    "website",
   "_type":     "blog",
   "_id":       "AVFgSgVHUP18jI2wRx0w",
   "_version":  1,
   "created":   true
}

自动生成的ID为20个字符,URL安全,Base64编码的GUID字符串。这些GUID是从改良的FlakeID方案生成的,该方案允许多个节点并行生成唯一的ID,而发生碰撞的几率基本上为零。

https://www.elastic.co/guide/en/elasticsearch/guide/current/index-doc.html

答案 4 :(得分:0)

就我而言,我试图将文档直接添加到索引中,例如localhost:9200/messages,而不是localhost:9200/someIndex/messages

我必须将/_doc附加到URL上才能使POST成功:localhost:9200/messages/_doc。否则,我将获得HTTP 405:

{"error":"Incorrect HTTP method for uri [/messages] and method [POST], allowed: [GET, PUT, HEAD, DELETE]","status":405}

这是我的完整cURL请求:

$ curl -X POST "localhost:9200/messages/_doc" -H 'Content-Type:
application/json' -d'
{
  "user": "Jimmy Doe",
  "text": "Actually, my only brother!",
  "timestamp": "something"
}
'

{"_index":"messages","_type":"_doc","_id":"AIRF8GYBjAnm5hquWm61","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":2,"_primary_term":3}

答案 5 :(得分:-1)

可以将ID字段留空,而elasticsearch会将其分配为一个。例如,_bulk插入看起来像

{"create":{"_index":"products","_type":"product"}}\n
{JSON document 1}\n
{"create":{"_index":"products","_type":"product"}}\n
{JSON document 2}\n
{"create":{"_index":"products","_type":"product"}}\n
{JSON document 3}\n
...and so on

ID看起来像'AUvGyJMOOA8IPUB04vbF'