zoukankan      html  css  js  c++  java
  • Elasticsearch-PHP 处理JSON数组和对象

    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);  
  • 相关阅读:
    Java的数组的作业11月06日
    e课表项目第二次冲刺周期第九天
    e课表项目第二次冲刺周期第八天
    e课表项目第二次冲刺周期第七天
    e课表项目第二次冲刺周期第六天
    e课表项目第二次冲刺周期第五天
    e课表项目第二次冲刺周期第四天
    e课表项目第二次冲刺周期第三天
    e课表项目第二次冲刺周期第二天
    e课表项目第二次冲刺周期第一天
  • 原文地址:https://www.cnblogs.com/crystaltu/p/7657312.html
Copyright © 2011-2022 走看看