当前位置: 首页 > 知识库问答 >
问题:

Spring Data Elasticsearch支持多搜索API吗?

爱茂勋
2023-03-14

我使用的是Spring Data Elasticsearch,我对使用ElasticSearch6.2的多搜索API感兴趣,以便在一个API请求中执行多个搜索。

https://www.elastic.co/guide/en/elasticsearch/reference/6.2/search-multi-search.html

https://www.elastic.co/guide/en/elasticsearch/client/java-api/6.2/java-search-msearch.html

共有1个答案

羊舌青青
2023-03-14

不,Spring Data Elasticsearch暂时不支持多搜索。我也遇到了同样的问题,我正在工作公关添加这个功能。现在,我提出以下变通办法:

@Override
public YYY findBy(XXX xxx) {
  Client client = template.getClient();
  MultiSearchRequest request = new MultiSearchRequest();
  // build searchQuery like normal
  for (NativeSearchQuery searchQuery : queries) {
    request.add(prepareSearch(client, searchQuery));
  }
  ActionFuture<MultiSearchResponse> future = client
      .multiSearch(request);
  MultiSearchResponse response = future.actionGet();
  Item[] items = response.getResponses();
  for (int i = 0; i < items.length; i++) {
    AggregatedPage<XXX> ts = resultMapper.mapResults(items[i].getResponse(), XXX.class, page);
    // do with page
  }
}

private SearchRequestBuilder prepareSearch(Client client, SearchQuery searchQuery) {
  Assert.notNull(searchQuery.getIndices(), "No index defined for Query");
  Assert.notNull(searchQuery.getTypes(), "No type defined for Query");

  int startRecord = 0;
  SearchRequestBuilder searchRequest = client.prepareSearch(toArray(searchQuery.getIndices()))
      .setSearchType(searchQuery.getSearchType()).setTypes(toArray(searchQuery.getTypes()));

  if (searchQuery.getSourceFilter() != null) {
    SourceFilter sourceFilter = searchQuery.getSourceFilter();
    searchRequest.setFetchSource(sourceFilter.getIncludes(), sourceFilter.getExcludes());
  }

  if (searchQuery.getPageable().isPaged()) {
    startRecord = searchQuery.getPageable().getPageNumber() * searchQuery.getPageable().getPageSize();
    searchRequest.setSize(searchQuery.getPageable().getPageSize());
  }
  searchRequest.setFrom(startRecord);

  if (!searchQuery.getFields().isEmpty()) {
    searchRequest.setFetchSource(toArray(searchQuery.getFields()), null);
  }

  if (searchQuery.getSort() != null) {
    for (Sort.Order order : searchQuery.getSort()) {
      searchRequest.addSort(order.getProperty(),
          order.getDirection() == Sort.Direction.DESC ? SortOrder.DESC : SortOrder.ASC);
    }
  }

  if (searchQuery.getMinScore() > 0) {
    searchRequest.setMinScore(searchQuery.getMinScore());
  }

  if (searchQuery.getFilter() != null) {
    searchRequest.setPostFilter(searchQuery.getFilter());
  }

  if (!isEmpty(searchQuery.getElasticsearchSorts())) {
    for (SortBuilder sort : searchQuery.getElasticsearchSorts()) {
      searchRequest.addSort(sort);
    }
  }

  if (!searchQuery.getScriptFields().isEmpty()) {
    //_source should be return all the time
    //searchRequest.addStoredField("_source");
    for (ScriptField scriptedField : searchQuery.getScriptFields()) {
      searchRequest.addScriptField(scriptedField.fieldName(), scriptedField.script());
    }
  }

  if (searchQuery.getHighlightFields() != null) {
    for (HighlightBuilder.Field highlightField : searchQuery.getHighlightFields()) {
      searchRequest.highlighter(new HighlightBuilder().field(highlightField));
    }
  }

  if (!isEmpty(searchQuery.getIndicesBoost())) {
    for (IndexBoost indexBoost : searchQuery.getIndicesBoost()) {
      searchRequest.addIndexBoost(indexBoost.getIndexName(), indexBoost.getBoost());
    }
  }

  if (!isEmpty(searchQuery.getAggregations())) {
    for (AbstractAggregationBuilder aggregationBuilder : searchQuery.getAggregations()) {
      searchRequest.addAggregation(aggregationBuilder);
    }
  }

  if (!isEmpty(searchQuery.getFacets())) {
    for (FacetRequest aggregatedFacet : searchQuery.getFacets()) {
      searchRequest.addAggregation(aggregatedFacet.getFacet());
    }
  }

  return searchRequest.setQuery(searchQuery.getQuery());
}
 类似资料:
  • 我想有一个GUI应用程序,它将包含多个标签,每个标签都有自己的表格。我想在标签下包括一个搜索框,可以过滤当前选定的标签。如何实现这种动态行为?

  • WooCommerce前台搜索只会从标题、内容、摘要里搜索,产品SKU有时比较重要,但它存储在custom field里,默认无法通过SKU搜索产品。本文介绍的方法可以让产品搜索支持SKU。 默认搜索 假设我要搜“SLK3423”这个SKU,默认搜索的SQL语句如下所示,可以看出只搜了标题、摘要和内容。 SELECT SQL_CALC_FOUND_ROWS wp_posts.id FROM w

  • 我正在尝试搜索Spotify中的曲目元数据。我想看看Spotify是否有一首来自YouTube视频的歌曲。这是我用于进行搜索的URL模板: 由于很难确定搜索查询的哪一部分是艺术家还是曲目,因此我将这两种类型添加为搜索查询的类型。 然而,当我得到一个YouTube的视频,标题是这样的:“凯蒂·佩里——我们是这样做的(官方视频)[·莱特拉·西班牙语——歌词英语”,并将其用作我的搜索词时,我得到了0个结

  • 我试图比较两个数据帧的差异,使用一个公共键/索引值,该值由帧中的3列组成。 e、 g.假设两列中的列都是:“COL1”、“COL2”、“COL3”、“COL4” 数据帧是df1 然后,我使用了set_index方法: 然后我想遍历df1数据帧,并检查df2数据帧是否有匹配的索引。我尝试过使用以下方法: 但是它返回false(尽管我可以通过打印看到两者的索引都存在)。 我做错了什么? 另外,如何使用

  • 主要内容:多索引此API用于在Elasticsearch中搜索内容。 用户可以通过发送具有查询字符串的获取请求作为参数或在请求的消息正文中的查询来进行搜索。所有的搜索API都是多索引,多类型。 多索引 Elasticsearch允许我们搜索存在于所有索引或一些特定索引中的文档。 例如,如果我们需要搜索名称包含的所有文档。 响应 或者,同样地我们可以在,索引中搜索 - 多类型 还可以在所有类型或某种指定类型的索引中

  • 我已经达到了magic dex的极限,因为我的应用程序使用了很多JAR(驱动API、greendao、文本到pdf、支持…)。 我目前的解决方案是,我只为google drive创建了第二个apk,我从主apk调用了它。但现在我发现android终于通过这个库支持了这一点。我的问题是我不知道如何实现它(最好没有gradle)。我找不到任何好的教程。 好吧,我正在失去理智,试图实现这个...我找到了