2

我在我的页面上有一个searchfield,并且此searchfield应搜索多个indice。 我可以在没有问题的情况下搜索一个指令,如spring-data-elasticsearch的文档中所述。spring-data-elasticsearch搜索多个索引

但是,如果我搜索,例如作为对“富”,我想有以下列表的结果按相关性排序:

{ title: "Foo" } -> Entity: Sample 
{ name: "FooTest" } -> Entity: Test 
{ title: "FooSample2" } -> Entity: Sample 
// ...and so on 
// The entities are not part of the same parent. So, they are complete different. 

为此,我无法找到任何文件,这将有助于我。

任何人都可以帮忙吗?

编辑:

final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchAllQuery()) 
       .withIndices("game-index", "lets-play-index", "video-index", "genre-index", "platform-index", "user-index") 
       .withPageable(new PageRequest(0, 10)) 
       .build(); 

      // when 
      final Page<SearchResult> sampleEntities = elasticsearchTemplate.queryForPage(searchQuery, SearchResult.class, new SearchResultMapper() { 

       @Override 
       public <T> FacetedPage<T> mapResults(
                 final SearchResponse response, 
                 final Class<T> clazz, 
                 final Pageable pageable) { 
        LoggerUtil.get(this.getClass()) 
         .debug(response.toString()); 
        LoggerUtil.get(this.getClass()) 
         .debug(response.getHits() 
          .toString()); 
        LoggerUtil.get(this.getClass()) 
         .debug("TotalHits: " + response.getHits() 
          .totalHits()); 

        final long totalHits = response.getHits() 
         .totalHits(); 
        final List<T> results = new ArrayList<T>(); 
        for (final SearchHit hit : response.getHits()) { 
         LoggerUtil.get(this.getClass()) 
          .debug(hit.sourceAsString()); 
         if (hit != null) { 
          final T result = null; 
          /* 
          * if (!Strings.isNullOrEmpty(hit.sourceAsString())) 
          * { result = mapEntity(hit.sourceAsString(), 
          * clazz); } else { result = 
          * mapEntity(hit.getFields() .values(), clazz); } 
          */ 
          // setPersistentEntityId(result, hit.getId(), 
          // clazz); 
          results.add(result); 
         } 
        } 
        final List<FacetResult> facets = new ArrayList<FacetResult>(); 
        if (response.getFacets() != null) { 
         for (final Facet facet : response.getFacets()) { 
          final FacetResult facetResult = DefaultFacetMapper.parse(facet); 
          if (facetResult != null) { 
           facets.add(facetResult); 
          } 
         } 
        } 

        return new FacetedPageImpl<T>(results, pageable, totalHits, facets); 
       } 

      }); 

SearchResultMapper内的响应是follwing:

{ 
    "took" : 5, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 30, 
    "successful" : 30, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 0, 
    "max_score" : null, 
    "hits" : [ ] 
    } 
} 

,如果我做一个简单的搜索:

final Class<?> clazz = Class.forName(className); 

      final SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(getQueryBuilderForQuery(query)) 
       .build(); 
      final List<?> results = elasticsearchTemplate.queryForList(searchQuery, clazz); 

它的工作原理和我得到很多结果。这意味着我的索引正在工作。

我绝对不知道我能做什么。非常感谢。

+0

如果我正在读你的权利,那么你想跨越多个指数进行搜索,这还没有得到支持,但不是什么大不了的,你可以在https://jira.spring上创建JIRA .io/browse/DATAES /?这将推到下一次迭代。 –

+0

创建的票:https://jira.spring.io/browse/DATAES-77 –

+0

你能给我一些“快速”的解决方案或方向,我必须使用什么来获得我需要的结果列表吗? –

回答

1

对不起,这是已经支持

尝试下面的代码,它应该是工作...

但是下面的代码是,你必须在实体相同的结构和elasticsearch文件

@Test 
    public void shouldTestResultsAcrossMultipleIndices() { 
    // given 
    String documentId1 = randomNumeric(5); 
    SampleEntity sampleEntity1 = new SampleEntityBuilder(documentId1).message("some message") 
      .version(System.currentTimeMillis()).build(); 

    IndexQuery indexQuery1 = new IndexQueryBuilder().withId(sampleEntity1.getId()) 
      .withIndexName("test-index-1") 
      .withObject(sampleEntity1) 
      .build(); 

    String documentId2 = randomNumeric(5); 
    SampleEntity sampleEntity2 = new SampleEntityBuilder(documentId2).message("some test message") 
      .version(System.currentTimeMillis()).build(); 

    IndexQuery indexQuery2 = new IndexQueryBuilder().withId(sampleEntity2.getId()) 
      .withIndexName("test-index-2") 
      .withObject(sampleEntity2) 
      .build(); 

    elasticsearchTemplate.bulkIndex(Arrays.asList(indexQuery1, indexQuery2)); 
    elasticsearchTemplate.refresh("test-index-1", true); 
    elasticsearchTemplate.refresh("test-index-2", true); 

    SearchQuery searchQuery = new NativeSearchQueryBuilder() 
      .withQuery(matchAllQuery()) 
      .withIndices("test-index-1", "test-index-2") 
      .build(); 
    // when 
    List<SampleEntity> sampleEntities = elasticsearchTemplate.queryForList(searchQuery, SampleEntity.class); 
    // then 
    assertThat(sampleEntities.size(), is(equalTo(2))); 
} 

如果您在索引中有不同的结构,那么您可以使用以下弹性搜索方法模板

Page<T> queryForPage(SearchQuery query, Class<T> clazz, SearchResultMapper mapper); 

还困惑吗? 高兴地帮助 :-)

+0

我更新了上面的问题。请看一看。 –