我在 Solr 模式中使用冒号字符命名字段名称。我们需要使用命名空间字符,因为我们有数百个来自不同来源的字段。不可能使用下划线,因为这是在子名称中使用的。
问题似乎是,当 Solr 看到冒号时,它会触发伪字段解析(请参阅SOLR-2444)。对于字段
tika:metadata:height
,Solr 然后返回 400 错误并显示以下消息:
undefined field: "metadata"
我似乎找不到任何方法来逃避
:
角色。有人找到了吗
用反斜杠转义不起作用。
我正在使用 SolrJ Java 客户端。
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 模式也可能匹配不需要的字段。
它的语法错误,并带有消息 - 无法解析
tika:metadata:height
您可以使用 \ 来逃避
:
,例如 \:
但是在您的显示中
undefined field: "metadata"
这意味着您的 schema.xml 文件中未定义元数据字段,因此请检查一下。
在更正错误和语法时,您的查询请求
tika:metadata\:height
将在字段名称"metadata:height"
中搜索字符串值
"tika"
代币化
示例:
q=\:title
也是因为查询标记化 如果您使用过
:
,则
solr.StandardTokenizerFactory
冒号将被丢弃
虽然
:
被转义,但 parsedquery 将变成 q=title
。
尝试使用
solr.WhitespaceTokenizerFactory