响应写入器

响应写入器生成搜索的格式化响应。

Solr 支持多种响应写入器,以确保查询响应可以由适当的语言或应用程序解析。

wt 参数选择要使用的响应写入器。以下列表描述了 wt 参数最常用的设置,并提供了指向更详细讨论这些设置的章节的链接。

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 格式响应,则当浏览器预期 application/json 时,Solr 响应 text/plain MIME 类型将触发浏览器阻止该请求。

JSON 特定参数

json.nl

此参数控制 NamedList 的输出格式,其中顺序比按名称访问更重要。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 表示为名称、类型、值 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}]

json.wrf

json.wrf=function 在 JSON 响应周围添加一个包装函数,这在 AJAX 中使用动态脚本标签来指定 JavaScript 回调函数时非常有用。

标准 XML 响应写入器

XML 响应写入器是目前 Solr 中包含的最通用的可重用响应写入器。它是关于 Solr 查询响应的大多数讨论和文档中使用的格式。

请注意,XSLT 响应写入器可用于将此写入器生成的 XML 转换为其他词汇或基于文本的格式。

XML 响应写入器的行为可以由以下查询参数驱动。

version

可选

默认值:2.2

version 参数确定响应中使用的 XML 协议。强烈建议客户端始终指定协议版本,以确保如果 Solr 服务器升级并引入新的默认格式,它们收到的响应格式不会意外更改。

目前唯一支持的版本值是 2.2responseHeader 的格式已更改为使用与响应其余部分相同的 <lst> 结构。

默认值是最新支持的版本。

stylesheet

可选

默认值:无

stylesheet 参数可用于指示 Solr 在其返回的 XML 响应中包含 <?xml-stylesheet type="text/xsl" href="…​"?> 声明。

默认行为是不返回任何样式表声明。

不建议使用 stylesheet 参数,因为目前没有办法指定外部样式表,并且 Solr 发行版中没有提供任何样式表。这是一个遗留参数,可能会在未来的版本中进一步开发。

indent

可选

默认值:无

如果使用 indent 参数,并且具有非空白值,那么 Solr 将尝试缩进其 XML 响应,使其更易于人类阅读。

默认行为是不缩进。

XSLT 响应写入器

XSLT 响应写入器将 XML 样式表应用于输出。它可用于诸如为 RSS 源格式化结果之类的任务。

此响应写入器是 脚本模块 的一部分。由于它是一个模块,因此在使用之前需要 配置

XSLT 响应写入器接受一个参数

tr

可选

默认值:无

标识要使用的 XML 转换。必须在 Solr conf/xslt 目录中找到该转换。

响应的 Content-Type 根据 XSLT 转换中的 <xsl:output> 语句设置,例如:<xsl:output media-type="text/html"/>

XSLT 配置

下面示例来自 Solr 发行版中的 sample_techproducts_configs 配置集,显示了如何配置 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 写入器示例

https://127.0.0.1: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>https://127.0.0.1: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>https://127.0.0.1:8983/solr</docs>
    <item>
      <title>iPod &amp; iPod Mini USB 2.0 Cable</title>
      <link>
        https://127.0.0.1:8983/solr/select?q=id:IW-02
      </link>
      <description/>
      <pubDate/>
      <guid>
        https://127.0.0.1:8983/solr/select?q=id:IW-02
      </guid>
    </item>

sample_techproducts_configs 还包括 example.xsl,它生成一个简单的 HTML 页面,以及以 Atom 格式输出的 example_atom.xsl

updateXml.xsl 可用于将标准 Solr XML 输出转换为 Solr XML 添加文档格式!实际上,您可以通过以下方式往返您的数据

curl -o docs_formatted_as_solr_add.xml "https://127.0.0.1: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 "https://127.0.0.1:8983/solr/techproducts/update?commitWithin=1000&overwrite=true"

最后,luke.xsl 转换演示了您可以应用非常复杂的转换:https://127.0.0.1:8983/solr/techproducts/admin/luke?wt=xslt&tr=luke.xsl

二进制响应写入器

这是 Solr 用于节点间通信以及客户端-服务器通信的自定义二进制格式。SolrJ 将其用作索引和查询的默认值。有关更多详细信息,请参阅 客户端 API

GeoJSON 响应写入器

GeoJSON 格式返回 Solr 结果,并增强了特定于 Solr 的 JSON。要使用此功能,请将 wt=geojsongeojson.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('https://127.0.0.1:8983/solr/techproducts/select?q=iPod&wt=php');
eval("$result = " . $code . ";");
print_r($result);

Solr 还包括一个 PHP 序列化响应写入器,该写入器以序列化数组格式化输出。将 wt 参数设置为 phps 将调用 PHP 序列化响应写入器。

用法示例

$serializedResult = file_get_contents('https://127.0.0.1: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 格式的输出与 Solr 的 CSV 更新格式 兼容。

CSV 参数

这些参数指定将返回的 CSV 格式。您可以接受默认值或指定自己的值。

参数 默认值

csv.encapsulator

"

csv.escape

csv.separator

,

csv.header

默认为 true。如果为 false,则 Solr 不打印列标题。

csv.newline

\n

csv.null

默认为零长度字符串。当文档的特定字段没有值时,请使用此参数。

多值字段 CSV 参数

这些参数指定如何编码多值字段。可以使用 f.<fieldname>.csv.separator=| 完成这些值的每个字段覆盖。

参数 默认值

csv.mv.encapsulator

csv.mv.escape

\

csv.mv.separator

默认为 csv.separator 值。

CSV 写入器示例

https://127.0.0.1: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&string_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 = "https://127.0.0.1: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)

运行程序

  1. 安装 Python

  2. 安装依赖项

    pip install requests cbor2
  3. 运行程序

    python3 cbor_query.py

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 Webapp 的 lib 目录中。您可以从 $SOLR_INSTALL 目录运行这些命令

cp modules/extraction/lib/*.jar server/solr-webapp/webapp/WEB-INF/lib/

将库到位后,您可以将 wt=xlsx 添加到请求中,结果将以 XLSX 表格的形式返回。