如何转义 Solr 字段名称中“fl”参数的特殊字符(例如冒号、斜杠、引号...)?

问题描述 投票:0回答:2

我在 Solr 模式中使用冒号字符命名字段名称。我们需要使用命名空间字符,因为我们有数百个来自不同来源的字段。不可能使用下划线,因为这是在子名称中使用的。

问题似乎是,当 Solr 看到冒号时,它会触发伪字段解析(请参阅SOLR-2444)。对于字段

tika:metadata:height
,Solr 然后返回 400 错误并显示以下消息:

undefined field: "metadata"

我似乎找不到任何方法来逃避

:
角色。有人找到了吗

用反斜杠转义不起作用。

我正在使用 SolrJ Java 客户端。

solr escaping solrj
2个回答
1
投票

这种情况有一个救星:

field()
函数。
fl
参数接受函数查询,因此我们可以使用field函数将指定字段的存储值作为伪字段添加到结果中:

例如使用这些查询参数:

"params":{
  "q":"*:*",
  "fl":"field(tika:metadata:height),score",
}

您会得到如下结果:

"response":{
  "numFound":2,
  "docs":[{
    "field(tika:metadata:height)":720,
    "score":1.0
  },{
    "field(tika:metadata:height)":1080,
    "score":1.0
  }]
}

对于更复杂的字段名称或包含空格的字段名称,您需要在它们周围添加引号,无论是在查询中指定 fl 参数时还是在解析结果集中相应的伪字段时,例如: (以 JSON 格式转义)

"field(\"another field\")"
.


另一种方法是使用通配符。这应该有效:

"params":{
  "q":"*:*",
  "fl":"tika*metadata*height,score",
}

好处是我们可以在解析结果集中的字段列表时使用准确的字段名称,缺点是 glob 模式也可能匹配不需要的字段。


0
投票

它的语法错误,并带有消息 - 无法解析

tika:metadata:height

您可以使用 \ 来逃避

:
,例如
\:

但是在您的显示中

undefined field: "metadata"
这意味着您的 schema.xml 文件中未定义元数据字段,因此请检查一下。

在更正错误和语法时,您的查询请求

tika:metadata\:height
将在字段名称
"metadata:height"
中搜索字符串值
"tika"

代币化

示例:

q=\:title

也是因为查询标记化 如果您使用过

:
,则
solr.StandardTokenizerFactory

冒号将被丢弃

虽然

:
被转义,但 parsedquery 将变成
q=title

尝试使用

solr.WhitespaceTokenizerFactory

© www.soinside.com 2019 - 2024. All rights reserved.