Spring Data Solr - 由 OR 分隔的多个 FilterQueries
Spring Data Solr - Multiple FilterQueries separated by OR
我正在尝试使用 spring 数据 solr 实现过滤器搜索。我有以下过滤器类型,并且都有一组过滤器。
- 一个
- aa 在 (1,2,3)
- ab 介于 (2016-08-02 至 2016-08-10)
- 乙
- ba 在 (2,3,4)
- bb 在(550 到 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 运算符。
提前致谢。
诀窍是通过 setPartIsOr(true)
以 OR-ish 性质标记第二个条件。此方法returns无效,因此无法链接。
首先 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 数据 solr 实现过滤器搜索。我有以下过滤器类型,并且都有一组过滤器。
- 一个
- aa 在 (1,2,3)
- ab 介于 (2016-08-02 至 2016-08-10)
- 乙
- ba 在 (2,3,4)
- bb 在(550 到 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 运算符。
提前致谢。
诀窍是通过 setPartIsOr(true)
以 OR-ish 性质标记第二个条件。此方法returns无效,因此无法链接。
首先 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);
}
}