如何在Elasticsearch中查询特定字段多值列表?解决批量查询异常
解决多mainId查询的异常问题
你原来的写法通过循环给bool查询添加大量should子句,会触发Elasticsearch的bool.max_clause_count限制(默认值是1024),当传入的mainIds列表过长时就会抛出异常。
正确的做法是用terms查询,它专门用来匹配字段值在指定列表中的文档,不仅不会触发子句数量限制,性能也比多个should子句更优。
改写后的代码
NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.termsQuery("mainId", mainIds)) .build(); SearchHits<T> searchHits = this.operations.search(searchQuery, this.entityClass, this.operations.getIndexCoordinatesFor(this.entityClass));
如果需要结合其他查询条件
要是还要加额外的过滤或匹配逻辑,可以把terms查询放到bool查询里,比如:
// 构建包含多条件的bool查询 BoolQueryBuilder boolQuery = QueryBuilders.boolQuery() .must(QueryBuilders.termsQuery("mainId", mainIds)) // 匹配指定mainId列表 .must(QueryBuilders.matchQuery("name", "张三")); // 额外的名称匹配条件 NativeSearchQuery searchQuery = new NativeSearchQueryBuilder() .withQuery(boolQuery) .build(); SearchHits<T> searchHits = this.operations.search(searchQuery, this.entityClass, this.operations.getIndexCoordinatesFor(this.entityClass));
内容的提问来源于stack exchange,提问作者Java2Avaj
相关产品推荐
相关产品推荐

