我们在模式中存储一个路径,以斜杠分隔,并且它也以斜杠开头。根据this post的说法,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我不确定这是一个bug还是故意的,因为据我所知,4.0-solr之前的版本不需要转义斜杠
那么在spring-data-solr中有没有办法禁用查询的字符转义,或者修改哪些字符转义呢?
发布于 2016-06-21 18:50:37
我喜欢使用转换器的想法。我们可以添加新的类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)));https://stackoverflow.com/questions/23386925
复制相似问题