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数组和对象的更多相关文章
- 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式
表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...
- PHP中json数组与对象的问题
在PHP后端,对于数组和对象的区分不是很大,主要用到的数组居多,而PHP提供接口时响应的一般是json数据(为什么使用json呢,总体来说就是体积小速度快).但是前端对数组对象很'敏感',所以对PHP ...
- PHP JSON数组与对象的理解
在PHP后端和客户端数据交互的过程中,JSON数据中有时格式不定,一会儿是数组,一会儿是对象,弄得客户端开发人员要崩溃的感觉. 因此,前后端相关人员先对PHP的json_encode函数原理有必要的了 ...
- (实用篇)PHP JSON数组与对象的理解
在PHP后端和客户端数据交互的过程中,JSON数据中有时格式不定,一会儿是数组,一会儿是对象,弄得客户端开发人员要崩溃的感觉. 因此,前后端相关人员先对PHP的json_encode函数原理有必要的了 ...
- (精华)将json数组和对象转换成List和Map(小龙哥和牛徳鹤的对话)
将java标准的数据结构ArrayList和HashMap转换成json对象和数组很简单 只需要JSONArray.fromObject(obj);或者JSONObject.fromObject(ob ...
- json 数组 对象 xml 之间转换(待补充)
json 数组 xml 对象 之间转换(待补充) 1 把对象的类型或者数组转换成字符串类型(或者更确切的说是json类型的). 此处参考链接http://www.jb51.net/article ...
- C#解析JSON数组
方式一 第一步:使用前,需下载:Newtonsoft.Json.dll 没有的,请到我百度云盘下载 链接:https://pan.baidu.com/s/1JBkee4qhtW7XOyYFiGOL2Q ...
- ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套
这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- JSon_零基础_002_将List类型数组转换为JSon格式的对象字符串,返回给界面
将List类型数组转换为JSon格式的对象字符串,返回给界面 所需要导入的包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * ...
随机推荐
- Unrecoverable error: corrupted cluster config file.
from: https://www.cnblogs.com/topicjie/p/7603227.html 缘起 正在欢乐的逗着孩子玩耍,突然间来了一通电话,值班人员告诉我误重启了一台服务器,是我负责 ...
- Built(最小生成树+构图离散化)
个人心得:看了题目很明确,最小生成树,但是但是周赛卡住了,因为10W的点若一个一个找出距离很明显内存和时间都炸了, 静下心来,画了下图,仔细一想,任意一个点都只会在她左右俩边选择建立联系,那么我们只要 ...
- 【DUBBO】dobbo的application的配置项
Dubbo:application的配置项[一]:配置项 <dubbo:application name="服务名字" owner="拥有者" organ ...
- CAS原理分析
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁(后面的章节还会谈到锁). 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度 ...
- 虚拟主机wordpress文件上传大小限制更改
默认的wp文件上传的大小都是2M 登录阿里云进入控制面板找到你的虚拟机实例 点击管理 改成10M,最大也就是10,虚拟机的睾丸之处.保存,去页面新媒体添加可以看到最大限制为10M了
- 微信卡券开发,代金券修改卡券信息返回40145错误码: invalid update! Can not both set PayCell and CenterCellInfo(include: center_title, center_sub_title, center_url). hint: [DZ9rna0637ent1]
修改代金券,接口返回的数组是这样的内容 Array ( [errcode] => 40145 [errmsg] => invalid update! Can not both set ...
- couchdb的使用例子
couchdb安装 sudo apt-get install erlang sudo apt-get install libmozjs185-dev libicu-dev 下载源码,编译安装 启动以后 ...
- 使用FileZilla连接Linux
FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能.可控性.有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP ...
- 自己设计代理IP池
大体思路 使用redis作为队列,买了一份蘑菇代理,但是这个代理每5秒可以请求一次,我们将IP请求出来,从redis列表队列的左侧插入,要用的时候再从右侧取出,请求成功证明该IP是可用的,将该代理IP ...
- linux 文件结构
Linux常见的目录解释: 目录 描述 / 根目录 /bin 做为基础系统所需要的最基础的命令就是放在这里.比如 ls.cp.mkdir等命令:功能和/usr/bin类似,这个目录中的文件都是可执行的 ...