Spring Data生成Solr查询异常问题求助
为什么移除AND后Solr查询才正常?
这事儿核心原因是布尔运算符的优先级,再加上Spring Data Solr构建查询时的条件组合逻辑没按你预期的来!我给你拆解清楚:
1. Solr的布尔运算符优先级规则
Solr里的布尔运算符优先级是 AND > OR —— 也就是说,在没有括号的情况下,Solr会先处理所有AND连接的条件,再处理OR条件。这和我们日常写代码的逻辑优先级一致,但很容易在组合查询时踩坑。
2. 原查询的实际逻辑(为什么没结果)
你用Spring Data生成的原查询:
http://localhost:8983/solr/pride_projects/select?q=accession:*PXD*+OR+accession:*PRD*+AND+publication_date:[2012\-12\-31T00\:00\:00.000Z+TO+2012\-12\-31T00\:00\:00.000Z]
被Solr解析成了:
accession:*PXD* OR (accession:*PRD* AND publication_date:[2012-12-31T00:00:00.000Z TO 2012-12-31T00:00:00.000Z])
这个逻辑的意思是:要么找accession以PXD开头的所有项目,要么找accession以PRD开头且publication_date是指定日期的项目。
之所以没返回结果,大概率是这两种情况都不满足:
- 所有PXD开头的项目的
publication_date都不是你指定的2012-12-31(比如你返回的PXD000002的submission_date是2012-01-02,可能它的publication_date也不是目标日期) - 同时也没有PRD开头且publication_date符合的项目
3. 手动修改后的查询逻辑(为什么有结果)
你移除AND后的查询:
http://localhost:8983/solr/pride_projects/select?q=accession:*PXD*+OR+accession:*PRD*+publication_date:[2012\-12\-31T00\:00\:00.000Z+TO+2012\-12\-31T00\:00\:00.000Z]
Solr里多个查询项之间的空格默认等价于AND,这个写法刚好被Solr解析成了你真正想要的逻辑:
(accession:*PXD* OR accession:*PRD*) AND publication_date:[2012-12-31T00:00:00.000Z TO 2012-12-31T00:00:00.000Z]
也就是:找accession以PXD或PRD开头,并且publication_date是指定日期的项目。这时候PXD000002的publication_date应该刚好符合这个日期,所以被返回了。
4. 怎么用Spring Data Solr正确构建预期查询
要避免这种优先级坑,你需要手动给OR条件分组,把它作为一个整体再和日期条件做AND。代码示例:
// 先构建OR组合的条件:accession以PXD开头 或 以PRD开头 Criteria accessionOrCriteria = Criteria.where("accession").matches("*PXD*") .or("accession").matches("*PRD*"); // 将OR条件和日期条件组合:(OR条件) AND publication_date在指定范围 Criteria finalCriteria = new Criteria().and(accessionOrCriteria) .and("publication_date").between(startDate, endDate); // 生成查询 Query solrQuery = new SimpleQuery(finalCriteria);
这样生成的Solr查询会自动带上括号,确保OR条件先被处理,完全符合你的预期逻辑。
内容的提问来源于stack exchange,提问作者ypriverol
相关产品推荐
相关产品推荐

