Elasticsearch частичное массовое обновление

У меня есть 6kk данных для обновления вasticsearch. И я должен использовать PHP.
Я ищу в документации, и я нашел это, Массовая индексация но это не сохраняет предыдущие данные.

Я имею:

[
{
'name': 'Jonatahn',
'age' : 21
}
]

Мой код для обновления:

$params =[
"index" => "customer",
"type" => "doc",
"body" => [
[
"index" => [
"_index" => "customer",
"_type" => "doc",
"_id" => "09310451939"]
],
[
"name" => "Jonathan"]
]
];

$client->bulk($params);

Когда я отправляю ['name' => 'Jonathan'] Я ожидаю, что имя будет обновлено и сохранит возраст, но возраст был удален.
Конечно, я все еще могу обновлять данные по данным, но это займет много времени, есть ли другой способ сделать это?

10

Решение

Моя ошибка заключалась в использовании "index", но правильный способ сделать то, что я хочу, был "update",

Окончательный код:

$params =[
"index" => "customer",
"type" => "doc",
"body" => [
[
"update" => [
//   ^^^^^^ Here I change from index to update
"_index" => "customer",
"_type" => "doc",
"_id" => "09310451939"]
],
[
"doc" => [
"name" => "Jonathan"]
]
]
];

$client->bulk($params);

Используя приведенный выше код, мои данные сохраняют предыдущие данные и просто обновляют данные, передаваемые в параметрах.

Отклик:

Array
(
[took] => 7
[timed_out] =>
[_shards] => Array
(
[total] => 5
[successful] => 5
[skipped] => 0
[failed] => 0
)

[hits] => Array
(
[total] => 1
[max_score] => 1
[hits] => Array
(
[0] => Array
(
[_index] => customer
[_type] => doc
[_id] => 09310451939
[_score] => 1
[_source] => Array
(
[name] => Jonathan
[age] => 23
)

)

)

)

)
5

Другие решения

Вот мой окончательный код.

<?php

require_once('../elasticsearch.php');

//initialize elasticsearch
$params = array();

$params['index'] = $elastcsearch_index;
$params['type']  = $elastcsearch_type;

///////////////////////////////////////////////////
//update seeders n leechers in elasticsearch

//get updated records
$get_updated_records = mysqli_query($conn, "SELECT content_id, seeders, leechers FROM content WHERE is_updated = '1' order by seeders DESC") ;

//create blank array
$results = array();

while($row = mysqli_fetch_assoc($get_updated_records)){
//put all results in array
$results[] = $row;

}

//from https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/_indexing_documents.html

$params = ['body' => []];

for($i = 0; $i < count($results); $i++) {

$params["body"][]= [
"update" => [
"_index" => $elastcsearch_index,
"_type" => $elastcsearch_type,
"_id" => $results[$i]['content_id']
]
];

$params["body"][]= [
"doc" => [
"seeders" => intval($results[$i]['seeders']) ,
"leechers" => intval($results[$i]['leechers']) ,
]
];

// Every 1000 documents stop and send the bulk request
if ($i % 1000 == 0) {
$responses = $elasticsearch->bulk($params);

// erase the old bulk request
$params = ['body' => []];

// unset the bulk response when you are done to save memory
unset($responses);
}
}

// Send the last batch if it exists
if (!empty($params['body'])) {
$responses = $elasticsearch->bulk($params);
}
2

Согласно документы, Массовое API возможные действия: индексировать, создавать, удалять и update, update ожидает, что часть doc, upsert и script и их параметры указаны в следующей строке.

POST _bulk
{ "update" : {"_id" : "1", "_type" : "_doc", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
1
По вопросам рекламы [email protected]