以下是一个示例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方法,并处理返回的响应

Java根据多个关键字来查询es的数据并支持范围搜索来个工具类

原文地址: https://www.cveoy.top/t/topic/fGpK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录