SearchRequestBuilder srb = client.prepareSearch(index); srb.setQuery(QueryBuilders.matchAllQuery()); srb.setFilter(FilterBuilders.geoDistanceRangeFilter("filter1").lat(1234).lon(4321).geoDistance(GeoDistance.PLANE) ..... );
private SearchResponse doSearch(SearchRequestBuilder searchRequest, QueryBuilder query, FilterBuilder filter, SortBuilder sortBuilder){ if(filter != null){ searchRequest.setFilter(filter); } if(sortBuilder != null){ searchRequest.addSort(sortBuilder); } return searchRequest.setQuery(query).execute().actionGet(); }
@Override public <E> List<E> getColumnsById(String schemaName, String tableName, String pKeyColumnName, String columnName, Object pKeyColumnValue, Class columnJavaType) { // fetch list ADDRESS_ID for given PERSON_ID FilterBuilder filterBuilder = new TermFilterBuilder(pKeyColumnName,pKeyColumnValue); SearchResponse response = txClient.prepareSearch(schemaName.toLowerCase()).setTypes(tableName).setFilter(filterBuilder).addField(columnName) .execute().actionGet(); SearchHits hits = response.getHits(); List columns = new ArrayList(); for (SearchHit hit : hits.getHits()) { Map<String,SearchHitField> fields = hit.getFields(); columns.add(fields.get(columnName).getValue()); } return columns; }
@Override public Object[] findIdsByColumn(String schemaName, String tableName, String pKeyName, String columnName, Object columnValue, Class entityClazz) { TermFilterBuilder filter = FilterBuilders.termFilter(columnName, columnValue); SearchResponse response = txClient.prepareSearch(schemaName.toLowerCase()) .setTypes(tableName).addField(pKeyName).setFilter(filter).execute().actionGet(); SearchHits hits = response.getHits(); Long length = hits.getTotalHits(); int absoluteLength = length.intValue(); Object[] ids = new Object[absoluteLength]; int counter=0; for (SearchHit hit : hits.getHits()) { Map<String,SearchHitField> fields = hit.getFields(); ids[counter++]= fields.get(pKeyName).getValue(); } return ids; }
@Override public <T> List<String> queryForIds(SearchQuery query) { SearchRequestBuilder request = prepareSearch(query).setQuery(query.getQuery()) .setNoFields(); if(query.getFilter() != null){ request.setFilter(query.getFilter()); } SearchResponse response = request.execute().actionGet(); return extractIds(response); }
List executeQuery(FilterBuilder filter, final EntityMetadata entityMetadata) { Class clazz = entityMetadata.getEntityClazz(); MetamodelImpl metaModel = (MetamodelImpl) KunderaMetadata.INSTANCE.getApplicationMetadata().getMetamodel( entityMetadata.getPersistenceUnit()); EntityType entityType = metaModel.entity(clazz); List results = new ArrayList(); SearchResponse response = txClient.prepareSearch(entityMetadata.getSchema().toLowerCase()) .setTypes(entityMetadata.getTableName()).setFilter(filter).execute().actionGet(); SearchHits hits = response.getHits(); Object entity = null; for (SearchHit hit : hits.getHits()) { entity = getInstance(clazz, entity); Map<String, Object> hitResult = hit.sourceAsMap(); results.add(wrap(hitResult, entityType, entity,entityMetadata, false)); } return results; }
@Override public List<String> query(IndexQuery query, KeyInformation.IndexRetriever informations, TransactionHandle tx) throws StorageException { SearchRequestBuilder srb = client.prepareSearch(indexName); srb.setTypes(query.getStore()); srb.setQuery(QueryBuilders.matchAllQuery()); srb.setFilter(getFilter(query.getCondition(),informations.get(query.getStore()))); if (!query.getOrder().isEmpty()) { List<IndexQuery.OrderEntry> orders = query.getOrder(); for (int i = 0; i < orders.size(); i++) { srb.addSort(new FieldSortBuilder(orders.get(i).getKey()) .order(orders.get(i).getOrder() == Order.ASC ? SortOrder.ASC : SortOrder.DESC) .ignoreUnmapped(true)); } } srb.setFrom(0); if (query.hasLimit()) srb.setSize(query.getLimit()); else srb.setSize(maxResultsSize); srb.setNoFields(); //srb.setExplain(true); SearchResponse response = srb.execute().actionGet(); log.debug("Executed query [{}] in {} ms", query.getCondition(), response.getTookInMillis()); SearchHits hits = response.getHits(); if (!query.hasLimit() && hits.totalHits() >= maxResultsSize) log.warn("Query result set truncated to first [{}] elements for query: {}", maxResultsSize, query); List<String> result = new ArrayList<String>(hits.hits().length); for (SearchHit hit : hits) { result.add(hit.id()); } return result; }
@Override public String scan(SearchQuery searchQuery, long scrollTimeInMillis, boolean noFields) { Assert.notNull(searchQuery.getIndices(), "No index defined for Query"); Assert.notNull(searchQuery.getTypes(), "No type define for Query"); Assert.notNull(searchQuery.getPageable(), "Query.pageable is required for scan & scroll"); SearchRequestBuilder requestBuilder = client.prepareSearch(toArray(searchQuery.getIndices())) .setSearchType(SCAN) .setQuery(searchQuery.getQuery()) .setTypes(toArray(searchQuery.getTypes())) .setScroll(TimeValue.timeValueMillis(scrollTimeInMillis)) .setFrom(0) .setSize(searchQuery.getPageable().getPageSize()); if(searchQuery.getFilter() != null){ requestBuilder.setFilter(searchQuery.getFilter()); } if(noFields){ requestBuilder.setNoFields(); } return requestBuilder.execute().actionGet().getScrollId(); }