结合多个术语和范围查询的弹性搜索提供零结果

时间:2017-03-29 08:56:32

标签: spring-data-elasticsearch elasticsearch-2.0 elasticsearch-java-api

我现在正在努力这一周。我需要在java中用以下组合编写一个elasticsearch查询api:

  1. 价格范围(0到n个范围)
  2. 年龄范围(0到n个范围)
  3. 搜索文字
  4. 术语过滤器(可以匹配多个字段
  5. 我希望在每个组中都有 OR 关系(例如价格0-10或11-15)但不同组之间的AND关系(例如价格0-10 AND productType =“服装”)< / p>

    我已经用Java编写了下面的代码,我已经验证了我正在测试的范围和过滤器的数据,但是我得到零结果集。我不确定这里缺少什么。

    @Override
    public List<Shoppingi> search(SearchCriteria criteria, Pageable pageable) {
    
        final NativeSearchQueryBuilder searchQuery = new NativeSearchQueryBuilder();
        BoolQueryBuilder boolQuery = boolQuery();
        // apply the text search
        if (StringUtils.isNotBlank(criteria.getSearchText()))
            boolQuery.must(multiMatchQuery(criteria.getSearchText(), FIELD_NAMES_FOR_TERM_SEARCH));
        // apply the term filters
        BoolQueryBuilder termsQuery = boolQuery();
        criteria.getFilters().entrySet().stream().forEach(entry -> termsQuery.should(termsQuery(entry.getKey(), entry.getValue())));
        // apply the range filters
        BoolQueryBuilder rangeQuery = boolQuery();
        criteria.getRangeFilters().forEach((key, value) -> rangeQuery.should(rangeQuery(key).gte(value.getLowerBound()).lt(value.getUpperBound())));
        boolQuery.must(termsQuery);
        boolQuery.must(rangeQuery);
        searchQuery.withQuery(boolQuery);
        searchQuery.withPageable(pageable);
        NativeSearchQuery query = searchQuery.build();
        log.info("query: {}", query.getQuery().toString());
        return elasticsearchTemplate.queryForList(query,Shopping.class);
    }
    

1 个答案:

答案 0 :(得分:1)

我将price对象注释为index.no,这导致查询不起作用。一旦我将数据重新编入索引,价格为非分析,我的代码就开始工作了。所以上面的代码没有错,这是我配置我要查询的变量的方式。