最近在使用php中的elasticsearch/elasticsearch庫的時候,遇到不少問題,用此博客記錄踩過的坑。php
在使用get或者search進行查詢獲取文檔的時候,若是沒有結果會拋出404的異常。json
咱們固然不但願拋出異常,這時候就要使用ignore這個參數來忽略報錯,ignore能夠忽略異常,其值是須要忽略的異常對應的返回碼,常見的有400表示索引已存在,404表示索引沒找到。app
$params = [ 'index' => 'test_missing', 'type' => 'test', 'id' => 1, 'client' => [ 'ignore' => 404 ] //忽略404報錯,兼容查詢不到結果的狀況 ]; echo $client->get($params); //這時候若是沒有查詢結果,將會返回一個found字段 ["found"] => bool(false)
不知道爲啥,本來提供的search會報411錯誤(尚未錯誤信息,跟蹤源碼也沒看出個因此然來),再三確保拼接的參數等都沒有問題,查了各類資料都沒有解決(聽說是body不存在引發的),只能改成curl請求http的模式。curl
public function search($params) { $index = 'your index'; $type = 'your type'; $url = sprintf('your es url/%s/%s/_search', $index, $type); //封裝了curl請求方法 $data = CurlUtil::post($url, null, json_encode($params['body'])); $data = json_decode($data, true); return $data; }
我想獲取(刪除)一行id爲XXX的數據時,使用了index_*去匹配,發現沒有結果返回,要指定到index_1纔能有結果返回。elasticsearch
search方法就可使用通配符。函數
我在ES中建立了一些數據做爲測試,數據內容以下:post
[ 'age' => '123', 'name' => '456' //注意,這裏應該是string類型纔對 ]
成功插入一行數據,正當我美滋滋把這個建立函數拿去正常流程跑的時候出現問題了。。測試
{"error":{"root_cause":[{"type":"mapper_parsing_exception","reason":"failed to parse [name]"}],"type":"mapper_parsing_exception","reason":"failed to parse [name]","caused_by":{"type":"number_format_exception","reason":"For input string: \"NateHuang\""}},"status":400}
類型錯誤?不能插入string類型的?啥狀況?因而我去ES查了下剛剛插入的數據,發現數據去到ES那邊變成這樣url
[ 'age' => 123, 'name' => 456 //這裏變成數字類型了 ]
age被默認設置成數字類型倒還沒什麼,name這樣搞就玩犢子了。。真的坑啊。。spa