• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Elasticsearch-PHP 处理JSON数组和对象

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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);  

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
4.2、php注释发布时间:2022-07-10
下一篇:
php异步执行函数发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap