以下是一个示例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 Elasticsearch 多关键字范围搜索工具类

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

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