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并没有为空对象提供一个“短”的标示,所以许多开发人员都不知道如何制定一个空对象。
考虑向查询中添加高亮显示:
- {
- "query" : {
- "match" : {
- "content" : "quick brown fox"
- }
- },
- "highlight" : {
- "fields" : {
- "content" : {}//这个空对象就是导致问题的地方
- }
- }
- }
问题是PHP会自动转换"content" : {} 成 "content" : [],这对于Elasticsearch DSL来说已不再有效。我们需要告诉PHP空对象是显试的对象,不是一个数组。如果要在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数组和对象的主要内容,如果未能解决你的问题,请参考以下文章