Search in sources :

Example 1 with SearchRequest

use of org.opensearch.action.search.SearchRequest in project bw-calendar-engine by Bedework.

the class BwIndexEsImpl method addOverrides.

private boolean addOverrides(final Response resp, final EventInfo ei) {
    try {
        final BwEvent ev = ei.getEvent();
        if (!ev.isRecurringEntity()) {
            return true;
        }
        /* Fetch any overrides. */
        final ESQueryFilter flts = getFilters(null);
        final int batchSize = 100;
        int start = 0;
        while (true) {
            // Search original for overrides
            final SearchSourceBuilder ssb = new SearchSourceBuilder().from(start).size(batchSize).postFilter(flts.overridesOnly(ev.getUid()));
            final var clResp = sch.getClient();
            if (!clResp.isOk()) {
                return false;
            // return Response.fromResponse(resp, clResp);
            }
            final var cl = clResp.getEntity();
            final SearchRequest req = new SearchRequest(searchIndexes).searchType(SearchType.QUERY_THEN_FETCH).source(ssb);
            final SearchResponse sres;
            try {
                sres = cl.search(req, RequestOptions.DEFAULT);
            } catch (final Throwable t) {
                errorReturn(resp, t);
                return false;
            }
            if (sres.status() != RestStatus.OK) {
                errorReturn(resp, "Search returned status " + sres.status());
                return false;
            }
            final SearchHit[] hits = sres.getHits().getHits();
            if ((hits == null) || (hits.length == 0)) {
                // No more data - we're done
                break;
            }
            for (final SearchHit hit : hits) {
                final String kval = hit.getId();
                if (kval == null) {
                    errorReturn(resp, "org.bedework.index.noitemkey");
                    return false;
                }
                final EntityBuilder eb = getEntityBuilder(hit.getSourceAsMap());
                final EventInfo entity;
                if (docTypeEvent.equals(docType)) {
                    entity = makeEvent(eb, resp, kval, false);
                    final BwEvent oev = entity.getEvent();
                    if (oev instanceof BwEventAnnotation) {
                        final BwEventAnnotation ann = (BwEventAnnotation) oev;
                        final BwEvent proxy = new BwEventProxy(ann);
                        ann.setTarget(ev);
                        ann.setMaster(ev);
                        ei.addOverride(new EventInfo(proxy));
                        continue;
                    }
                }
                // Unexpected type
                errorReturn(resp, "Expected override only: " + docType);
                return false;
            }
            if (hits.length < batchSize) {
                // All remaining in this batch - we're done
                break;
            }
            start += batchSize;
        }
        return true;
    } catch (final Throwable t) {
        errorReturn(resp, t);
        return false;
    }
}
Also used : SearchRequest(org.opensearch.action.search.SearchRequest) SearchHit(org.opensearch.search.SearchHit) EventInfo(org.bedework.calfacade.svc.EventInfo) BwEvent(org.bedework.calfacade.BwEvent) BwEventProxy(org.bedework.calfacade.BwEventProxy) SearchSourceBuilder(org.opensearch.search.builder.SearchSourceBuilder) SearchResponse(org.opensearch.action.search.SearchResponse) BwEventAnnotation(org.bedework.calfacade.BwEventAnnotation)

Example 2 with SearchRequest

use of org.opensearch.action.search.SearchRequest in project bw-calendar-engine by Bedework.

the class BwIndexEsImpl method fetchEntities.

private <T> List<T> fetchEntities(final String docType, final BuildEntity<T> be, final QueryBuilder filter, final int count) throws CalFacadeException {
    requireDocType(docType);
    int tries = 0;
    final int ourCount;
    if (count < 0) {
        ourCount = maxFetchCount;
    } else {
        ourCount = Math.min(maxFetchCount, count);
    }
    final SearchSourceBuilder ssb = new SearchSourceBuilder().size(ourCount).query(filter);
    final SearchRequest sr = new SearchRequest(targetIndex).source(ssb).scroll(new TimeValue(60000));
    if (debug()) {
        debug("fetchEntities: " + sr);
    }
    final List<T> res = new ArrayList<>();
    try {
        SearchResponse scrollResp = getClient().search(sr, RequestOptions.DEFAULT);
        if (scrollResp.status() != RestStatus.OK) {
            if (debug()) {
                debug("Search returned status " + scrollResp.status());
            }
        }
        for (; ; ) {
            if (tries > absoluteMaxTries) {
                // huge count or we screwed up
                warn("Indexer: too many tries");
                break;
            }
            if (scrollResp.status() != RestStatus.OK) {
                if (debug()) {
                    debug("Search returned status " + scrollResp.status());
                }
            }
            final SearchHits hits = scrollResp.getHits();
            // Break condition: No hits are returned
            if (hits.getHits().length == 0) {
                break;
            }
            for (final SearchHit hit : hits) {
                // Handle the hit...
                final T ent = be.make(getEntityBuilder(hit.getSourceAsMap()), hit.getId());
                if (ent == null) {
                    // No access
                    continue;
                }
                res.add(ent);
            // ourPos++;
            }
            tries++;
            final SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollResp.getScrollId());
            scrollRequest.scroll(new TimeValue(60000));
            scrollResp = getClient().scroll(scrollRequest, RequestOptions.DEFAULT);
        }
    } catch (final Throwable t) {
        throw new CalFacadeException(t);
    }
    return res;
}
Also used : SearchRequest(org.opensearch.action.search.SearchRequest) SearchHit(org.opensearch.search.SearchHit) ArrayList(java.util.ArrayList) SearchScrollRequest(org.opensearch.action.search.SearchScrollRequest) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException) SearchSourceBuilder(org.opensearch.search.builder.SearchSourceBuilder) SearchResponse(org.opensearch.action.search.SearchResponse) SearchHits(org.opensearch.search.SearchHits) TimeValue(org.opensearch.common.unit.TimeValue)

Example 3 with SearchRequest

use of org.opensearch.action.search.SearchRequest in project bw-calendar-engine by Bedework.

the class BwIndexEsImpl method reindex.

@Override
public ReindexResponse reindex() {
    if (currentReindexing == null) {
        currentReindexing = new ReindexResponse(docType);
    }
    final ReindexResponse resp = currentReindexing;
    if (resp.getStatus() == processing) {
        return resp;
    }
    // Create a new index.
    final String indexName;
    try {
        indexName = newIndex();
    } catch (final Throwable t) {
        return Response.error(resp, t);
    }
    // Only retrieve masters - we'll query for the overrides
    final QueryBuilder qb = getFilters(RecurringRetrievalMode.entityOnly).getAllForReindex(docType);
    // 1 minute
    final int timeoutMillis = 60000;
    final TimeValue tv = new TimeValue(timeoutMillis);
    final int batchSize = 100;
    final var clResp = sch.getClient();
    if (!clResp.isOk()) {
        return Response.fromResponse(resp, clResp);
    }
    final var cl = clResp.getEntity();
    final BulkListener listener = new BulkListener();
    final BulkProcessor.Builder builder = BulkProcessor.builder((request, bulkListener) -> cl.bulkAsync(request, RequestOptions.DEFAULT, bulkListener), listener);
    final BulkProcessor bulkProcessor = builder.setBulkActions(batchSize).setConcurrentRequests(3).setFlushInterval(tv).build();
    /*
    SearchResponse scrollResp = cl.prepareSearch(targetIndex)
                                  .setSearchType(SearchType.SCAN)
                                  .setScroll(tv)
                                  .setQuery(qb)
                                  .setSize(batchSize)
                                  .execute()
                                  .actionGet(); //100 hits per shard will be returned for each scroll
*/
    final SearchSourceBuilder ssb = new SearchSourceBuilder().size(batchSize).query(qb);
    final SearchRequest sr = new SearchRequest(targetIndex).source(ssb).scroll(tv);
    // Switch to new index
    targetIndex = indexName;
    try {
        SearchResponse scrollResp = cl.search(sr, RequestOptions.DEFAULT);
        if (scrollResp.status() != RestStatus.OK) {
            if (debug()) {
                debug("Search returned status " + scrollResp.status());
            }
        }
        // Scroll until no hits are returned
        while (true) {
            for (final SearchHit hit : scrollResp.getHits().getHits()) {
                resp.incProcessed();
                if ((resp.getProcessed() % 250) == 0) {
                    info("processed " + docType + ": " + resp.getProcessed());
                }
                resp.getStats().inc(docToType.getOrDefault(docType, unreachableEntities));
                final ReindexResponse.Failure hitResp = new ReindexResponse.Failure();
                final Object entity = makeEntity(hitResp, hit, null);
                if (entity == null) {
                    warn("Unable to build entity " + hit.getSourceAsString());
                    resp.incTotalFailed();
                    if (resp.getTotalFailed() < 50) {
                        resp.addFailure(hitResp);
                    }
                    continue;
                }
                if (entity instanceof BwShareableDbentity) {
                    final BwShareableDbentity<?> ent = (BwShareableDbentity<?>) entity;
                    principalHref = ent.getOwnerHref();
                }
                if (entity instanceof EventInfo) {
                    // This might be a single event or a recurring event.
                    final EventInfo ei = (EventInfo) entity;
                    final BwEvent ev = ei.getEvent();
                    if (ev.getRecurring()) {
                        resp.incRecurring();
                    }
                    if (!reindexEvent(hitResp, indexName, hit, ei, bulkProcessor)) {
                        warn("Unable to index event " + hit.getSourceAsString());
                        resp.incTotalFailed();
                        if (resp.getTotalFailed() < 50) {
                            resp.addFailure(hitResp);
                        }
                    }
                } else {
                    final EsDocInfo doc = makeDoc(resp, entity);
                    if (doc == null) {
                        if (resp.getStatus() != ok) {
                            resp.addFailure(hitResp);
                        }
                        continue;
                    }
                    final IndexRequest request = new IndexRequest(indexName);
                    request.id(doc.getId());
                    request.source(doc.getSource());
                    bulkProcessor.add(request);
                    if (entity instanceof BwEventProperty) {
                        caches.put((BwEventProperty<?>) entity);
                    }
                }
            }
            final SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollResp.getScrollId());
            scrollRequest.scroll(tv);
            scrollResp = getClient().scroll(scrollRequest, RequestOptions.DEFAULT);
            // Break condition: No hits are returned
            if (scrollResp.getHits().getHits().length == 0) {
                break;
            }
        }
        try {
            bulkProcessor.awaitClose(10, TimeUnit.MINUTES);
        } catch (final InterruptedException e) {
            errorReturn(resp, "Final bulk close was interrupted. Records may be missing", failed);
        }
    } catch (final Throwable t) {
        errorReturn(resp, t);
    }
    return resp;
}
Also used : SearchRequest(org.opensearch.action.search.SearchRequest) SearchHit(org.opensearch.search.SearchHit) EventInfo(org.bedework.calfacade.svc.EventInfo) BwEvent(org.bedework.calfacade.BwEvent) BwEventProperty(org.bedework.calfacade.BwEventProperty) MatchQueryBuilder(org.opensearch.index.query.MatchQueryBuilder) MatchNoneQueryBuilder(org.opensearch.index.query.MatchNoneQueryBuilder) QueryBuilder(org.opensearch.index.query.QueryBuilder) CreateIndexRequest(org.opensearch.client.indices.CreateIndexRequest) DeleteIndexRequest(org.opensearch.action.admin.indices.delete.DeleteIndexRequest) IndexRequest(org.opensearch.action.index.IndexRequest) SearchScrollRequest(org.opensearch.action.search.SearchScrollRequest) SearchSourceBuilder(org.opensearch.search.builder.SearchSourceBuilder) ReindexResponse(org.bedework.calfacade.indexing.ReindexResponse) BwShareableDbentity(org.bedework.calfacade.base.BwShareableDbentity) BulkProcessor(org.opensearch.action.bulk.BulkProcessor) EsDocInfo(org.bedework.util.opensearch.EsDocInfo) TimeValue(org.opensearch.common.unit.TimeValue) SearchResponse(org.opensearch.action.search.SearchResponse)

Example 4 with SearchRequest

use of org.opensearch.action.search.SearchRequest in project bw-calendar-engine by Bedework.

the class BwIndexEsImpl method multiFetch.

/*
  private SearchHits multiColFetch(final List<String> hrefs)
          throws CalFacadeException {
    final int batchSize = hrefs.size();

    final SearchRequestBuilder srb = getClient()
            .prepareSearch(searchIndexes);

    final TermsQueryBuilder tqb =
            new TermsQueryBuilder(
                    ESQueryFilter.getJname(PropertyInfoIndex.HREF),
                    hrefs);

    srb.setSearchType(SearchType.QUERY_THEN_FETCH)
       .setQuery(tqb);
    srb.setFrom(0);
    srb.setSize(batchSize);

    if (debug()) {
      debug("MultiColFetch: targetIndex=" + targetIndex +
                    "; srb=" + srb);
    }

    final SearchResponse resp = srb.execute().actionGet();

    if (resp.status() != RestStatus.OK) {
      if (debug()) {
        debug("Search returned status " + resp.status());
      }

      return null;
    }

    final SearchHits hits = resp.getHits();

    if ((hits.getHits() == null) ||
            (hits.getHits().length == 0)) {
      return null;
    }

    //Break condition: No hits are returned
    if (hits.getHits().length == 0) {
      return null;
    }

    return hits;
  }
  */
private List<SearchHit> multiFetch(final SearchHits hits, final RecurringRetrievalMode rmode) throws CalFacadeException {
    // Make an ored filter from keys
    // Dedup
    final Set<String> hrefs = new TreeSet<>();
    for (final SearchHit hit : hits) {
        final String kval = hit.getId();
        if (kval == null) {
            throw new CalFacadeException("org.bedework.index.noitemkey");
        }
        final Map<String, Object> map = hit.getSourceAsMap();
        final Object field = map.get(ESQueryFilter.hrefJname);
        if (field == null) {
            warn("Unable to get field " + ESQueryFilter.hrefJname + " from " + map);
        } else {
            hrefs.add(field.toString());
        }
    }
    final int batchSize = 1000;
    final List<SearchHit> res = new ArrayList<>();
    final SearchSourceBuilder ssb = new SearchSourceBuilder().size(batchSize).query(getFilters(null).multiHref(hrefs, rmode));
    final SearchRequest req = new SearchRequest(searchIndexes).searchType(SearchType.QUERY_THEN_FETCH).source(ssb).scroll(TimeValue.timeValueMinutes(1L));
    if (debug()) {
        debug("MultiFetch: targetIndex=" + targetIndex + "; ssb=" + ssb);
    }
    try {
        SearchResponse resp = getClient().search(req, RequestOptions.DEFAULT);
        int tries = 0;
        for (; ; ) {
            if (tries > absoluteMaxTries) {
                // huge count or we screwed up
                warn("Indexer: too many tries");
                break;
            }
            if (resp.status() != RestStatus.OK) {
                if (debug()) {
                    debug("Search returned status " + resp.status());
                }
                return null;
            }
            final SearchHit[] hits2 = resp.getHits().getHits();
            if ((hits2 == null) || (hits2.length == 0)) {
                // No more data - we're done
                break;
            }
            res.addAll(Arrays.asList(hits2));
            tries++;
            final SearchScrollRequest scrollRequest = new SearchScrollRequest(resp.getScrollId());
            scrollRequest.scroll(new TimeValue(60000));
            resp = getClient().scroll(scrollRequest, RequestOptions.DEFAULT);
        }
        return res;
    } catch (final Throwable t) {
        throw new CalFacadeException(t);
    }
}
Also used : SearchRequest(org.opensearch.action.search.SearchRequest) SearchHit(org.opensearch.search.SearchHit) ArrayList(java.util.ArrayList) CalFacadeException(org.bedework.calfacade.exc.CalFacadeException) SearchScrollRequest(org.opensearch.action.search.SearchScrollRequest) SearchSourceBuilder(org.opensearch.search.builder.SearchSourceBuilder) SearchResponse(org.opensearch.action.search.SearchResponse) TreeSet(java.util.TreeSet) TimeValue(org.opensearch.common.unit.TimeValue)

Example 5 with SearchRequest

use of org.opensearch.action.search.SearchRequest in project veilarbportefolje by navikt.

the class OpensearchService method search.

@SneakyThrows
private <T> T search(SearchSourceBuilder searchSourceBuilder, String indexAlias, Class<T> clazz) {
    SearchRequest request = new SearchRequest().indices(indexAlias).source(searchSourceBuilder);
    SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
    return JsonUtils.fromJson(response.toString(), clazz);
}
Also used : SearchRequest(org.opensearch.action.search.SearchRequest) SearchResponse(org.opensearch.action.search.SearchResponse) SneakyThrows(lombok.SneakyThrows)

Aggregations

SearchRequest (org.opensearch.action.search.SearchRequest)189 SearchSourceBuilder (org.opensearch.search.builder.SearchSourceBuilder)105 SearchResponse (org.opensearch.action.search.SearchResponse)69 MultiSearchRequest (org.opensearch.action.search.MultiSearchRequest)54 MultiSearchResponse (org.opensearch.action.search.MultiSearchResponse)36 Matchers.containsString (org.hamcrest.Matchers.containsString)31 HashMap (java.util.HashMap)23 IOException (java.io.IOException)22 List (java.util.List)22 CountDownLatch (java.util.concurrent.CountDownLatch)22 ArrayList (java.util.ArrayList)21 ActionListener (org.opensearch.action.ActionListener)21 IndexRequest (org.opensearch.action.index.IndexRequest)20 SearchHit (org.opensearch.search.SearchHit)20 MultiSearchTemplateRequest (org.opensearch.script.mustache.MultiSearchTemplateRequest)18 SearchTemplateRequest (org.opensearch.script.mustache.SearchTemplateRequest)18 XContentBuilder (org.opensearch.common.xcontent.XContentBuilder)17 BulkRequest (org.opensearch.action.bulk.BulkRequest)16 SearchScrollRequest (org.opensearch.action.search.SearchScrollRequest)16 BytesArray (org.opensearch.common.bytes.BytesArray)16