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

spring-Data-ElasticSearch通过不同的enttity/indicies进行搜索

苏乐
2023-03-14

我有一个要求,以提供功能,将允许用户搜索通过许多不同的领域元素,并看到结果作为组合列表。所以在UI中,他只需要填充一个文本字段,然后检索结果。

为了可视化,假设我在域中有3个实体:

@Document(indexName="car") 
public class Car { 
  private int id;
  private String type;
} 
@Document(indexName="garage")
public class Garage{ 
  private int id;
  private String address;
} 
@Document(indexName="shop")
public class Shop{ 
  private int id;
  private String name;
}

现在我想我可以达到这样的要求:

...
@Inject
    private ElasticsearchTemplate elasticsearchTemplate;
...    
@RequestMapping(value = "/_search/all/{query}",
        method = RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public List<?> search(@PathVariable String query) {
     SearchQuery searchQuery = new NativeSearchQueryBuilder()
       .withQuery(queryString(query))
       .withIndices("car", "garage", "shop")
       .build();

    //THIS WORKS
    elasticsearchTemplate.queryForIds(searchQuery);

    //THIS THROWS ERROR ABOUT WRONG INDEXES
    return elasticsearchTemplate.queryForPage(searchQuery, GlobalSearchDTO.class, new GlobalSearchResultMapper()).getContent();
    }
...
    class GlobalSearchDTO {
        public Long id;
        public String type;
        public Object obj;
    }
 ...  

但是当调用第二个函数--负责返回实际文档的函数时,会引发以下异常:

无法标识索引名称。GlobalSearchDTO不是文档。确保document类被@document(indexname=“foo”)注释

我尝试将任何域实体作为类参数传递,但我只是从相应的索引中检索元素,而不是全部。例如调用

return elasticsearchTemplate.queryForPage(searchQuery, Shop.class, new GlobalSearchResultMapper()).getContent();

仅从“shop”索引检索元素的结果。由于某种原因,似乎没有使用动态提供的指数。

所以问题是:这样检索数据有可能吗?为什么指定'.withindees(“car”、“garage”、“shop”)‘是不够的?

也许我应该考虑其他的解决方案,比如:

>

  • 在循环中搜索索引(一个比一个),连接结果并按分数排序

    创建具有“GlobalSearch”索引
    并在其中重复数据的单独GlobalSearch实体

    提前道谢!

    克日什托夫

  • 共有1个答案

    景嘉志
    2023-03-14

    我已设法为我的问题找到了合适的解决办法。结果表明,当使用“滚动”和“扫描”功能时,会使用动态提供的索引,这意味着查询按预期工作。解决方案代码:

     @RequestMapping(value = "/_search/all/{query}",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
        @Timed
        public List<?> search(@PathVariable String query) {
           SearchQuery searchQuery = new NativeSearchQueryBuilder()
             .withQuery(queryString(query))
             .withIndices("car", "garage", "shop")
             .withPageable(new PageRequest(0,1))
             .build();
    
             String scrollId = elasticsearchTemplate.scan(searchQuery, 1000, false);
             List<GlobalSearchDTO> sampleEntities = new ArrayList<GlobalSearchDTO>();
             boolean hasRecords = true;
             while (hasRecords){
                 Page<GlobalSearchDTO> page = elasticsearchTemplate.scroll(scrollId, 5000L , new ResultMapper());
                 if(page != null) {
                     sampleEntities.addAll(page.getContent());
                     hasRecords = page.hasNext();
                 }
                 else{
                     hasRecords = false;
                 }
             }
             return sampleEntities;
        }
    
    }
    

    并且在ResultMapper类中:

    ...
    for (SearchHit hit : response.getHits()) { 
        switch(hit.getIndex()) {
                    case "car": //map to DTO
                    case "shop": //map to DTO
                    case "garage": //map to DTO
                    }
    }   
    ...  
    
     类似资料:
    • 我确实在ElasticSearch中的字段中有一个数组数据,其中有一个关键字类型。我想用我想搜索的独占值搜索这个数组,即排除不包括在我的搜索关键字中的数组值。请看下面的细节。 谢了! 我有以下弹性搜索索引映射: 使用以下示例数据: 我的搜索是这样的: 我用过MatchQueryBuilder、TermQueryBuilder、TermsQueryBuilder都没用。根据ElasticSearch

    • 我想使用spring-data-elasticsearch-2.1.0创建如下所示的用户索引。注释。我找不到任何注释来添加“null_value”:“null”。这是必需的,因为我们的排序顺序正在失败。 域类 如何在innerfield中通过spring-data-elasticsearch注释添加“null_value”:“null”?我不想在外部创建索引映射。

    • 是否有人成功地将search\u after与spring data elasticsearch一起使用? 我已经将_uid添加到我的排序中,@Controller正确地将其放入我的Pagable中。我打开了慢速查询日志并验证了如果我手动运行@Repository生成的查询,我会得到响应: 我将以下内容添加到我的pojo(由@Repository返回的类): 排序总是返回为null。尝试了两种不同

    • 问题内容: 我们当前的设置是通过Spring Data JPA将MySQL作为主要数据源,并使用Hibernate Search索引和搜索数据。现在,我们决定去Elastic Search进行搜索,以更好地与其他功能保持一致,此外,我们需要让多个服务器共享索引和搜索。 我可以使用Spring Data ElasticSearch来设置Elastic,以通过轻松进行数据索引和搜索。但是现在的挑战是如

    • 我们目前的设置是以MySQL为主要数据源,通过Spring data JPA,Hibernate Search对数据进行索引和搜索。我们现在决定使用弹性搜索来进行搜索,以更好地与其他特性保持一致,此外,我们还需要多个服务器共享索引和搜索。 我可以通过轻松地使用Spring Data ElasticSearch设置弹性数据索引和搜索。但现在的挑战是如何将现有的所有MySQL记录索引到弹性搜索中。Hi

    • 我使用的是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/el