標籤:版本 res body 沒有 代碼產生 高亮 span json cli
PHP中處理JSON數組和對象
用戶端有一些混淆的資源是圍繞著JSON的數組和對象,以及如何在PHP中指定它們。特別是,問題是由Null 物件和空數組導致的。這篇文章回告訴你一些在Elasticsearch JSON API中的常用模式,以及如何轉換成為PHP表示形式。
Null 物件
Elasticsearch API 在很多地方使用空的JSON對象,這可能在PHP中會導致一些問題。與其他語言不同,PHP並沒有為空白對象提供一個“短”的標示,所以許多開發人員都不知道如何制定一個Null 物件。
考慮向查詢中添加高亮顯示:
- {
- "query" : {
- "match" : {
- "content" : "quick brown fox"
- }
- },
- "highlight" : {
- "fields" : {
- "content" : {}//這個Null 物件就是導致問題的地方
- }
- }
- }
問題是PHP會自動轉換"content" : {} 成 "content" : [],這對於Elasticsearch DSL來說已不再有效。我們需要告訴PHPNull 物件是顯試的對象,不是一個數組。如果要在PHP中定義一個查詢,你需要這樣做:
- $params[‘body‘] = array(
- ‘query‘ => array(
- ‘match‘ => array(
- ‘content‘ => ‘quick brown fox‘
- )
- ),
- ‘highlight‘ => array(
- ‘fields‘ => array(
- ‘content‘ => (object) array()//我們投擲一個空的數組到一個對象上來表示一個空的對象,JSON現在能夠編碼正確
- )
- )
- );
- $results = $client->search($params);
通過使用一個空數群組轉換為對象,我們可以強制 json_encode 解析器正確輸出一個空的對象,而不是一個空數組。可悲的是,這個冗長的解決方案是PHP中唯一能夠實現目標的。因為PHP並沒有為空白對象提供一個“短”的標示。
數組對象
Elasticsearch DSL中另外一個通用模式是數組對象,例如,考慮在查詢中添加一個排序:
- {
- "query" : {
- "match" : { "content" : "quick brown fox" }
- },
- "sort" : [ //"sort"包含一個JSON數組對象
- {"time" : {"order" : "desc"}},
- {"popularity" : {"order" : "desc"}}
- ]
- }
這種安排是非常常見的,但是在PHP中可能會非常棘手,以為她需要一個嵌套的數組,PHP冗長的難解的方案還在繼續,為了構造一個數組對象,你確實需要一個數組的數組:
- $params[‘body‘] = array(
- ‘query‘ => array(
- ‘match‘ => array(
- ‘content‘ => ‘quick brown fox‘
- )
- ),
- ‘sort‘ => array( //這個數組編碼成"sort": []
- array(‘time‘ => array(‘order‘ => ‘desc‘)), //這個數組編碼成{"time": {"order": "desc"}}
- array(‘popularity‘ => array(‘order‘ => ‘desc‘)) //這個數組編碼成{"popularity": {"order": "desc"}}
- )
- );
- $results = $client->search($params);
如果你使用的是PHP5.4+的版本,我強烈鼓勵你使用短數組文法,它使得這些嵌套的數組讀起來更簡單:
- $params[‘body‘] = [
- ‘query‘ => [
- ‘match‘ => [
- ‘content‘ => ‘quick brown fox‘
- ]
- ],
- ‘sort‘ => [
- [‘time‘ => [‘order‘ => ‘desc‘]],
- [‘popularity‘ => [‘order‘ => ‘desc‘]]
- ]
- ];
- $results = $client->search($params);
空數組對象
偶爾地,你會遇到需要前面兩種模式,積分查詢函數是一個好例子,有時需要一個數組對象,這些對象可能是空的JSON對象。
下面給出這個查詢:
- {
- "query":{
- "function_score":{
- "functions":[
- {
- "random_score":{}
- }
- ],
- "boost_mode":"replace"
- }
- }
- }
我們可以使用下面的PHP代碼產生:
- $params[‘body‘] = array(
- ‘query‘ => array(
- ‘function_score‘ => array(
- ‘functions‘ => array( // 這個編碼成:"functions": []
- array( // 這個編碼成一個對象在數組裡:{"random_score": {}}
- ‘random_score‘ => (object) array() // 這個編碼成一個空的JSON對象: "random_score": {}
- )
- )
- )
- )
- );
- $results = $client->search($params);
Elasticsearch-PHP 處理JSON數組和對象