前言
最近项目中需要使用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命令的示例:
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上,你可以使用以下命令安装:
sudo apt-get install jq
然后,你可以结合使用curl
和jq
来获取numFound
的值。这里是一个示例命令,它使用curl
获取Solr查询结果,然后通过管道传递给jq
来提取numFound
:
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
值的示例命令:
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
值:
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-]*
意味着匹配任意数量的数字、字母或'-'。
顺利搞定工作的感觉真好,加油😜~