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

标签 spring solr spring-data-solr

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

  • 一种
  • aa in (1,2,3)
  • ab (2016-08-02 至 2016-08-10)

  • ba in (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 性质。此方法返回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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38843422/

    相关文章:

    configuration - 我应该如何配置我的 Solr filterCache、firstSearcher 和 newSearcher?

    lucene - Solr排序性能问题

    Python、solr 海量查询 : need some suggestions

    java - 具有动态字段的 Spring Data Solr 不起作用

    java - 为什么 Spring 的 jdbcTemplate.batchUpdate() 这么慢?

    java - Spring MVC Controller 中的处理模型

    java - 带有弹出登录模式的自定义登录页面 Spring Security

    Spring @Autowire 多个对象

    java - 如何使用返回所有文档的 spring-data-solr 构建 FacetQuery (* :*) from solr index

    java - spring-data-solr 创建了错误的 url。两次添加核心名称