package com.thinkbiganalytics.es; /*- * #%L * thinkbig-feed-manager-controller * %% * Copyright (C) 2017 ThinkBig Analytics * %% * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * #L% */ import com.carrotsearch.hppc.cursors.ObjectObjectCursor; import com.google.common.collect.Lists; import org.elasticsearch.action.admin.indices.mapping.get.GetMappingsRequest; import org.elasticsearch.action.search.SearchRequestBuilder; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.cluster.metadata.MappingMetaData; import org.elasticsearch.common.collect.ImmutableOpenMap; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.index.query.QueryBuilders; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; /** * Elastic Search Client */ public class ElasticSearch { private ElasticSearchClientConfig clientConfig; /** * the elastic search client **/ private Client client; public ElasticSearch(ElasticSearchClientConfig clientConfig) { this.clientConfig = clientConfig; } /** * Return the client. If the client has not been setup yet, it will create and configure it */ public Client getClient() { if (this.client == null) { Client client = null; try { String hostName = clientConfig.getHost(); String clusterName = clientConfig.getClusterName(); Settings settings = Settings.settingsBuilder() .put("cluster.name", clusterName).build(); client = TransportClient.builder().settings(settings).build() .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(hostName), clientConfig.getPort())); this.client = client; } catch (UnknownHostException e) { throw new RuntimeException(e); } } return client; } public SearchResult search(String query, int size, int start) { SearchRequestBuilder srb1 = getClient() .prepareSearch().setQuery(QueryBuilders.queryStringQuery(query)).setFrom(start).setSize(size); SearchResponse response = srb1.execute().actionGet(); SearchResult searchResult = new SearchResult(); searchResult.setTotalHits(response.getHits().getTotalHits()); searchResult.setFrom(new Long(start + 1)); searchResult.setTo(new Long(start + size)); if (searchResult.getTotalHits() < (start + size)) { searchResult.setTo(searchResult.getTotalHits()); } if (searchResult.getTotalHits() == 0) { searchResult.setFrom(0L); } searchResult.setTookInMillis(response.getTookInMillis()); searchResult.setSearchHits(Lists.newArrayList(response.getHits().getHits())); return searchResult; } /** * get a list of indexes, list of types -> list of fields for each type */ public List<IndexMappingDTO> getIndexMapping() { List<IndexMappingDTO> list = new ArrayList<>(); ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = getClient().admin().indices().getMappings(new GetMappingsRequest()).actionGet().getMappings(); Object[] indexList = mappings.keys().toArray(); for (Object indexObj : indexList) { String index = indexObj.toString(); IndexMappingDTO dto = new IndexMappingDTO(); dto.setIndex(index); list.add(dto); ImmutableOpenMap<String, MappingMetaData> mapping = mappings.get(index); for (ObjectObjectCursor<String, MappingMetaData> c : mapping) { TypeMappingDTO typeMappingDTO = new TypeMappingDTO(); typeMappingDTO.setType(c.key); dto.addType(typeMappingDTO); try { Map m = c.value.getSourceAsMap(); typeMappingDTO.setFields(getFieldList("", m)); } catch (IOException e) { throw new RuntimeException(e); } } } return list; } private List<String> getFieldList(String fieldName, Map<String, Object> mapProperties) { List<String> fieldList = new ArrayList<String>(); Map<String, Object> map = (Map<String, Object>) mapProperties.get("properties"); Set<String> keys = map.keySet(); for (String key : keys) { if (((Map<String, Object>) map.get(key)).containsKey("type")) { fieldList.add(fieldName + "" + key); } else { List<String> tempList = getFieldList(fieldName + "" + key + ".", (Map<String, Object>) map.get(key)); fieldList.addAll(tempList); } } return fieldList; } }