前言
最近项目中需要使用curl来call solr的api,获取某个query的数量,并且取得值来和数据库中的数量进行比对,记录一下使用curl调用solr和linux命令积累的一点经验。
使用curl命令,获取solr中query的结果笔数
首先我要通过curl命令获取Solr中一个查询的记录结果数量,这一步可以使用Solr的HTTP API来执行这个操作。以下是一个基本的步骤和示例,演示如何通过curl命令来完成这个任务:
-
首先确定你的Solr服务器的URL以及你需要查询的核心(core)或集合(collection)的名称。
-
构造你的查询。假设你想要查询所有的记录,你可以使用
q=*:*这样的查询。如果有特定的查询条件,你可以按照Solr的查询语法来构造你的查询。 -
使用
rows=0参数,这样Solr只会返回查询的元数据,不会返回任何记录,这样可以更快地获取记录数。 -
使用
wt=json参数来指定返回格式为JSON,这样可以方便地解析结果。
假设你的Solr服务器地址是http://localhost:8983/solr,你的核心名称是mycore,以下是一个curl命令的示例:
arduino
curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json"
这个命令会返回一个JSON格式的响应,其中包含了查询的结果数量。在返回的JSON中,你可以找到response对象,其下的numFound属性就是匹配查询的记录数。
例如,返回的JSON可能看起来像这样:
{
"responseHeader": {
"status": 0,
"QTime": 1
},
"response": {
"numFound": 1234,
"start": 0,
"docs": []
}
}
在这个示例中,numFound的值1234就是查询结果的记录数。这样,你就可以通过解析这个JSON来获取你想要的记录数。
Linux中Shell获得json中的值
第二个问题来了,我得到的是一个json值,我该如何精确的获取到numFound这个变量的值呢?
在Linux环境下,你可以使用命令行工具如curl结合jq来获取返回的JSON中的numFound值。jq是一个轻量级且灵活的命令行JSON处理器,可以用来解析、过滤、映射和生成JSON数据。
首先,确保你的系统中已经安装了jq。如果没有安装,你可以通过包管理器来安装它。例如,在Ubuntu上,你可以使用以下命令安装:
arduino
sudo apt-get install jq
然后,你可以结合使用curl和jq来获取numFound的值。这里是一个示例命令,它使用curl获取Solr查询结果,然后通过管道传递给jq来提取numFound:
arduino
curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json" | jq '.response.numFound'
在这个命令中:
curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json"会发送请求到Solr服务器并获取JSON格式的响应。|是管道符,它将前一个命令的输出作为下一个命令的输入。jq '.response.numFound'会解析传递过来的JSON数据,提取出.response.numFound的值并打印到终端。
执行上述命令后,你会在终端看到numFound的值,这就是查询结果的记录数,通过这种方式可以轻松拿到json中的变量值。
Linux中不使用jq取得json变量的值
那么第三个问题又来了,我的linux服务器,是在客户的内部网络中,无法访问互联网,我也不想安装jq来获取json值,是否还有其他方法可以拿到呢?方法总比困难多,皇天不负有心人,嘿嘿~
如果不想使用jq工具,可以使用其他文本处理工具如grep、awk、sed等来提取numFound的值。
看看怎么通过curl、grep和awk来取得json的值吧。
以下是一个使用curl、grep和awk来提取numFound值的示例命令:
perl
curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json" | grep -o '"numFound":[0-9]*' | awk -F':' '{print $2}'
在这个命令中:
curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json"同样是用来发送请求并获取返回的JSON数据。grep -o '"numFound":[0-9]*'使用-o选项输出与模式匹配的部分,这里的模式"numFound":[0-9]*用于匹配"numFound"及其后的数字。awk -F':' '{print $2}'使用awk来处理grep的输出。-F':'指定分隔符为冒号,'{print $2}'表示打印第二个字段(即numFound的值)。
这个命令会从Solr返回的JSON中提取numFound的值并打印出来。d但是我们需要注意的是,这种方法依赖于返回的JSON格式相对固定,如果JSON结构有大的变化,这个命令可能需要相应地调整。
在我的另一个需求中,我要取的一个变量id中不是单纯的数字,而是数字字母和'-'的组合体, 于是调整了grep命令中的正则表达式来匹配这种更复杂的模式。下面是一个修改后的命令示例,它可以捕获包含数字、字母和'-'的numFound值:
perl
curl "http://localhost:8983/solr/mycore/select?q=*:*&rows=0&wt=json" | grep -o '"numFound":[0-9a-zA-Z-]*' | awk -F':' '{print $2}'
在这个命令中:
grep -o '"numFound":[0-9a-zA-Z-]*'修改了正则表达式,使其能够匹配数字(0-9)、字母(a-zA-Z)和'-'符号。这里[0-9a-zA-Z-]*意味着匹配任意数量的数字、字母或'-'。
顺利搞定工作的感觉真好,加油😜~