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

时间:2016-08-09 06:19:01

标签: spring solr spring-data-solr

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

    • aa in(1,2,3)
    • ab介于(2016-08-02至2016-08-10)
    • ba in(2,3,4)
    • bb之间(550至1000)
  1. 我想使用Spring数据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 个答案:

答案 0 :(得分:1)

技巧是通过setPartIsOr(true)标记具有OR-ish性质的第二个条件。此方法返回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); } } 来检查查询是否根据需要生成。

csv