Spring Data Solr - 由 OR 分隔的多个 FilterQueries

Posted

技术标签:

【中文标题】Spring Data Solr - 由 OR 分隔的多个 FilterQueries【英文标题】:Spring Data Solr - Multiple FilterQueries separated by OR 【发布时间】:2016-08-09 06:19:01 【问题描述】:

我正在尝试使用 spring data solr 实现过滤器搜索。我有以下过滤器类型,并且都有一组过滤器。

    一个 在 (1,2,3) 中的 aa ab 介于 (2016-08-02 TO 2016-08-10) 乙 ba in (2,3,4) bb 介于 (550 TO 1000)

我想使用 Spring data solr 实现的 Solr 查询是:

q=*:*&fq=(type:A AND aa:(1,2,3) AND ab:[2016-08-02 TO 2016-08-10]) OR (type:B AND ba:(2,3,4) AND bb:[550 TO 1000])

我不知道如何对一种过滤器类型的多个子句进行分组,然后使用 OR 运算符。

提前致谢。

【问题讨论】:

【参考方案1】:

诀窍是通过 setPartIsOr(true) 以 OR-ish 的性质标记第二个 Criteria。此方法返回 void,因此无法链接。

首先 aCriteria 和 bCriteria 的定义如前所述。然后 bCriteria 被标记为 OR-ish。然后将两者都添加到SimpleFilterQuery。这又可以添加到实际的Query。这在示例中被忽略了。

最后的DefaultQueryParser 仅用于生成String,可以在断言中使用它来检查查询是否按需要生成。

import org.junit.jupiter.api.Test;
import org.springframework.data.solr.core.DefaultQueryParser;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.FilterQuery;
import org.springframework.data.solr.core.query.SimpleFilterQuery;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class CriteriaTest 

  @Test
  public void generateQuery() 
    Criteria aCriteria = 
        new Criteria("type").is("A")
            .connect().and("aa").in(1,2,3)
            .connect().and("ab").between("2016-08-02", "2016-08-10");
    Criteria bCriteria = 
        new Criteria("type").is("B")
            .connect().and("ba").in(2,3,4)
            .connect().and("bb").between("550", "1000");

    bCriteria.setPartIsOr(true); // that is the magic

    FilterQuery filterQuery = new SimpleFilterQuery();
    filterQuery.addCriteria(aCriteria);
    filterQuery.addCriteria(bCriteria);

    // verify the generated query string
    DefaultQueryParser dqp = new DefaultQueryParser(null);
    String actualQuery = dqp.getQueryString(filterQuery, null);
    String expectedQuery = 
        "(type:A AND aa:(1 2 3) AND ab:[2016\\-08\\-02 TO 2016\\-08\\-10]) OR " 
        + "((type:B AND ba:(2 3 4) AND bb:[550 TO 1000]))";
    System.out.println(actualQuery);
    assertEquals(expectedQuery, actualQuery);
  

【讨论】:

以上是关于Spring Data Solr - 由 OR 分隔的多个 FilterQueries的主要内容,如果未能解决你的问题,请参考以下文章

使用spring-data-solr做solr客户端

Solr和Spring Data Solr

Spring-Data-Solr 如何提供认证数据

使用 Spring-Data-Solr 注入存储库

Solr7.x学习-使用spring-data-solr

spring-data-solr 选用高版本Cannot locate BeanDefinitionParser for element [solr-server]