`
kfcman
  • 浏览: 400859 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

elasticsearch通用API,多数据源,分组

 
阅读更多

公司项目大规模使用elasticsearch,封装了统一的elasticsearchAPI,比较通用,支持多数据源和多层分组查询,可以组合类似MySQL的复杂查询

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
       default-autowire="byName">

    <bean id="cateEsClientFactory" class="com.jd.pop.odp.util.esdb.EsClientFactory">
        <constructor-arg name="clusterName" value="${pop-odp.cate.es.cluster}"/>
        <constructor-arg name="ips">
            <value>${pop-odp.cate.es.ips}</value>
        </constructor-arg>
        <constructor-arg name="esPort" value="${pop-odp.cate.es.port}"/>
    </bean>
    <bean id="realTimeEsClientFactory" class="com.jd.pop.odp.util.esdb.EsClientFactory">
        <constructor-arg name="clusterName" value="${pop-odp.realTime.es.cluster}"/>
        <constructor-arg name="ips">
            <value>${pop-odp.realTime.es.ips}</value>
        </constructor-arg>
        <constructor-arg name="esPort" value="${pop-odp.realTime.es.port}"/>
    </bean>

    <bean id="cateEsDao" class="com.jd.pop.es.dao.cate.impl.CateEsDaoImpl">
        <property name="esClientFactory" ref="cateEsClientFactory"/>
    </bean>
    <bean id="realTimeEsDao" class="com.jd.pop.es.dao.realTime.impl.RealTimeEsDaoImpl">
        <property name="esClientFactory" ref="realTimeEsClientFactory"/>
    </bean>
</beans>
import com.google.common.base.Preconditions;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;

public class EsClientFactory {
    private static final Log logger = LogFactory.getLog(EsClientFactory.class);

    // 是否扫描集群
    private static boolean sniff = false;
    // ES 集群名称
    private static String clusterName;
    // IP地址
    private static String[] ips;
    // 端口
    private static int esPort;

    private TransportClient esClient;//ES 客户端对象

    public  EsClientFactory(String clusterName,String[] ips,int esPort) {
        this.clusterName=clusterName;
        this.ips=ips;
        this.esPort=esPort;
        init();
    }

    /**
     * ES 客户端连接初始化
     *
     * @return ES客户端对象
     */
    private void init() {
        Preconditions.checkNotNull(clusterName, "es 服务clusterName未配置");
        Preconditions.checkNotNull(ips, "es 服务ip未配置");
        Preconditions.checkArgument(esPort > 0, "es 服务服务port未配置");
        //设置集群的名字
        Settings settings = ImmutableSettings.settingsBuilder()
                .put("cluster.name", clusterName)
                .put("client.transport.sniff", sniff)
                .build();
        //创建集群client并添加集群节点地址
        esClient = new TransportClient(settings);
        for (String ip : ips) {
            esClient.addTransportAddress(new InetSocketTransportAddress(ip, esPort));
        }
    }

    public TransportClient getEsClient() {
        return esClient;
    }

    public boolean isSniff() {
        return sniff;
    }

    public String getClusterName() {
        return clusterName;
    }


    public String[] getIps() {
        return ips;
    }


    public int getEsPort() {
        return esPort;
    }

}
public class CateEsDaoImpl extends EsDbUtils implements CateEsDao {
    @Override
    public List<CateVenderData> queryListByFilterQuery(EsQueryObj esQueryObj) throws Exception {
        return (List<CateVenderData>)queryObjectListByFilterQuery(esQueryObj,CateVenderData.class);
    }

    @Override
    public List<CateVenderData> queryListByFilterQueryWithAgg(EsQueryObj esQueryObj) throws Exception {
        return (List<CateVenderData>)queryObjectListByFilterQueryWithAgg(esQueryObj,CateVenderData.class);
    }
}


public class RealTimeEsDaoImpl extends EsDbUtils implements RealTimeEsDao  {
    @Override
    public List<OdpOperatorSum> queryListByFilterQuery(EsQueryObj esQueryObj) throws Exception {
        return (List<OdpOperatorSum>)queryObjectListByFilterQuery(esQueryObj,OdpOperatorSum.class);
    }

    @Override
    public List<OdpOperatorSum> queryListByFilterQueryWithAgg(EsQueryObj esQueryObj) throws Exception {
        return (List<OdpOperatorSum>)queryObjectListByFilterQueryWithAgg(esQueryObj,OdpOperatorSum.class);
    }
}
import com.google.gson.Gson;
import org.apache.commons.beanutils.PropertyUtils;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;
import org.elasticsearch.search.aggregations.metrics.avg.Avg;
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
import org.elasticsearch.search.sort.SortOrder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.*;

/**
 * Created with IntelliJ IDEA.
 * User: supeidong
 * Date: 2016/3/16
 * Time: 13:37
 * To change this template use File | Settings | File Templates.
 */
public class EsDbUtils <T>{
    private static final Logger logger = LoggerFactory.getLogger(EsDbUtils.class);
    private static final int FromIndex = 0;
    private static final int MinSize = 100;
    private static final int MaxSize = 100000;
    private static final int GroupMinSize = 100;
    private static final int GroupMaxSize = 500;
    private EsClientFactory esClientFactory;//ES 客户端工厂类

    /**
     * 根据过滤条件查询出数据列表.需要传递索引和表名
     * @param esQueryObj ES查询对象
     * @param targetClass ES结果需要转换的类型
     * @return
     */
    public List<? extends Object> queryObjectListByFilterQuery(EsQueryObj esQueryObj,Class targetClass) throws Exception {
        validationEsQuery(esQueryObj);
        List<Object> esRecords = new ArrayList<Object>();
        long startCountTime = System.currentTimeMillis();
        //创建ES查询Request对象
        SearchRequestBuilder esSearch= esClientFactory.getEsClient().prepareSearch(esQueryObj.getIndexName());
        esSearch.setTypes(esQueryObj.getTypeName())
                .setSearchType(SearchType.QUERY_THEN_FETCH)
                .setFrom((esQueryObj.getFromIndex() > 0) ? esQueryObj.getFromIndex() : FromIndex)
                .setSize((0 <esQueryObj.getSize() && esQueryObj.getSize() <= MaxSize) ? esQueryObj.getSize() : MinSize);
        //添加查询条件
        if(esQueryObj.getAndFilterBuilder()!=null){
            esSearch.setQuery(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), esQueryObj.getAndFilterBuilder()));
        }
        //添加多级排序
        if(esQueryObj.getSortField()!=null) {
            for (Map.Entry<String, SortOrder> entry : esQueryObj.getSortField().entrySet()) {
                esSearch.addSort(entry.getKey(), entry.getValue());
            }
        }
        //执行查询
        SearchResponse response =esSearch .execute().actionGet();
        for (SearchHit hit : response.getHits()) {
            Object t = mapResult(hit.sourceAsMap(), targetClass);
            esRecords.add(t);
        }
        logger.info("queryObjectListByFilterQuery search " + response.getHits().getTotalHits() + " data ,esQueryObj=" + new Gson().toJson(esQueryObj)+"-----------------------------------------! use " + (System.currentTimeMillis() - startCountTime) + " ms.");
        return esRecords;
    }

    /**
     * 根据过滤条件和分组键SUM/AVG键获取分组结果(目前分组结果不支持LIMIT操作)
     * @param esQueryObj ES查询对象
     * @param targetClass ES结果需要转换的类型
     * @return
     * @throws Exception
     */
    public List<? extends Object> queryObjectListByFilterQueryWithAgg(EsQueryObj esQueryObj,Class targetClass) throws Exception {
        validationEsGroupQuery(esQueryObj);
        List<Object> esRecords = new ArrayList<Object>();
        long startCountTime = System.currentTimeMillis();
        if( esQueryObj.getSumFields()==null){
            esQueryObj.setSumFields(new ArrayList<String>());
        }
        if(esQueryObj.getAvgFields()==null){
            esQueryObj.setAvgFields(new ArrayList<String>());
        }
        TermsBuilder agg = getEsAgg(esQueryObj);
        //创建ES查询Request对象
        SearchRequestBuilder esSearch= esClientFactory.getEsClient().prepareSearch(esQueryObj.getIndexName());
        esSearch.setTypes(esQueryObj.getTypeName())
                .setSearchType(SearchType.QUERY_THEN_FETCH)
                .addAggregation(agg);
        //添加查询条件
        if(esQueryObj.getAndFilterBuilder()!=null){
            esSearch.setQuery(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), esQueryObj.getAndFilterBuilder()));
        }
        //添加多级排序
        if(esQueryObj.getSortField()!=null) {
            for (Map.Entry<String, SortOrder> entry : esQueryObj.getSortField().entrySet()) {
                esSearch.addSort(entry.getKey(), entry.getValue());
            }
        }
        //执行查询
        SearchResponse response =esSearch .execute().actionGet();
        List<Map<String, Object>> aggMaps= getAggMap(response,esQueryObj.getGroupFields(), esQueryObj.getSumFields(), esQueryObj.getAvgFields());
        for(Map<String, Object> aggMap : aggMaps){
            Object t = mapResult(aggMap, targetClass);
            esRecords.add(t);
        }
        logger.info("queryObjectListByFilterQuery search " + response.getHits().getTotalHits() + " data,esQueryObj=" + new Gson().toJson(esQueryObj)+"-----------------------------------------! use " + (System.currentTimeMillis() - startCountTime) + " ms.");
        return esRecords;
    }
    /**
     * 根据分组键和SUM/AVG键组合AGG条件
     * @param esQueryObj
     * @return
     */
    private TermsBuilder getEsAgg(EsQueryObj esQueryObj) throws Exception{
        List<String> groupFields= esQueryObj.getGroupFields();
        List<String> sumFields= esQueryObj.getSumFields();
        List<String> avgFields= esQueryObj.getAvgFields();
        int groupSize=esQueryObj.getGroupSize();
        Map<String, SortOrder> groupSortMap=esQueryObj.getGroupSortField();
        TermsBuilder termsBuilder = AggregationBuilders.terms(groupFields.get(0)).field(groupFields.get(0));
        if (groupFields.size() == 1) {
            //设置排序后最后一层的结果数目
            termsBuilder.size((0 <groupSize && groupSize <= GroupMaxSize) ? groupSize : GroupMinSize);
            //添加group排序字段
            if(groupSortMap!=null) {
                List<Terms.Order> termsOrders=new ArrayList<Terms.Order>();
                for (Map.Entry<String, SortOrder> entry : groupSortMap.entrySet()) {
                    if(entry.getValue().equals(SortOrder.ASC)){
                        termsOrders.add(Terms.Order.aggregation(entry.getKey(),true));
                    }else{
                        termsOrders.add(Terms.Order.aggregation(entry.getKey(), false));
                    }
                }
                termsBuilder.order(Terms.Order.compound(termsOrders));
            }
            for (String avgField : avgFields) {
                termsBuilder.subAggregation(AggregationBuilders.avg(avgField).field(avgField));
            }
            for (String sumField : sumFields) {
                termsBuilder.subAggregation(AggregationBuilders.sum(sumField).field(sumField));
            }
        } else {
            termsBuilder.subAggregation(getChildTermsBuilder(groupFields, 1, sumFields, avgFields,groupSize,groupSortMap));
            //设置最外层分组量
            termsBuilder.size(GroupMaxSize);
        }
        return termsBuilder;
    }

    /**
     * 通过递归的方式获取bucket agg分组语句
     * @param groupFields
     * @param i
     * @param sumFields
     * @param avgFields
     * @return
     */
    private  TermsBuilder getChildTermsBuilder(List<String> groupFields,int i,List<String> sumFields, List<String> avgFields,int groupSize,Map<String, SortOrder> groupSortMap){
        if(i+1==groupFields.size()){
            TermsBuilder termsBuilderLast = AggregationBuilders.terms(groupFields.get(i)).field(groupFields.get(i));
            //设置排序后最后一层的结果数目
            termsBuilderLast.size((0 <groupSize && groupSize <= GroupMaxSize) ? groupSize : GroupMinSize);
            //添加group排序字段
            if(groupSortMap!=null) {
                for (Map.Entry<String, SortOrder> entry : groupSortMap.entrySet()) {
                    if(entry.getValue().equals(SortOrder.ASC)){
                        termsBuilderLast.order(Terms.Order.aggregation(entry.getKey(),true));
                    }else{
                        termsBuilderLast.order(Terms.Order.aggregation(entry.getKey(),false));
                    }

                }
            }
            for (String avgField : avgFields) {
                termsBuilderLast.subAggregation(AggregationBuilders.avg(avgField).field(avgField));
            }
            for (String sumField : sumFields) {
                termsBuilderLast.subAggregation(AggregationBuilders.sum(sumField).field(sumField));
            }
            return termsBuilderLast;
        }
        else{
            TermsBuilder termsBuilder= AggregationBuilders.terms(groupFields.get(i)).field(groupFields.get(i));
            //设置最外层分组量
            termsBuilder.size(GroupMaxSize);
            return  termsBuilder.subAggregation(getChildTermsBuilder(groupFields,i+1,sumFields,avgFields,groupSize,groupSortMap));
        }
    }

    /**
     * 根据汇总键和SUM/AVG键,组合返回的查询值为MAP格式
     * @param response
     * @param groupFields
     * @param sumFields
     * @param avgFields
     * @return
     */
    private   List<Map<String, Object>>  getAggMap(SearchResponse response,List <String>groupFields,List<String> sumFields, List<String> avgFields){

        List<Map<String, Object>> aggMaps = new ArrayList<Map<String, Object>>();
        //首先获取最外层的AGG结果
        Terms tempAggregation = response.getAggregations().get(groupFields.get(0));
        //只有一个分组键不用进行递归
        if(groupFields.size()==1){
            for(Terms.Bucket tempBk:tempAggregation.getBuckets()){
                Map<String, Object> tempMap = new HashMap<String, Object>();
                tempMap.put(tempAggregation.getName(), tempBk.getKey());
                for (Map.Entry<String, Aggregation> entry : tempBk.getAggregations().getAsMap().entrySet()) {
                    String key = entry.getKey();
                    if (sumFields.contains(key)) {
                        Sum aggSum = (Sum) entry.getValue();
                        double value = aggSum.getValue();
                        tempMap.put(key, value);
                    }
                    if (avgFields.contains(key)) {
                        Avg aggAvg = (Avg) entry.getValue();
                        double value = aggAvg.getValue();
                        tempMap.put(key, value);
                    }
                }
                aggMaps.add(tempMap);
            }
        }
        else {
            for (Terms.Bucket bk : tempAggregation.getBuckets()) {
                //每个最外层的分组键生成一个键值对MAP
                Map<String, Object> nkMap = new HashMap<String, Object>();
                nkMap.put(tempAggregation.getName(), bk.getKey());
                //通过递归的方式填充键值对MAP并加到最终的列表中
                getChildAggMap(bk, 1, groupFields, sumFields, avgFields, nkMap, aggMaps);
            }
        }
        return aggMaps;
    }

    /**
     * 深层递归所有的AGG返回值,组合成最终的MAP列表
     * @param bk 每次递归的单个Bucket
     * @param i 控制分组键列表到了哪一层
     * @param groupFields 分组键列表
     * @param sumFields SUM键列表
     * @param avgFields AVG键列表
     * @param nkMap 键值对MAP
     * @param aggMaps 最终结果的中间值
     * @return
     */
    private  List<Map<String, Object>> getChildAggMap(Terms.Bucket bk,int i,List <String>groupFields,List<String> sumFields, List<String> avgFields,Map<String, Object> nkMap,List<Map<String, Object>> aggMaps){

        if(i==groupFields.size()-1){
            Terms tempAggregation = bk.getAggregations().get(groupFields.get(i));
            for(Terms.Bucket tempBk:tempAggregation.getBuckets()){
                Map<String, Object> tempMap = new HashMap<String, Object>();
                tempMap.putAll(nkMap);
                tempMap.put(tempAggregation.getName(), tempBk.getKey());
                for (Map.Entry<String, Aggregation> entry : tempBk.getAggregations().getAsMap().entrySet()) {
                    String key = entry.getKey();
                    if (sumFields.contains(key)) {
                        Sum aggSum = (Sum) entry.getValue();
                        double value = aggSum.getValue();
                        tempMap.put(key, value);
                    }
                    if (avgFields.contains(key)) {
                        Avg aggAvg = (Avg) entry.getValue();
                        double value = aggAvg.getValue();
                        tempMap.put(key, value);
                    }
                }
                aggMaps.add(tempMap);
            }
            return  aggMaps;
        } else{
            Terms tempAggregation = bk.getAggregations().get(groupFields.get(i));
            for(Terms.Bucket tempBk:tempAggregation.getBuckets()){
                nkMap.put(tempAggregation.getName(), tempBk.getKey());
                getChildAggMap(tempBk, i + 1, groupFields, sumFields, avgFields, nkMap, aggMaps);
            }
            return  aggMaps;
        }
    }

    /**
     * 将ES结果映射到指定对象
     * @param resultMap
     * @param cls
     * @return
     * @throws Exception
     */
    public T mapResult(Map<String, Object> resultMap, Class<T> cls) throws  Exception{
        T result = cls.newInstance();
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            Object object = resultMap.get(field.getName());
            if (object != null) {
                //根据几种基本类型做转换
                if (field.getType().equals(Long.class) || field.getType().equals(long.class)) {
                    if(object.toString().indexOf('.')>0){
                        PropertyUtils.setProperty(result, field.getName(), Long.parseLong(object.toString().substring(0, object.toString().indexOf('.'))));
                    }else{
                        PropertyUtils.setProperty(result, field.getName(), Long.parseLong(object.toString()));
                    }
                }else if (field.getType().equals(long.class) || field.getType().equals(long.class)) {
                    if(object.toString().indexOf('.')>0){
                        PropertyUtils.setProperty(result, field.getName(), Long.parseLong(object.toString().substring(0, object.toString().indexOf('.'))));
                    }else{
                        PropertyUtils.setProperty(result, field.getName(), Long.parseLong(object.toString()));
                    }
                }else if (field.getType().equals(Integer.class) || field.getType().equals(Integer.class)) {
                    if(object.toString().indexOf('.')>0){
                        PropertyUtils.setProperty(result, field.getName(), Integer.parseInt(object.toString().substring(0, object.toString().indexOf('.'))));
                    }else{
                        PropertyUtils.setProperty(result, field.getName(), Integer.parseInt(object.toString()));
                    }
                }else if (field.getType().equals(int.class) || field.getType().equals(int.class)) {
                    if(object.toString().indexOf('.')>0){
                        PropertyUtils.setProperty(result, field.getName(), Integer.parseInt(object.toString().substring(0, object.toString().indexOf('.'))));
                    }else{
                        PropertyUtils.setProperty(result, field.getName(), Integer.parseInt(object.toString()));
                    }

                }else if (field.getType().equals(BigDecimal.class) || field.getType().equals(BigDecimal.class)) {
                    PropertyUtils.setProperty(result, field.getName(), BigDecimal.valueOf(Double.parseDouble(object.toString())));
                }else if (field.getType().equals(Double.class) || field.getType().equals(Double.class)) {
                    PropertyUtils.setProperty(result, field.getName(), Double.parseDouble(object.toString()));
                }else if (field.getType().equals(double.class) || field.getType().equals(double.class)) {
                    PropertyUtils.setProperty(result, field.getName(), Double.parseDouble(object.toString()));
                }else if (field.getType().equals(Date.class) || field.getType().equals(Date.class)) {
                    PropertyUtils.setProperty(result, field.getName(), DateUtil.createDate(object.toString()));
                }else if (field.getType().equals(String.class) || field.getType().equals(String.class)) {
                    PropertyUtils.setProperty(result, field.getName(), object);
                }
            }
        }
        return result;
    }

    /**
     * 验证ES查询对象
     * @param esQueryObj
     * @throws Exception
     */
    private void validationEsQuery(EsQueryObj esQueryObj) throws Exception{
        if(StringUtils.isEmpty(esQueryObj.getIndexName())&&StringUtils.isEmpty(esQueryObj.getTypeName())){
            throw  new Exception("please check indexName and typeName");
        }
    }
    /**
     * 验证ES查询分组对象
     * @param esQueryObj
     * @throws Exception
     */
    private void validationEsGroupQuery(EsQueryObj esQueryObj) throws Exception{
        if(StringUtils.isEmpty(esQueryObj.getIndexName())&&StringUtils.isEmpty(esQueryObj.getTypeName())){
            throw  new Exception("please check indexName and typeName");
        }
        boolean groupOrderStatus=true;
        st:for (Map.Entry<String, SortOrder> entry : esQueryObj.getGroupSortField().entrySet()) {
            if(!esQueryObj.getSumFields().contains(entry.getKey())&&!esQueryObj.getAvgFields().contains(entry.getKey())){
                groupOrderStatus=false;
                break st;
            }
        }
        if(!groupOrderStatus){
            throw  new Exception("please check groupSortField");
        }
        if (esQueryObj.getGroupFields().isEmpty() || esQueryObj.getGroupFields().size() <= 0 ||(esQueryObj.getSumFields().isEmpty()&&esQueryObj.getAvgFields().isEmpty())) {
            throw  new Exception("please check groupFields and sumFields and avgFields");
        }
    }
    public EsClientFactory getEsClientFactory() {
        return esClientFactory;
    }

    public void setEsClientFactory(EsClientFactory esClientFactory) {
        this.esClientFactory = esClientFactory;
    }
}
import org.elasticsearch.index.query.AndFilterBuilder;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.search.sort.SortOrder;

import java.util.List;
import java.util.Map;

public class EsQueryObj {
    /**
     * ES索引名
     */
    String indexName;
    /**
     * ES TYPE名(表名)
     */
    String typeName;
    /**
     * 查询条件组合,类似于 "boolQuery().must( QueryBuilders.termQuery("opTime", "2016-03-30")).must(QueryBuilders.termQuery("operErpID", "xingkai"))"
     */
    BoolQueryBuilder bq;
    /**
     * 查询条件组合,类似于 "boolQuery().must( QueryBuilders.termQuery("opTime", "2016-03-30")).must(QueryBuilders.termQuery("operErpID", "xingkai"))"
     */
    AndFilterBuilder andFilterBuilder;
    /**
     * 分组键值列表,类似于group by 之后的字段
     */
    List <String> groupFields;
    /**
     * 分组SUM键值列表
     */
    List <String> sumFields;
    /**
     * 分组AVG键值列表
     */
    List <String> avgFields;
    /**
     * 排序字段键值对,可以添加多个,类似于("opTime","DESC")
     */
    Map<String,SortOrder> sortField;
    /**
     * 分组后排序字段键值对,可以添加多个,类似于("opTime","DESC"),注意此处最后PUT的键最先排序,排序键必须在sumFields或avgFields(只针对最后一层分组)
     */
    Map<String,SortOrder> groupSortField;
    /**
     * 分组后返回数据数量,默认为100,最大不能超过500(只针对最后一层分组)
     */
    int groupSize;
    /**
     * 取值的起始位置,默认为0
     */
    int fromIndex;
    /**
     * 返回数据数量,默认为100,最大不能超过100000
     */
    int size;

    public String getIndexName() {
        return indexName;
    }

    public void setIndexName(String indexName) {
        this.indexName = indexName;
    }

    public String getTypeName() {
        return typeName;
    }

    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }

    public BoolQueryBuilder getBq() {
        return bq;
    }

    public void setBq(BoolQueryBuilder bq) {
        this.bq = bq;
    }

    public AndFilterBuilder getAndFilterBuilder() {
        return andFilterBuilder;
    }

    public void setAndFilterBuilder(AndFilterBuilder andFilterBuilder) {
        this.andFilterBuilder = andFilterBuilder;
    }

    public List<String> getGroupFields() {
        return groupFields;
    }

    public void setGroupFields(List<String> groupFields) {
        this.groupFields = groupFields;
    }

    public List<String> getSumFields() {
        return sumFields;
    }

    public void setSumFields(List<String> sumFields) {
        this.sumFields = sumFields;
    }

    public List<String> getAvgFields() {
        return avgFields;
    }

    public void setAvgFields(List<String> avgFields) {
        this.avgFields = avgFields;
    }

    public Map<String, SortOrder> getSortField() {
        return sortField;
    }

    public void setSortField(Map<String, SortOrder> sortField) {
        this.sortField = sortField;
    }

    public int getFromIndex() {
        return fromIndex;
    }

    public void setFromIndex(int fromIndex) {
        this.fromIndex = fromIndex;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public Map<String, SortOrder> getGroupSortField() {
        return groupSortField;
    }

    public void setGroupSortField(Map<String, SortOrder> groupSortField) {
        this.groupSortField = groupSortField;
    }

    public int getGroupSize() {
        return groupSize;
    }

    public void setGroupSize(int groupSize) {
        this.groupSize = groupSize;
    }
}
分享到:
评论

相关推荐

    elasticsearch-hadoop-5.2.1

    3. **Spark集成**:Elasticsearch-Hadoop 5.2.1为Apache Spark提供了丰富的API和转换操作,使得Spark用户能够轻松地将Elasticsearch作为数据源和数据目标。这包括RDD(弹性分布式数据集)和DataFrame API,使得Spark...

    ElasticSearch+Spark 构建高相关性搜索服务,千人千面推荐系统

    这个项目可能包括了数据源的读取脚本、Spark的转换和分析逻辑、Elasticsearch的索引配置以及推荐算法的实现。通过这个项目,开发者可以学习到如何将Elasticsearch和Spark结合,解决实际业务中的搜索和推荐问题。 ...

    es浏览器插件chrome插件

    由于Elasticsearch强大的数据分析能力,结合es-head的可视化功能,用户可以快速理解数据模式,从而做出数据驱动的决策。 总结,"es浏览器插件chrome插件" 指的是用于Elasticsearch的Chrome浏览器扩展,例如es-head...

    ElasticSearch集成.rar

    Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,被广泛应用于日志分析、实时监控、数据挖掘、全文检索等多个领域。这个名为"ElasticSearch集成.rar"的压缩包文件,很可能包含了关于如何将Elastic...

    Elasticsearch V6.3.2 CDC 组件

    在 Elasticsearch 的上下文中,CDC组件允许用户捕获和索引来自其他数据源(如关系型数据库)的实时数据变化。 在Elasticsearch V6.3.2中集成CDC,通常涉及以下几个关键方面: 1. **连接器与适配器**:为了从各种...

    Crabc 低代码接口开发平台,企业级API管理系统

    支持接入(mysql、oracle、postgresql、sqlserver、达梦、TiDB、es)等SQL或/NoSQL数据源, 在编辑框内编写好SQL后即可快速生成Rest接口对外提供服务。支持Mybatis中if等标签语法、数据脱敏、 以及复杂的多SQL执行...

    apiman-gateway-engine-es-1.2.2.Final.zip

    【标题】"apiman-gateway-engine-es-1.2.2.Final.zip" 提供的是一个针对 Elasticsearch 的 apiman 网关引擎版本,该引擎是 apiman 管理框架的一部分,专为服务管理和API管理设计。1.2.2.Final 是这个特定版本的标识...

    elasticsearchwriter的libs包

    ElasticsearchWriter是DataX框架中的一个插件,主要用于将数据从各种数据源高效地导入到Elasticsearch搜索引擎中。这个“elasticsearchwriter的libs包”包含了运行该插件所必需的库文件,确保DataX能够正确执行数据...

    阿里云 专有云企业版 V3.12.0 阿里云Elasticsearch 产品简介(on K8S) 20200619.pdf

    - 数据导入导出:支持从多种数据源导入数据,如日志文件、数据库等,并能导出数据到外部系统。 - 多租户支持:允许多个用户或团队共享资源,同时保持数据隔离。 4. **法律声明**: - 用户需通过阿里云官方渠道...

    计算机课程毕设:基于ElasticSearch+Spark 构建高相关性搜索服务&千人千面推荐系统.zip

    ElasticSearch是一个强大的分布式搜索引擎,而Spark则是一个用于大数据处理的快速、通用且可扩展的开源框架。这个项目不仅适用于毕业设计或课程设计,也适合学习者提升自己的技能。 首先,我们要了解ElasticSearch...

    Simple_API_ElasticSearch

    **文件名称列表:"Simple_API_ElasticSearch-master"** 这个文件名可能代表项目的主分支或源代码库。"master"通常是Git版本控制系统中的默认分支,意味着这是项目的主代码分支,包含了最新的稳定代码。 **详细知识...

    阿里云 专有云企业版 V3.8.0 阿里云Elasticsearch 产品简介 20200330.pdf

    - **数据导入导出**: 支持多种数据源的导入和导出,如CSV、JSON等。 - **Kibana可视化**: 提供图形化的数据分析和仪表板,便于数据洞察。 - **Logstash数据管道**: 整合日志收集、处理和转发流程。 - **Beats轻...

    vue+echarts数据显示通用模板

    通过Vue的生命周期钩子和计算属性,可以轻松地动态更新图表数据,以反映实时变化的数据源。 ECharts是百度开源的一个基于JavaScript的图表库,支持丰富的图表类型,如柱状图、折线图、饼图、散点图等,并且具有良好...

    linux-dvb-api-v4-0-3

    这部分API负责设置解复用器的输入,包括选择输入源、配置解复用参数等。 ##### 6.3 MPEG-2 TS过滤器 MPEG-2 TS过滤器用于从TS流中提取特定PID的数据包。 - **TS解码器馈送**:支持特定TS数据包的解码处理。 - **...

    TransactionService:使用 Spring MVC 和 ElasticSearch 的通用事务记录器和监控

    `TransactionService` 提供了一个通用的解决方案,它结合了Spring MVC的控制层优势和ElasticSearch的强大搜索能力,用于记录和监控事务。这个项目主要关注Java开发,同时也涉及到JavaScript的应用,可能是用于前端...

    基于SpringBoot + SpringCloud+ ElasticSearch+ Logstash开发的在线教育系统.zip

    在这个在线教育系统中,ElasticSearch可能被用于存储、搜索和分析大量的用户行为数据、课程信息、评价等,提供高效的全文搜索功能,使用户能够快速找到他们感兴趣的课程或资源。 4. **Logstash**: Logstash是一个...

    基于深度学习的实战 spring boot 的项目合集(总共包含 65 个集成demo,已经完成 53 个).zip

    JOB、API接口管理测试Swagger、基于RBAC的动态权限认证Security、Session共享SpringSession、结合AOP实现分布式锁Zookeeper、消息队列RabbitMQ和Kafka、服务端推送监控服务器运行信息WebSocket、聊天室Socket.io、...

    Mastering Apache Flink, Learning Apache Flink

    文档中提到的连接器包括Kafka、Twitter、RabbitMQ和ElasticSearch,它们各自支持嵌入式节点模式和传输客户端模式,用于连接数据源和数据目的地。这为Flink处理实时数据流和批处理数据提供了强大的支持。 6. 时间...

    python 连接 Kingbase ES 的驱动 for linux arm 架构

    如果需要在Kingbase ES和Elasticsearch之间做数据同步或迁移,你可能需要额外的工具或自定义脚本来实现,如使用`elasticsearch-py`库操作Elasticsearch。 8. **Linux ARM兼容性**:确保所有依赖库都支持ARM架构,...

    基于SpringBoot+Vue的企业级智能通用报表调度平台管理系统源码

    为了便于问题排查和系统健康状况监控,系统可能会集成Logback、ELK Stack(Elasticsearch、Logstash、Kibana)或Prometheus+Grafana等工具进行日志管理和性能监控。 综上所述,这个基于SpringBoot+Vue的企业级智能...

Global site tag (gtag.js) - Google Analytics