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