Java根据多个关键字来查询es的数据并支持范围搜索来个工具类
以下是一个示例Java工具类,用于根据多个关键字和范围搜索查询Elasticsearch数据:
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import java.util.Map;
public class ElasticsearchQueryBuilder {
public static SearchSourceBuilder buildQuery(Map<String, Object> filters) {
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
for (Map.Entry<String, Object> entry : filters.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
if (value != null) {
if (value instanceof String) {
boolQuery.must(QueryBuilders.matchQuery(key, value));
} else if (value instanceof Integer || value instanceof Long || value instanceof Float || value instanceof Double) {
boolQuery.must(QueryBuilders.termQuery(key, value));
} else if (value instanceof Map) {
Map<String, Object> range = (Map<String, Object>) value;
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery(key);
if (range.containsKey("gte")) {
rangeQuery.gte(range.get("gte"));
}
if (range.containsKey("gt")) {
rangeQuery.gt(range.get("gt"));
}
if (range.containsKey("lte")) {
rangeQuery.lte(range.get("lte"));
}
if (range.containsKey("lt")) {
rangeQuery.lt(range.get("lt"));
}
boolQuery.must(rangeQuery);
}
}
}
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(boolQuery);
return searchSourceBuilder;
}
}
使用示例:
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class ElasticsearchSearch {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient();
Map<String, Object> filters = new HashMap<>();
filters.put("name", "John");
filters.put("age", 30);
Map<String, Object> range = new HashMap<>();
range.put("gte", 20);
range.put("lte", 40);
filters.put("salary", range);
SearchSourceBuilder searchSourceBuilder = ElasticsearchQueryBuilder.buildQuery(filters);
SearchResponse searchResponse = client.search(searchSourceBuilder, RequestOptions.DEFAULT);
// Do something with searchResponse
client.close();
}
}
在上面的示例中,我们创建了一个Map对象来存储查询条件。该对象包含三个键值对,分别为名称为John的记录、年龄为30的记录以及薪水在20到40之间的记录。然后,我们使用ElasticsearchQueryBuilder类的buildQuery方法构建查询,将其传递给Elasticsearch客户端的search方法,并处理返回的响应
原文地址: https://www.cveoy.top/t/topic/fGpK 著作权归作者所有。请勿转载和采集!