Elasticsearch PHP объемный индекс производительности против индекса

Я запускаю бенчмарк наasticsearch, используя erasearch-php.
Я сравниваю время, затрачиваемое 10 000 индексами один на один с 10 000, с массой 1 000 документов.

На моем vpn-сервере 3 ядра 2 Гб памяти производительность практически одинакова с или без массового индекса.

Мой php код (вдохновленный постом):

<?php
set_time_limit(0);  //  no timeout
require 'vendor/autoload.php';
$es = new Elasticsearch\Client([
'hosts'=>['127.0.0.1:9200']
]);
$max = 10000;

// ELASTICSEARCH BULK INDEX
$temps_debut = microtime(true);
for ($i = 0; $i <=  $max; $i++) {
$params['body'][] = array(
'index' => array(
'_index' => 'articles',
'_type' => 'article',
'_id' => 'cle' . $i
)
);
$params['body'][] = array(
'my_field' => 'my_value' . $i
);
if ($i % 1000) {   // Every 1000 documents stop and send the bulk request
$responses = $es->bulk($params);
$params = array();  // erase the old bulk request
unset($responses); // unset  to save memory
}
}
$temps_fin = microtime(true);
echo 'Elasticsearch bulk: ' . round($i / round($temps_fin - $temps_debut, 4)) . ' per sec <br>';

// ELASTICSEARCH WITHOUT BULK INDEX
$temps_debut = microtime(true);
for ($i = 1; $i <= $max; $i++) {
$params = array();
$params['index'] = 'my_index';
$params['type']  = 'my_type';
$params['id']    = "key".$i;
$params['body']  = array('testField' => 'valeur'.$i);
$ret = $es->index($params);
}
$temps_fin = microtime(true);
echo 'Elasticsearch One by one : ' . round($i / round($temps_fin - $temps_debut, 4)) . 'per sec <br>';
?>

Объем эластичного поиска: 1209 в секунду
Elasticsearch один за другим: 1197 в секунду

Что-то не так в моем массовом индексе для достижения лучшей производительности?

Спасибо

2

Решение

Заменить:

if ($i % 1000) {   // Every 1000 documents stop and send the bulk request

с:

if (($i + 1) % 1000 === 0) {   // Every 1000 documents stop and send the bulk request

или вы будете запрашивать каждое значение, отличное от 0 (то есть 999 из 1000) …
Очевидно, это работает только если $max кратный 1000

Также исправьте эту ошибку:

for ($i = 0; $i <=  $max; $i++) {

будет перебирать $max + 1 Предметы. замените его на:

for ($i = 0; $i < $max; $i++) {

Также может быть проблема с тем, как вы инициализируете $params, Разве вы не должны устанавливать его вне петли и только очистить $params['body'] после каждого ->bulk()? Когда вы сбрасываете с $params = array(); Вы теряете все это.

Также помните, что ES может распространяться по кластеру. Массовые операции могут быть распределены даже по рабочей нагрузке. Таким образом, некоторое масштабирование производительности не видно на одном физическом узле.

3

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

Других решений пока нет …