ES使用中遇到的多種坑,以及解決方案(不按期更新)

最近在使用php中的elasticsearch/elasticsearch庫的時候,遇到不少問題,用此博客記錄踩過的坑。php

1.查詢不到致使404報錯

在使用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)

 

2.search方法很差使(我使用的是5.0版本)

不知道爲啥,本來提供的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;
}

 

3.get和delete方法的時候,index不能使用通配符 *

我想獲取(刪除)一行id爲XXX的數據時,使用了index_*去匹配,發現沒有結果返回,要指定到index_1纔能有結果返回。elasticsearch

search方法就可使用通配符。函數

 

4.假如字段默認設定一種類型,則不能插入另外一種類型的數據(好像是廢話,可是php中很容易出現,弱類型語言。。)

我在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

相關文章
相關標籤/搜索