2

我们在模式中存储了一个路径,以斜线分隔,并且它也以斜线开头。根据这篇文章,solr 将查询开头的斜杠解释为 4.0 版之后的正则表达式,这意味着我们需要转义斜杠。

但是SolrTemplate.queryForPage(Query, Class)并没有转义斜线,所以自然的解决方案是使用上面链接中建议的 QueryParser.escape(searchTerm) 。

但是,这将添加一个反斜杠来转义斜杠,并且该反斜杠将被 SolrTemplate 转义,从而导致查询中出现转义的反斜杠 - 这不会给出任何结果


为了清楚起见,我将添加几个示例:

查询没有任何转义:

q=paths:/myrootpath&start=0&rows=10

使用手动转义斜线进行查询(QueryParser.escape(String)):

q=paths:\\/myrootpath&start=0&rows=10

我需要的查询:

q=paths:\/myrootpath&start=0&rows=10


我不确定这是一个错误还是有意为之,因为据我所知,pre-4.0-solr 不需要转义斜杠

那么 spring-data-solr 中是否有方法可以禁用查询的字符转义,或者修改哪些字符被转义?

4

1 回答 1

1

我喜欢转换器的想法。我们可以添加新的类 ContentPath:

@AllArgsConstructor
@ToString
@Getter
public class ContentPath {
    private String path;
}

然后在创建 SolrTemplate 时需要注册新的转换器:

SolrTemplate solrTemplate = ...
DefaultQueryParser defaultQueryParser = new DefaultQueryParser();
defaultQueryParser.registerConverter(new Converter<ContentPath, String>() {

    @Override
    public String convert(ContentPath o) {
        return escape(o.getPath());
    }

});
solrTemplate.registerQueryParser(Query.class, defaultQueryParser);

查询定义时需要进行最后一次更改:

new SimpleQuery((new Criteria(IDENTIFIER)).is(new ContentPath(id)));
于 2016-06-21T10:50:37.023 回答