结合多个术语和范围查询的弹性搜索提供零结果
elastic search combining multiple term and range queries is providing zero results
我为此苦苦挣扎了一个星期。我需要使用以下组合在 java 中编写弹性搜索查询 api:
- 价格范围(0 到 n 个范围)
- 年龄范围(0 到 n 个范围)
- 搜索文字
- 术语过滤器(可以匹配多个字段
我想在每个组内有 OR 关系(例如价格 0-10 或 11-15)但不同组之间有 AND 关系(例如价格 0-10 AND productType= "clothing")
我在 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);
}
我将价格对象注释为index.no,这导致查询无法正常工作。一旦我用 non_analyzed 的价格重新索引我的数据,我的代码就开始工作了。所以上面的代码没有错,这是我配置我查询的变量的方式。
我为此苦苦挣扎了一个星期。我需要使用以下组合在 java 中编写弹性搜索查询 api:
- 价格范围(0 到 n 个范围)
- 年龄范围(0 到 n 个范围)
- 搜索文字
- 术语过滤器(可以匹配多个字段
我想在每个组内有 OR 关系(例如价格 0-10 或 11-15)但不同组之间有 AND 关系(例如价格 0-10 AND productType= "clothing")
我在 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);
}
我将价格对象注释为index.no,这导致查询无法正常工作。一旦我用 non_analyzed 的价格重新索引我的数据,我的代码就开始工作了。所以上面的代码没有错,这是我配置我查询的变量的方式。