码迷,mamicode.com
首页 > 编程语言 > 详细

Elasticsearch-PHP 处理JSON数组和对象

时间:2017-10-12 19:22:22      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:版本   res   body   没有   代码生成   高亮   span   json   cli   

PHP中处理JSON数组和对象

客户端有一些混淆的资源是围绕着JSON的数组和对象,以及如何在PHP中指定它们。特别是,问题是由空对象和空数组导致的。这篇文章回告诉你一些在Elasticsearch JSON API中的常用模式,以及如何转换成为PHP表示形式。

 

空对象

Elasticsearch API 在很多地方使用空的JSON对象,这可能在PHP中会导致一些问题。与其他语言不同,PHP并没有为空对象提供一个“短”的标示,所以许多开发人员都不知道如何制定一个空对象。

考虑向查询中添加高亮显示:

 

  1. {  
  2.     "query" : {  
  3.         "match" : {  
  4.             "content" : "quick brown fox"  
  5.         }  
  6.     },  
  7.     "highlight" : {  
  8.         "fields" : {  
  9.             "content" : {}//这个空对象就是导致问题的地方  
  10.         }  
  11.     }  
  12. }  

 


问题是PHP会自动转换"content" : {} 成 "content" : [],这对于Elasticsearch DSL来说已不再有效。我们需要告诉PHP空对象是显试的对象,不是一个数组。如果要在PHP中定义一个查询,你需要这样做:

 

  1. $params[‘body‘] = array(  
  2.     ‘query‘ => array(  
  3.         ‘match‘ => array(  
  4.             ‘content‘ => ‘quick brown fox‘  
  5.         )  
  6.     ),  
  7.     ‘highlight‘ => array(  
  8.         ‘fields‘ => array(  
  9.             ‘content‘ => (object) array()//我们投掷一个空的数组到一个对象上来表示一个空的对象,JSON现在能够编码正确  
  10.         )  
  11.     )  
  12. );  
  13. $results = $client->search($params);  

 

 

通过使用一个空数组转换为对象,我们可以强制 json_encode 解析器正确输出一个空的对象,而不是一个空数组。可悲的是,这个冗长的解决方案是PHP中唯一能够实现目标的。因为PHP并没有为空对象提供一个“短”的标示。

数组对象

 

Elasticsearch DSL中另外一个通用模式是数组对象,例如,考虑在查询中添加一个排序:

 

  1. {  
  2.     "query" : {  
  3.         "match" : { "content" : "quick brown fox" }  
  4.     },  
  5.     "sort" : [ //"sort"包含一个JSON数组对象  
  6.         {"time" : {"order" : "desc"}},  
  7.         {"popularity" : {"order" : "desc"}}  
  8.     ]  
  9. }  

 

 

这种安排是非常常见的,但是在PHP中可能会非常棘手,以为她需要一个嵌套的数组,PHP冗长的难解的方案还在继续,为了构造一个数组对象,你确实需要一个数组的数组:

 

  1. $params[‘body‘] = array(  
  2.     ‘query‘ => array(  
  3.         ‘match‘ => array(  
  4.             ‘content‘ => ‘quick brown fox‘  
  5.         )  
  6.     ),  
  7.     ‘sort‘ => array( //这个数组编码成"sort": []  
  8.         array(‘time‘ => array(‘order‘ => ‘desc‘)), //这个数组编码成{"time": {"order": "desc"}}  
  9.         array(‘popularity‘ => array(‘order‘ => ‘desc‘)) //这个数组编码成{"popularity": {"order": "desc"}}  
  10.     )  
  11. );  
  12. $results = $client->search($params);  

 

 

如果你使用的是PHP5.4+的版本,我强烈鼓励你使用短数组语法,它使得这些嵌套的数组读起来更简单:

 

  1. $params[‘body‘] = [  
  2.     ‘query‘ => [  
  3.         ‘match‘ => [  
  4.             ‘content‘ => ‘quick brown fox‘  
  5.         ]  
  6.     ],  
  7.     ‘sort‘ => [  
  8.         [‘time‘ => [‘order‘ => ‘desc‘]],  
  9.         [‘popularity‘ => [‘order‘ => ‘desc‘]]  
  10.     ]  
  11. ];  
  12. $results = $client->search($params);  

 

 

空数组对象


偶尔地,你会遇到需要前面两种模式,积分查询函数是一个好例子,有时需要一个数组对象,这些对象可能是空的JSON对象。

 

下面给出这个查询:

  1. {  
  2.     "query":{  
  3.         "function_score":{  
  4.             "functions":[  
  5.                 {  
  6.                 "random_score":{}  
  7.                 }  
  8.             ],  
  9.             "boost_mode":"replace"  
  10.         }  
  11.     }  
  12. }  

 

 

我们可以使用下面的PHP代码生成:

 

    1. $params[‘body‘] = array(  
    2.     ‘query‘ => array(  
    3.         ‘function_score‘ => array(  
    4.             ‘functions‘ => array( //  这个编码成:"functions": []  
    5.                 array( // 这个编码成一个对象在数组里:{"random_score": {}}  
    6.                     ‘random_score‘ => (object) array() // 这个编码成一个空的JSON对象: "random_score": {}  
    7.                 )  
    8.             )  
    9.         )  
    10.     )  
    11. );  
    12. $results = $client->search($params);  

Elasticsearch-PHP 处理JSON数组和对象

标签:版本   res   body   没有   代码生成   高亮   span   json   cli   

原文地址:http://www.cnblogs.com/crystaltu/p/7657312.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!