@Override public <P extends ParaObject> List<P> findTermInList(String appid, String type, String field, List<?> terms, Pager... pager) { if (StringUtils.isBlank(field) || terms == null) { return Collections.emptyList(); } QueryBuilder qb = QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), FilterBuilders.termsFilter(field, terms)); return searchQuery(appid, type, qb, pager); }
@Override public Map<Object, Set<Edge>> edges(Iterator<BaseVertex> vertices, Direction direction, String[] edgeLabels, Predicates predicates) { Map<Object, Vertex> idToVertex = new HashMap<>(); vertices.forEachRemaining(singleVertex -> idToVertex.put(singleVertex.id(), singleVertex)); if (edgeLabels != null && edgeLabels.length > 0) predicates.hasContainers.add(new HasContainer(T.label.getAccessor(), P.within(edgeLabels))); Object[] vertexIds = idToVertex.keySet().toArray(); BoolFilterBuilder boolFilter = ElasticHelper.createFilterBuilder(predicates.hasContainers); if (direction == Direction.IN) boolFilter.must(FilterBuilders.termsFilter(DocEdge.InId, vertexIds)); else if (direction == Direction.OUT) boolFilter.must(FilterBuilders.termsFilter(DocEdge.OutId, vertexIds)); else if (direction == Direction.BOTH) boolFilter.must(FilterBuilders.orFilter( FilterBuilders.termsFilter(DocEdge.InId, vertexIds), FilterBuilders.termsFilter(DocEdge.OutId, vertexIds))); QueryIterator<Edge> edgeQueryIterator = new QueryIterator<>(boolFilter, 0, scrollSize, predicates.limitHigh - predicates.limitLow, client, this::createEdge , refresh, timing, indexName); Map<Object, Set<Edge>> results = new HashMap<>(); edgeQueryIterator.forEachRemaining(edge -> edge.vertices(direction).forEachRemaining(vertex -> { Set<Edge> resultEdges = results.get(vertex.id()); if (resultEdges == null) { resultEdges = new HashSet<>(); results.put(vertex.id(), resultEdges); } resultEdges.add(edge); })); return results; }
@Override protected Pair<SearchRequestBuilder,QueryBuilder> addSearchSiteIds(Pair<SearchRequestBuilder,QueryBuilder> builders, List<String> siteIds) { SearchRequestBuilder searchRequestBuilder = builders.getLeft(); BoolQueryBuilder queryBuilder = (BoolQueryBuilder)builders.getRight(); // if we have sites filter results to include only the sites included if (siteIds.size() > 0) { searchRequestBuilder = searchRequestBuilder.setRouting(siteIds.toArray(new String[siteIds.size()])); // creating config whether or not to use filter, there are performance and caching differences that // maybe implementation decisions if (useSiteFilters) { OrFilterBuilder siteFilter = orFilter().add( termsFilter(SearchService.FIELD_SITEID, siteIds.toArray(new String[siteIds.size()])).execution("bool")); searchRequestBuilder = searchRequestBuilder.setPostFilter(siteFilter); } else { queryBuilder = queryBuilder.must(termsQuery(SearchService.FIELD_SITEID, siteIds.toArray(new String[siteIds.size()]))); } } return pairOf(searchRequestBuilder,queryBuilder); }
@Override public Map<Object, Set<Edge>> edges(Iterator<BaseVertex> vertices, Direction direction, String[] edgeLabels, Predicates predicates) { List<Object> vertexIds = new ArrayList<>(); vertices.forEachRemaining(singleVertex -> vertexIds.add(singleVertex.id())); BoolFilterBuilder boolFilter = ElasticHelper.createFilterBuilder(predicates.hasContainers); OrFilterBuilder mappingFilter = FilterBuilders.orFilter(); boolean empty = true; for (EdgeMapping mapping : edgeMappings) { if (edgeLabels != null && edgeLabels.length > 0 && !contains(edgeLabels, mapping.getLabel())) continue; mappingFilter.add(FilterBuilders.termsFilter(mapping.getExternalVertexField(), vertexIds.toArray())); empty = false; } if (!empty) { boolFilter.must(mappingFilter); } QueryIterator<Vertex> vertexSearchQuery = new QueryIterator<>(boolFilter, 0, scrollSize, predicates.limitHigh - predicates.limitLow, client, this::createVertex, refresh, timing, indices); Map<Object, Set<Edge>> results = new HashMap<>(); vertexSearchQuery.forEachRemaining(otherVertex -> otherVertex.edges(direction, edgeLabels).forEachRemaining(edge -> { Vertex vertex = BaseVertex.vertexToVertex(otherVertex, edge, direction); Set<Edge> resultEdges = results.get(vertex.id()); if (resultEdges == null) { resultEdges = new HashSet<>(); results.put(vertex.id(), resultEdges); } resultEdges.add(edge); })); return results; }
case CONTAINS: if (value instanceof String) { filters.add(FilterBuilders.termsFilter(propertyName, splitStringIntoTerms((String) value)).execution("and")); } else { filters.add(FilterBuilders.termFilter(propertyName, value)); case DOES_NOT_CONTAIN: if (value instanceof String) { filters.add(FilterBuilders.notFilter(FilterBuilders.termsFilter(propertyName, splitStringIntoTerms((String) value)).execution("and"))); } else { filters.add(FilterBuilders.notFilter(FilterBuilders.termFilter(propertyName, value)));
orFilters.add(FilterBuilders.termsFilter("_id", idsArray)); orFilters.add(FilterBuilders.termsFilter(EXTENDED_DATA_ELEMENT_ID_FIELD_NAME, idsArray));
protected SearchResponse retrieveByField(String field, Object value, String[] includeFields) throws Exception { // The query here is using the exact value match. // https://www.elastic.co/guide/en/elasticsearch/guide/1.x/_finding_exact_values.html SearchRequestBuilder builder = esClient.prepareSearch() .setIndices(getIndexName()).setTypes(getDocTypeName()) .setQuery(QueryBuilders .filteredQuery(QueryBuilders.matchAllQuery(), FilterBuilders.termsFilter(field, value))) .setFetchSource(includeFields, null).setVersion(true); return builder.execute().actionGet(); }
termsList.add((String)termsMap.get(key)); boundaryFilter.must(FilterBuilders.termsFilter(filterPath, termsList).execution("or")); break; case "range":
protected <E extends EsDocument> ScrollableResponse<List<E>> retrieveScrollByField( String field, Object value, String[] includeFields, int size, ThrowingFunction<String, E> createFunc) throws Exception { Preconditions.checkArgument(size > 0); SearchRequestBuilder builder = esClient.prepareSearch() .setIndices(getIndexName()).setTypes(getDocTypeName()) .setScroll(new TimeValue(SCROLLDEFAULTTIMEOUT)) .setSize(size) .setQuery(QueryBuilders .filteredQuery(QueryBuilders.matchAllQuery(), FilterBuilders.termsFilter(field, value))) .setFetchSource(includeFields, null).setVersion(true); SearchResponse response = builder.execute().actionGet(); return convertToScrollableResponse(response, createFunc); }
case CONTAINS: if (value instanceof String) { filters.add(FilterBuilders.termsFilter(has.key, splitStringIntoTerms((String) value)).execution("and")); } else { filters.add(FilterBuilders.termFilter(has.key, value));
else if (predicate == Contains.within){ if(value == null) boolFilterBuilder.must(FilterBuilders.existsFilter(key)); else boolFilterBuilder.must(FilterBuilders.termsFilter (key, value));
case CONTAINS: if (value instanceof String) { filters.add(FilterBuilders.termsFilter(has.key, splitStringIntoTerms((String) value)).execution("and")); } else { filters.add(FilterBuilders.termFilter(has.key, value));
case CONTAINS: if (value instanceof String) { filters.add(FilterBuilders.termsFilter(has.key, splitStringIntoTerms((String) value)).execution("and")); } else { filters.add(FilterBuilders.termFilter(has.key, value));
@Override protected Pair<SearchRequestBuilder, QueryBuilder> addSearchSuggestionsSites(Pair<SearchRequestBuilder, QueryBuilder> builders, String currentSite, boolean allMySites) { String currentUser = ""; User user = userDirectoryService.getCurrentUser(); if (user != null) { currentUser = user.getId(); } String[] sites; if (allMySites || currentSite == null) { sites = getAllUsersSites(currentUser); } else { sites = new String[]{currentSite}; } OrFilterBuilder siteFilter = orFilter().add( termsFilter(SearchService.FIELD_SITEID, sites).execution("bool")); SearchRequestBuilder searchRequestBuilder = builders.getLeft() .setRouting(sites) .setPostFilter(siteFilter); return pairOf(searchRequestBuilder, builders.getRight()); }