响应编写器
JSON 响应编写器
默认的 Solr 响应编写器是 JsonResponseWriter
,它以 JavaScript 对象表示法 (JSON) 格式化输出,这是一种在 RFC 4627 中指定的轻量级数据交换格式。在以下情况下使用默认响应编写器
-
请求中未指定
wt
参数,或 -
指定了不存在的响应编写器。
以下是类似于 q=id:VS1GB400C3
的简单查询的示例响应
{
"responseHeader":{
"zkConnected":true,
"status":0,
"QTime":7,
"params":{
"q":"id:VS1GB400C3"}},
"response":{"numFound":1,"start":0,"maxScore":2.3025851,"docs":[
{
"id":"VS1GB400C3",
"name":["CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail"],
"manu":["Corsair Microsystems Inc."],
"manu_id_s":"corsair",
"cat":["electronics",
"memory"],
"price":[74.99],
"popularity":[7],
"inStock":[true],
"store":["37.7752,-100.0232"],
"manufacturedate_dt":"2006-02-13T15:26:37Z",
"payloads":["electronics|4.0 memory|2.0"],
"_version_":1549728120626479104}]
}}
JSON 编写器的默认 mime 类型为 application/json
,但可以在 solrconfig.xml
中覆盖此类型,例如在“techproducts”配置集中的此示例中
<queryResponseWriter name="json" class="solr.JSONResponseWriter">
<!-- For the purposes of the tutorial, JSON response are written as
plain text so that it's easy to read in *any* browser.
If you are building applications that consume JSON, just remove
this override to get the default "application/json" mime type.
-->
<str name="content-type">text/plain</str>
</queryResponseWriter>
如果你使用 JSONP 以 JSON 格式化响应来跨边界查询,让 Solr 以 text/plain mime 类型响应(当浏览器期望 application/json 时)将触发浏览器阻止请求。 |
JSON 特定参数
json.nl
此参数控制 NamedLists 的输出格式,其中顺序比按名称访问更重要。NamedList 当前用于字段分面数据。
json.nl
参数采用以下值
flat
-
默认值。NamedList 表示为扁平数组,交替出现名称和值。
对于输入
NamedList("a"=1, "bar"="foo", null=3, null=null)
,输出将为["a",1, "bar","foo", null,3, null,null]
。 map
-
NamedList 表示为 JSON 对象。尽管这是最简单的映射,但 NamedList 可以具有可选键、重复键并保留顺序。对 NamedList 使用 JSON 对象(本质上是映射或哈希)会导致丢失一些信息。
对于输入
NamedList("a"=1, "bar"="foo", null=3, null=null)
,输出将为{"a":1, "bar":"foo", "":3, "":null}
。 arrarr
-
NamedList 表示为由两个元素数组组成的数组。
对于输入
NamedList("a"=1, "bar"="foo", null=3, null=null)
,输出将为[["a",1], ["bar","foo"], [null,3], [null,null]]
。 arrmap
-
NamedList 表示为 JSON 对象数组。
输入
NamedList("a"=1, "bar"="foo", null=3, null=null)
,输出将为[{"a":1}, {"b":2}, 3, null]
。 arrntv
-
NamedList 表示为一个 Name Type Value JSON 对象数组。
输入
NamedList("a"=1, "bar"="foo", null=3, null=null)
,输出将为[{"name":"a","type":"int","value":1}, {"name":"bar","type":"str","value":"foo"}, {"name":null,"type":"int","value":3}, {"name":null,"type":"null","value":null}]
。
标准 XML 响应编写器
XML 响应编写器是目前 Solr 中包含的最通用且可重用的响应编写器。它是在大多数讨论和文档中用于 Solr 查询响应的格式。
请注意,XSLT 响应编写器可用于将此编写器生成的 XML 转换为其他词汇或基于文本的格式。
XML 响应编写器的行为可由以下查询参数驱动。
version
-
可选
默认值:
2.2
version
参数确定响应中使用的 XML 协议。强烈建议客户端始终指定协议版本,以确保在升级 Solr 服务器并引入新的默认格式时,他们收到的响应格式不会意外更改。目前唯一受支持的版本值为
2.2
。responseHeader
的格式已更改为使用与响应其余部分相同的<lst>
结构。默认值是最新的受支持版本。
stylesheet
-
可选
默认值:无
stylesheet
参数可用于指示 Solr 在其返回的 XML 响应中包含<?xml-stylesheet type="text/xsl" href="…"?>
声明。默认行为是根本不返回任何样式表声明。
不建议使用
stylesheet
参数,因为目前没有指定外部样式表的方法,并且 Solr 发行版中未提供任何样式表。这是一个旧版参数,可能会在将来的版本中进一步开发。 缩进
-
可选
默认值:无
如果使用
indent
参数,并且其具有非空白值,那么 Solr 将尝试缩进其 XML 响应,以便人类更易于阅读。默认行为是不缩进。
XSLT 响应编写器
XSLT 响应编写器将 XML 样式表应用于输出。它可用于执行诸如为 RSS 提要设置结果格式之类的任务。
XSLT 响应编写器接受一个参数
tr
-
可选
默认值:无
标识要使用的 XML 转换。必须在 Solr
conf/xslt
目录中找到转换。响应的内容类型根据 XSLT 转换中的
<xsl:output>
语句设置,例如:<xsl:output media-type="text/html"/>
XSLT 配置
以下示例来自 Solr 发行版中的 sample_techproducts_configs
configset,展示了如何配置 XSLT 响应编写器。
<!--
Changes to XSLT transforms are taken into account
every xsltCacheLifetimeSeconds at most.
-->
<queryResponseWriter name="xslt"
class="solr.scripting.xslt.XSLTResponseWriter">
<int name="xsltCacheLifetimeSeconds">5</int>
</queryResponseWriter>
对于 xsltCacheLifetimeSeconds
,5 的值适合开发,以便快速查看 XSLT 更改。对于生产,您可能需要一个更高的值。
XSLT 编写器示例
http://localhost:8983/solr/techproducts/select?q=ipod&fl=id,cat,name,popularity,price,score&wt=xslt&tr=example_rss.xsl
将结果转换为 RSS 提要
<rss version="2.0">
<channel>
<title>Example Solr RSS 2.0 Feed</title>
<link>http://localhost:8983/solr</link>
<description>
This has been formatted by the sample "example_rss.xsl" transform - use your own XSLT to get a nicer RSS feed.
</description>
<language>en-us</language>
<docs>http://localhost:8983/solr</docs>
<item>
<title>iPod & iPod Mini USB 2.0 Cable</title>
<link>
http://localhost:8983/solr/select?q=id:IW-02
</link>
<description/>
<pubDate/>
<guid>
http://localhost:8983/solr/select?q=id:IW-02
</guid>
</item>
sample_techproducts_configs
还包括生成简单 HTML 页面的 example.xsl
和以 Atom 格式输出的 example_atom.xsl
。
updateXml.xsl
可用于将标准 Solr XML 输出转换为 Solr XML 添加文档格式!实际上,您可以通过以下方式往返传输您的数据
curl -o docs_formatted_as_solr_add.xml "http://localhost:8983/solr/techproducts/select?q=ipod&fl=id,cat,name,popularity,price,score&wt=xslt&tr=updateXml.xsl"
curl -X POST -H "Content-Type: text/xml" -d @docs_formatted_as_solr_add.xml "http://localhost:8983/solr/techproducts/update?commitWithin=1000&overwrite=true"
最后,luke.xsl
转换表明您可以应用非常复杂的转换:http://localhost:8983/solr/techproducts/admin/luke?wt=xslt&tr=luke.xsl
二进制响应编写器
这是一种 Solr 用于节点间通信以及客户端-服务器通信的自定义二进制格式。SolrJ 将其用作索引和查询的默认值。有关更多详细信息,请参阅 客户端 API。
GeoJSON 响应编写器
以 GeoJSON 格式返回 Solr 结果,并使用特定于 Solr 的 JSON 进行扩充。若要使用此功能,请将 wt=geojson
和 geojson.field
设置为空间 Solr 字段的名称。并非所有空间字段类型都受支持,如果您使用不受支持的字段,则会收到错误消息。
Python 响应编写器
Solr 具有可选的 Python 响应格式,它通过以下方式扩展其 JSON 输出,以允许 Python 解释器安全地评估响应
-
true 和 false 更改为 True 和 False
-
在需要时使用 Python unicode 字符串
-
使用 ASCII 输出(带 unicode 转义符)以减少出错的可能性
-
转义换行符
-
null 更改为 None
PHP 响应编写器和 PHP 序列化响应编写器
Solr 具有 PHP 响应格式,它输出一个数组(作为 PHP 代码),该数组可以进行评估。将 wt
参数设置为 php
会调用 PHP 响应编写器。
示例用法
$code = file_get_contents('http://localhost:8983/solr/techproducts/select?q=iPod&wt=php');
eval("$result = " . $code . ";");
print_r($result);
Solr 还包括一个 PHP 序列化响应编写器,它以序列化数组的格式输出数据。将 wt
参数设置为 phps
会调用 PHP 序列化响应编写器。
示例用法
$serializedResult = file_get_contents('http://localhost:8983/solr/techproducts/select?q=iPod&wt=phps');
$result = unserialize($serializedResult);
print_r($result);
Ruby 响应编写器
Solr 具有可选的 Ruby 响应格式,它通过以下方式扩展其 JSON 输出,以允许 Ruby 的解释器安全地评估响应
-
使用 Ruby 的单引号字符串以防止可能的字符串漏洞。
-
\ 和 ' 是仅有的两个转义字符。
-
不使用 Unicode 转义符。数据以原始 UTF-8 格式写入。
-
nil 用于 null。
-
=> 用作映射中的键/值分隔符。
以下是一个使用 Ruby 响应格式查询 Solr 的简单示例
require 'net/http'
h = Net::HTTP.new('localhost', 8983)
hresp, data = h.get('/solr/techproducts/select?q=iPod&wt=ruby', nil)
rsp = eval(data)
puts 'number of matches = ' + rsp['response']['numFound'].to_s
#print out the name field for each returned document
rsp['response']['docs'].each { |doc| puts 'name field = ' + doc['name'\] }
CSV 响应编写器
CSV 响应编写器以逗号分隔值 (CSV) 格式返回文档列表。其他通常包含在响应中的信息(例如,分类信息)将被排除在外。
CSV 参数
这些参数指定要返回的 CSV 格式。您可以接受默认值或指定自己的值。
参数 | 默认值 |
---|---|
csv.encapsulator |
|
csv.escape |
无 |
csv.separator |
|
csv.header |
默认为 |
csv.newline |
|
csv.null |
默认为零长度字符串。当文档对特定字段没有值时,使用此参数。 |
多值字段 CSV 参数
这些参数指定如何对多值字段进行编码。可以使用 f.<fieldname>.csv.separator=|
对这些值的每个字段进行覆盖。
参数 | 默认值 |
---|---|
csv.mv.encapsulator |
无 |
csv.mv.escape |
|
csv.mv.separator |
默认为 |
CSV 编写器示例
http://localhost:8983/solr/techproducts/select?q=ipod&fl=id,cat,name,popularity,price,score&wt=csv
返回
id,cat,name,popularity,price,score
IW-02,"electronics,connector",iPod & iPod Mini USB 2.0 Cable,1,11.5,0.98867977
F8V7067-APL-KIT,"electronics,connector",Belkin Mobile Power Cord for iPod w/ Dock,1,19.95,0.6523595
MA147LL/A,"electronics,music",Apple 60 GB iPod with Video Playback Black,10,399.0,0.2446348
CBOR 响应编写器
Solr 支持 CBOR 响应格式,该格式更紧凑且速度更快。使用 wt=cbor
参数以 CBOR 格式获取响应。
如果您的客户端不支持 CBOR 的 STRINGREF 功能,请使用 wt=cbor&str_ref=false
示例 Python 程序
将以下程序另存为 cbor_query.py
import cbor2
import json
import requests
// replace 'coll1' with your own collection name. And use appropriate query params
url = "http://localhost:8983/solr/coll1/select?q=*:*&wt=cbor"
# Make the HTTP request
response = requests.get(url, headers={"Accept": "application/cbor"})
# Check the response status
if response.status_code == requests.codes.ok:
# Decode the CBOR response payload
cbor_data = response.content
json_data = cbor2.loads(cbor_data)
# Dump the JSON data to a file
with open("response.json", "w") as file:
json.dump(json_data, file, indent=4)
print("CBOR response payload dumped to response.json")
else:
print("HTTP request failed with status code:", response.status_code)
Smile 响应编写器
Smile 格式是一种 JSON 兼容的二进制格式,在此处详细描述:https://en.wikipedia.org/wiki/Smile_(data_interchange_format)
XLSX 响应编写器
使用此格式以 .xlsx(Microsoft Excel)格式获取响应作为电子表格。它接受 colwidth.<field-name>
和 colname.<field-name>
形式的参数,这有助于您自定义列宽和列名。
此响应编写器已作为提取库的一部分添加,并且仅当服务器类路径中存在提取模块时才有效。使用 lib
指令定义类路径是不够的。相反,您需要手动将必要的 .jar 复制到 Solr Web 应用程序的 lib
目录中。您可以从 $SOLR_INSTALL
目录运行这些命令
cp modules/extraction/lib/*.jar server/solr-webapp/webapp/WEB-INF/lib/
一旦库就位,您就可以将 wt=xlsx
添加到您的请求中,结果将作为 XLSX 工作表返回。