Elasticsearch-PHP 处理JSON数组和对象

Posted Hail Hydra

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);  




以上是关于Elasticsearch-PHP 处理JSON数组和对象的主要内容,如果未能解决你的问题,请参考以下文章

使用composer安装Elasticsearch-php教程

Elasticsearch-PHP 快速开始

Elasticsearch-PHP 索引操作2

Elasticsearch-PHP 安装

Elasticsearch-PHP 概述

用elasticsearch-php laravel为啥不能返回高亮数据