Lenteur lors de la récupération des données depuis Elasticsearch à partir de php


(Nada Salhi) #1

Nous avons des lenteurs au niveau de notre système qui communique avec elasticsearch,nous avons comme client le PHP ,on nous a proposé un Mapping où on devaient mettre les champs sur lesquels nous effectuons la recherche comme Not Analyzed ,c'est en effet ce que nous avons fait ,mais cela ne résolue pas le problème ,parce que ce qu'on nous a proposé comme solution est utile dans le cas où nous effectuons toutes les recherches possible ,comme ça ils seront stockés dans le cache et bien évidemment la recherche sera plus fluide ,chose qui n'est pas possible dans notre cas .
Voici le mapping qu'on a effectué :
PUT proveille
{
"mappings": {
"tweecoms": {
"properties" : {
"association_key":{ "type" : "long" },
"id_tweecom":{ "type" : "string"},
"text" : { "type" : "string", "index" : "not_analyzed" },
"photo":{"type" : "string"},
"lien":{"type" : "string"},
"date":{"type" : "string"},
"source":{"type" : "string"},
"nb_retweets":{"type": "string"},
"nb_favorite":{"type": "string"},
"nb_followers":{"type": "string"},
"hashtag": { "type" : "string", "index" : "not_analyzed" },
"origine":{"type": "string"},
"acceleration":{"type": "string"},
"influence":{"type": "string"},
"sentiment":{"type": "string"},
"screen_name":{"type": "string", "index" : "not_analyzed"},
"name":{"type": "string", "index" : "not_analyzed"},
"photo_user":{"type": "string"},
"sexe":{"type": "string"},
"location":{"type": "string", "index" : "not_analyzed"},
"timezone":{"type": "string"},
"nb_followings":{"type": "string"},
"nb_posts":{"type": "string"},
"nb_followers_user":{"type": "string"},
"origine_user":{"type": "string"},
"id_user_tweecoms":{"type": "string"},
"protected":{"type": "string"},
"message":{"type": "string", "index" : "not_analyzed"},
"lien_post":{"type": "string"},
"nom_page":{"type": "string"},
"age":{"type": "string","index" : "not_analyzed"}
}
}
}
}

les requêtes que nous effectuons ,sont des requêtes simple ;par exemple :
select * from tweecoms where text like '%the words to find %'
Mais le nombre de données qu'on a est important
je tiens à vous signaler que si nous effectuons la recherche sur le moteur de recherche d'Elasticsearch directement ,cela ne prend que quelques secondes mais c'est quand nous envoyons la requête depuis le client PHP que c'est lent .
Voici le code PHP qui envoi la requête :
public function rechercheville($ville) {
echo 'date debut elasticsearch ' . date('d-m-Y H:i:s') . '
';
$search_host = 'x.x.x.x';
$search_port = 'y';
$index = 'myindex3';
$doc_type = 'tweecoms3';
$query = '_search';
ini_set('memory_limit', '5500000M');
set_time_limit(10000);
$total=0;
$from=0;
$dd = array();
$i=0;
do
{
$json_doc = '{
"query":{
"match":{"location":"'.$ville.'"}
},
"size": 20000,
"from": '.$from.',
"fields": [
"association_key","id_tweecom","text","photo","lien","date","source","nb_retweets","nb_favorite","nb_followers","hashtag","origine","acceleration","influence","sentiment","screen_name","name","photo_user","sexe","location","timezone", "nb_followings","nb_posts","nb_followers_user","origine_user", "id_user_tweecoms","protected", "lien_post","nom_page"
]
}';
$from=$from+20000;
//$json_doc = json_encode($json_doc);
$baseUri = 'http://' . $search_host . ':' . $search_port . '/' . $index . '/' . $doc_type . '/' . $query;
$ci = curl_init();
curl_setopt($ci, CURLOPT_URL, $baseUri);
curl_setopt($ci, CURLOPT_PORT, $search_port);
curl_setopt($ci, CURLOPT_TIMEOUT, 200000000);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ci, CURLOPT_FORBID_REUSE, 0);
curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ci, CURLOPT_POSTFIELDS, $json_doc);
$response = curl_exec($ci);
curl_close($ci);
$infos = json_decode($response, true);
$total=$infos['hits']['total'];
echo "$from<$total
";
d'autre part,nous avons essayé de diviser les données en 3 cluster et aussi ça ne change absolument rien .
Est ce que vous pouvez nous proposer d'autres solutions

On n'a essayé tous les moyens possibles mais sans résultat et nous sommes vraiment bloqué merci de nous aider


(Colin Goodheart-Smithe) #2

You may get more help if you post topics which are in French in the French sub-catgory of the 'Elastic in you Native Tongue' Category: https://discuss.elastic.co/c/in-your-native-tongue/discussions-en-francais

If you wish I can move this topic to that category?


(Nada Salhi) #3

yes please if it's possible,and thank youuuu


(David Pilato) #4

Essaye de passer size à 10 pour voir.


(Nada Salhi) #5

ça ne m'intéresse pas de réduire la taille ,parce que je ne suis pas entrain de faire des testes ,c'est un système qui gère un nombre énorme de données et ce qui m'intéresse ce qu'il n y est pas de lenteur même en chargeant toutes les données


(David Pilato) #6

Tant pis...

Le résultat du test m'aurait permis de t'aider et de d'orienter sur une piste ou une autre.


(Nada Salhi) #7

yes please post it please in the section french ,and thank you so much

Le 13 janvier 2016 à 15:45, Colin Goodheart-Smithe <
noreply@discuss.elastic.co> a écrit :


(Nada Salhi) #8

D'accord ,dis moi qu'est ce que tu veux savoir par apport à la récupération de 10 enregistrements ,si tu veux savoir si c'est lent ,c'est pas lent lorsqu'il s'agit de peu d'enregistrements ;c'est même rapide ,et si t'as besoin d'autres informations par apport au test des 10 enregistrements ,dis moi quelles sont les informations qu'il te faut pour que tu puisses m'aider
Mercii


(David Pilato) #9

Si tu as besoin d'extraire beaucoup de documents, il faut utiliser scan and scroll API.

Pas sûr que ce soit plus rapide cependant mais en tout cas c'est plus efficace (usage RAM notamment).


(Nada Salhi) #10

j'ai utilisé scan and scroll
voici le script :
$search_host = '94.23.20.200';
$search_port = '9200';
$index = 'proveille';
$doc_type = 'tweecoms';
$query = '_search?search_type=scan&scroll=1m';
ini_set('memory_limit', '5500000M');
set_time_limit(1000000);
$dd = array();
$i = 0;
$total=0;
$from=0;
do
{
$json_doc = '{
"query": {
"query_string": {
"query": "' . $sujet . '",
"lenient": true
}
},
"size":10000 ,
"from": '.$from.',
"fields": [
"association_key","id_tweecom","text","photo","lien","date","source","nb_retweets","nb_favorite","nb_followers","hashtag","origine","acceleration","influence","sentiment","screen_name","name","photo_user","sexe","location","timezone", "nb_followings","nb_posts","nb_followers_user","origine_user", "id_user_tweecoms","protected", "lien_post","nom_page","age"
]
}';
$from=$from+10000;
//$json_doc = json_encode($json_doc);
$baseUri = 'http://' . $search_host . ':' . $search_port . '/' . $index . '/' . $doc_type . '/' . $query;
$ci = curl_init();
curl_setopt($ci, CURLOPT_URL, $baseUri);
curl_setopt($ci, CURLOPT_PORT, $search_port);
curl_setopt($ci, CURLOPT_TIMEOUT, 200000000);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ci, CURLOPT_FORBID_REUSE, 0);
curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ci, CURLOPT_POSTFIELDS, $json_doc);
$response = curl_exec($ci);
curl_close($ci);
$infos = json_decode($response, true);
ça me rend un scroll id ,j'essaie de récupérer ce qu'il y a dans le scroll id avec ça :
GET /_search/scroll
{
"scroll" : "1m",
"scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1"
}
et ça ne me retourne pas les enregistrements
voici l'erreur que j'ai :
GET 'localhost:9200/_search/scroll' -d'
{
"scroll" : "1m",
"scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1"
}
'
et voici le résultat retourné par la requête scan and scroll:
array(
'_scroll_id' => 'c2Nhbjs1OzE0MjU6eXRfQ2MyR3VTT1NGbVpBM21WTmkyZzsxNDI2Onl0X0NjMkd1U09TRm1aQTNtVk5pMmc7NTE6Njl1ZXU5dU5STE8ycjlMS0Zfckl1UTs1Mjo2OXVldTl1TlJMTzJyOUxLRl9ySXVROzE0MjQ6eXRfQ2MyR3VTT1NGbVpBM21WTmkyZzsxO3RvdGFsX2hpdHM6NTQwMzs=',
'took' => (int) 8810,
'timed_out' => false,
'_shards' => array(
'total' => (int) 5,
'successful' => (int) 5,
'failed' => (int) 0
),
'hits' => array(
'total' => (int) 5403,
'max_score' => (float) 0,
'hits' => array()
)
)


(system) #11