Эластичный поиск дает сбой при больших объемах данных

Итак, у меня есть запрос, который дает мне в результате 500 сотен тысяч данных, а затем я зацикливаюсь на нем, чтобы добавить 20 документов для каждого результата. Эластичный поиск перестает отвечать (страница загружается вечно), а затем выдает ошибку Couldn't connect to host, Elasticsearch down?. Таким образом, при переборе всех данных происходит сбой.

Что может быть причиной того, что Elastic search не отвечает? Разве я не могу использовать его, чтобы просмотреть миллионы информации? Это проблема конфигурации Elasticserch?

Вот код, который я использую для цикла:

$query = tep_db_query(" 
// Query giving 500k results
");

$achatsDocs = array();

while($array_collections = tep_db_fetch_array($query)){
    //looping the query


    $achatsDocs[] = new \Elastica\Document('', \Glam\HttpUtils::jsonEncode(
        array(
            // documents
        )
    ));
}

$achatsReportType->addDocuments($achatsDocs);
$achatsReportType->getIndex()->refresh();

Мне сказали отправить разумное количество документов, т.е. 1000 за массовый запрос, а не все сразу. Итак, я сделал это:

// while we didn't loop through every data
while(condition) {

    $query = tep_db_query("
        // get first/next 1000
    ");

    // put data inside first 1000
    while($array_collections = tep_db_fetch_array($query))

        $achatsDocs[] = new \Elastica\Document('', \Glam\HttpUtils::jsonEncode(
            array(
                // 20 documents
            )
        ));
    }

    $achatsReportType->addDocuments($achatsDocs);
    $achatsReportType->getIndex()->refresh();

    // go over next 1000
    $limit_start = $limit_start + 1000;
    $limit_end = $limit_end + 1000;


}

Но он все еще падает даже после этого. Это приводит к добавлению 70 000 результатов перед сбоем с этой ошибкой:

Fatal error: Uncaught exception 'Elastica\Exception\Connection\HttpException' with message 'Unknown error:52' in /var/www/vendor/ruflin/elastica/lib/Elastica/Transport/Http.php:167 Stack trace: #0 /var/www/vendor/ruflin/elastica/lib/Elastica/Request.php(171): Elastica\Transport\Http->exec(Object(Elastica\Request), Array) #1 /var/www/vendor/ruflin/elastica/lib/Elastica/Client.php(621): Elastica\Request->send() #2 /var/www/vendor/ruflin/elastica/lib/Elastica/Bulk.php(360): Elastica\Client->request('_bulk', 'PUT', '{"index":{"_ind...', Array) #3 /var/www/vendor/ruflin/elastica/lib/Elastica/Client.php(314): Elastica\Bulk->send() #4 /var/www/vendor/ruflin/elastica/lib/Elastica/Index.php(150): Elastica\Client->addDocuments(Array) #5 /var/www/vendor/ruflin/elastica/lib/Elastica/Type.php(196): Elastica\Index->addDocuments(Array) #6 /var/www/htdocs/adm54140/achatsReport_map.php(280): Elastica\Type->addDocuments(Array) #7 {main} thrown in /var/www/vendor/ruflin/elastica/lib/Elastica/Transport/Http.php on line 167 array(4) { ["code"]=> string(7) "E_ERROR" ["message"]=> string(928) "Uncaught exception 'Elastica\Exception\Connection\HttpException' with message 'Unknown error:52' in /var/www/vendor/ruflin/elastica/lib/Elastica/Transport/Http.php:167 Stack trace: #0 /var/www/vendor/ruflin/elastica/lib/Elastica/Request.php(171): Elastica\Transport\Http->exec(Object(Elastica\Request), Array) #1 /var/www/vendor/ruflin/elastica/lib/Elastica/Client.php(621): Elastica\Request->send() #2 /var/www/vendor/ruflin/elastica/lib/Elastica/Bulk.php(360): Elastica\Client->request('_bulk', 'PUT', '{"index":{"_ind...', Array) #3 /var/www/vendor/ruflin/elastica/lib/Elastica/Client.php(314): Elastica\Bulk->send() #4 /var/www/vendor/ruflin/elastica/lib/Elastica/Index.php(150): Elastica\Client->addDocuments(Array) #5 /var/www/vendor/ruflin/elastica/lib/Elastica/Type.php(196): Elastica\Index->addDocuments(Array) #6 /var/www/htdocs/adm54140/achatsReport_map.php(280): Elastica\Type->addDocuments(Array) #7 {main} thrown" ["file"]=> string(63) "/var/www/vendor/ruflin/elastica/lib/Elastica/Transport/Http.php" ["line"]=> int(167) }

И тогда эластичный поиск падает.


person Community    schedule 13.04.2018    source источник
comment
И что говорят журналы Elasticsearch (не приложения)? Они должны дать вам больше информации.   -  person Frank    schedule 14.04.2018


Ответы (2)


Разбивка на страницы в реальном времени для «больших» — конечно, субъективно, но я бы сказал, что 500 000+ результатов «достаточно велики» — наборы результатов, как известно, сложны для распределенных данных, в том числе и в Elasticsearch. Однако есть решение: используйте Scroll API. для просмотра результатов. Я думаю, он лучше подходит для ваших нужд.

Если вы хотите узнать, почему именно ваш кластер рухнул, загляните в логи.

person Frank    schedule 13.04.2018
comment
Спасибо за ответ, может пригодиться при поиске. Моя проблема в том, что я не могу массово индексировать эти документы, в этот момент происходит сбой. - person ; 13.04.2018
comment
Предполагая, что вы не используете Scroll API, Elasticsearch пытается втиснуть весь набор результатов в память. Массовая индексация также сохраняет запрос в памяти, так что виновником вполне может быть эта комбинация. Если вы используете API прокрутки, вы экономите значительный объем памяти на стороне поиска, оставляя больше для массового индексирования. - person Frank; 13.04.2018
comment
Индексация, которую я выполняю, не находится на той же странице, что и поиск, поэтому они не используют память одновременно... Мне сказали отправить разумное количество документов, например. 1000 за массовый запрос, а не все сразу. Как просто отправить 1k запросов каждый? Когда я зацикливаюсь на своем запросе, как я могу зациклить его 1k результатов, а затем снова зациклиться на его следующих 1k результатах? Ясен ли мой вопрос? Я обновлю свой вопрос, чтобы дать код, чтобы показать вам. - person ; 13.04.2018
comment
Извините, я неправильно понял. Я думал, что вы также получили результаты от Elasticsearch, поэтому я предложил использовать Scroll API ???? Плохо. Мое единственное предложение - заглянуть в журналы, чтобы узнать, что пошло не так. - person Frank; 13.04.2018
comment
Спасибо за попытку помочь, тем не менее Scroll API будет полезен, когда я решу свою проблему :) - person ; 13.04.2018
comment
Это зависит от совокупного размера документов. Вот несколько рекомендаций по эластичности elastic.co/guide/en/elasticsearch/guide/current/ - person sramalingam24; 13.04.2018
comment
попробуйте увеличить размер кучи для эластичного поиска, перезапустите кластер. - person Sachin; 15.04.2018

У меня также были проблемы с импортом наборов данных размером более 400 тыс. документов. В итоге я использовал BULK API, сегментируя данные на группы по 1000 документов (как вам советовали ранее).

API Elasticsearch Bulk

Возможно есть проблемы с клиентом Elastica, я бы советовал сохранять чанки по 1000 в json файл следующего формата:

{ "index" : { "_index" : "my_index", "_type" : "mappingType", "_id" :  "1234"} }
{ "name" : "John", "age" : 12, "_id" :  "1234"}
{ "index" : { "_index" : "my_index", "_type" : "mappingType", "_id" :  "1235"} }
{ "name" : "Maria", "age" : 17, "_id" :  "1235"}

Затем создайте сценарий .sh, содержащий одну из следующих строк для каждого документа json:

curl -u user:"pass" -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/_bulk --data-binary "@es_request1.json"
curl -u user:"pass" -s -H "Content-Type: application/x-ndjson" -XPOST localhost:9200/_bulk --data-binary "@es_request2.json"
person Felipe Plazas    schedule 13.04.2018
comment
{ index : { } } в случае, если ваш индекс одинаков для всех документов, идентификаторы будут генерироваться автоматически. - person Sachin; 15.04.2018