16.ES 之 nested 操作案例(2019-05-24)

it2022-05-08  8

1.设置mapping信息: PUT /accounts?error_trace=true {   "mappings": {     "properties": {       "patient": {         "type": "nested",         "properties": {           "type": {             "type": "keyword"           },           "account_number": {             "type": "long"           },           "balance": {             "type": "double"           },           "firstname": {             "type": "text",             "fields": {               "keyword": {                 "type": "keyword"               }             }           },           "lastname": {             "type": "text",             "fields": {               "keyword": {                 "type": "keyword"               }             }           },           "age": {             "type": "long"           },           "gender": {             "type": "keyword"           },           "address": {             "type": "text",             "fields": {               "keyword": {                 "type": "keyword"               }             }           },           "email": {             "type": "text",             "fields": {               "keyword": {                 "type": "keyword"               }             }           },           "city": {             "type": "text",             "fields": {               "keyword": {                 "type": "keyword"               }             }           },           "country": {             "type": "keyword"           }         }       }     }   } }

 

2.批量灌数据:1).脚本(Laravel): public function handle(\Faker\Generator $faker)     {         echo "开始:";         $numb =0;         $i    = 0;         while($numb < 200) {             $numb++;             $startTime = microtime(true);             $wPath     = storage_path("app/account/accounts{$numb}.json");             $file      = fopen($wPath, "w");             $i = 10000 * ($numb-1);             $k = $numb * 10000;             echo "$i,$k \r\n";             while ($i < $k) //2000000             {                 $i++;                 $id = [                     "index" => [                         "_id" => $i                     ]                 ];                 fputs($file, json_encode($id));                 fputs($file, PHP_EOL);                 $rand    = rand(1, 5);                 $total   = [];                 $type    = [0 => 'inpatient', 1 => 'outpatient'];                 $gender  = [0 => 'M', 1 => 'F'];                 $country = [0 => 'France', 1 => 'England', 2 => 'Japan', 3 => 'America', 4 => 'Australia'];                 $one     = [                     "firstname" => $faker->firstName,                     "lastname"  => $faker->lastName,                     "address"   => $faker->address,                     "email"     => $faker->email,                     "city"      => $faker->city,                     "country"   => $country[array_rand($country, 1)]                 ];                 for ($j = 0; $j <= $rand; $j++) {                     $one["account_number"] = rand(1, 1000000);                     $one["balance"]        = rand(1, 50);                     $one["age"]            = rand(10, 88);                     $one["gender"]         = $gender[array_rand($gender, 1)];                     $one["type"]           = $type[array_rand($type, 1)];                     $total['patient'][]    = $one;                 }                 fputs($file, json_encode($total));                 fputs($file, PHP_EOL);             }             fclose($file);         }         $endTime = microtime(true);         echo $endTime - $startTime;     }

2).shell脚本灌数据(本地 linux 内存不够,数据量太大,会报内存溢出异常,所以使用分文件导入): #!/bin/sh i=1 while [ $i -le 200 ] do         curl -H "Content-Type: application/json" -XPOST "http://192.168.75.206:9200/accounts/patient/_bulk?pretty&refresh" --data-binary @/home/data/account/accounts$i.json         i=$(( $i+1 )) done

注:如果是单个文件直接使用: curl -H "Content-Type: application/json" -XPOST "http://192.168.75.206:9200/accounts/_bulk?pretty&refresh" --data-binary @/home/data/accounts.json

 

3.搜索:1).搜索全部: GET /accounts/_search?error_trace=true {  "size":10,   "query": {     "match_all": {     }   } }

2).bool 搜索: GET /accounts/_search?error_trace=true {   "size": 10,   "query": {     "bool": {       "must": [         {           "nested": {             "path": "patient",             "query": {               "bool": {                 "must": [                   {                     "match": {                       "patient.country": "Japan"                     }                   }                 ]               }             }           }         }       ]     }   } }

3).带聚合的搜索: GET /accounts/_search?error_trace=true {   "size": 10,   "query": {     "bool": {       "must": [         {           "nested": {             "path": "patient",             "query": {               "bool": {                 "must": [                   {                     "match": {                       "patient.country": "Japan"                     }                   }                 ]               }             }           }         }       ]     }   },   "aggs": {     "patient": {       "nested": {         "path": "patient"       },       "aggs": {         "group_by_type": {           "terms": {             "field": "patient.type"           }         }       }     }   } }

 

 


最新回复(0)