Spring Data Solr:使用显式复合id作为路由键时检索文档

时间:2016-10-13 20:01:52

标签: solr spring-data-solr

我有一个复合id,它是一个字符串,由一个实体的租户和id组成,用“!”分隔。 (例如说“tenant!id”)。

我发送此复合Id作为查询方法findOne(ID compositeId)的输入,但在执行时,QueryParserBase类中的BasePredicateProcessor正在转换“!”到“\!”,它打破了发送给Solr的路由密钥。因此,Solr无法使用crudrepository.findOne()方法检索实体。

有没有办法避免转换“!”到“\!”,还是有另一种方法来实现同样的目标?

1 个答案:

答案 0 :(得分:0)

这不是总答案,而是关于可能方法的建议。

我不知道具体细节,但您可以更改用于解析传入查询的内容(可能是solrconfig.xml)。我不知道哪些可用的"处理器"会做你想做的事情 - 或者如果一个人甚至可以用这种特定的行为,因为我认为你仍然会想要其他的好处"由BasePredicateProcessor提供。看下一个可能性......

另一种方法是扩展BasePredicateProcessor并使用你的扩展类(再次,可能是solrconfig.xml)你的修改后的代码将离开"!"单独。第二个选项需要编码。

第三个选项是查看是否存在"转义序列"您可以使用它来修改查询字符串,然后再将其发送到Solr ...类似于"逃脱转义"。我不知道这是否可能。但值得研究。

#3

的一些可能有用的链接

http://lucene.472066.n3.nabble.com/How-do-you-query-for-a-string-containing-a-colon-td481672.html

https://lucene.apache.org/core/2_9_4/queryparsersyntax.html

从第二个链接:

Lucene支持转义属于查询语法的特殊字符。当前列表的特殊字符是

    • &安培;&安培; || ! (){} [] ^" 〜*? :\

要逃避这些角色,请在角色前使用\。例如,要搜索(1 + 1):2,请使用查询:

\(1 \ 1 \):2