gpt4 book ai didi

java - Spring Elasticsearch : Howto search across multiple indexes with mappings to different objects

转载 作者:行者123 更新时间:2023-12-05 06:47:21 24 4
gpt4 key购买 nike

首先很抱歉,如果有人问过这个问题,我到处搜索都没有结果。

基本上我有一个具有 3 个索引的 ES 实例。索引的数据/映射是从我的 java POJO 生成的。现在我可以单独搜索每个索引并将其映射回给定的 Pojo/类。

但是,当我想一次性搜索 3 个索引并将搜索命中映射到正确的 Pojo 时,我完全不知所措。

例如,这是我目前如何搜索映射到我拥有的 UserProfile 对象的单个索引:

    public Iterable<UserProfile> fetchUserSearchSuggestions(String query, Integer page, Integer size) {

PageRequest pageRequest = PageRequest.of(page, size);

QueryBuilder queryBuilder = QueryBuilders.boolQuery().should(new WildcardQueryBuilder("displayName", query + "*"))
.should(new WildcardQueryBuilder("name", query + "*"));

Query searchQuery = new NativeSearchQueryBuilder()
.withFilter(queryBuilder)
.withPageable(pageRequest)
.build();

SearchHits<UserProfile> searchSuggestions =
elasticsearchOperations.search(searchQuery,
UserProfile.class,
IndexCoordinates.of(elasticUserIndex));

List<UserProfile> suggestions = new ArrayList<>();

searchSuggestions.getSearchHits().forEach(searchHit -> {
suggestions.add(searchHit.getContent());
});
long totalCount = searchSuggestions.getTotalHits();
Page<UserProfile> resultPage = PageableExecutionUtils.getPage(
suggestions,
pageRequest,
() -> totalCount);
return resultPage;
}

同样,我的问题是,如果我想一次性搜索所有索引,例如通用搜索,并将用户结果映射到 UserProfile 类,等等,对于我拥有的每个不同对象,我该怎么做。

感谢阅读

最佳答案

你知道 MultiSearchRequest 吗?

假设我们有一个具有这种结构的请求类:

class Request {
private String index;
private String field;
private String value;
}
  • index - ElasticSearch 索引
  • field - 我们正在寻找的领域
  • 值 - 字段值

跨多个索引的搜索看起来像这样

   public MultiSearchResponse find(List<Request> requests) throws IOException {

MultiSearchRequest multiSearchRequest = new MultiSearchRequest();

for (Request req : requests){
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchBoolPrefixQuery(req.field, req.value));

SearchSourceBuilder builder = new SearchSourceBuilder();
builder.size(1);
builder.query(queryBuilder);

SearchRequest searchRequest = new SearchRequest();
searchRequest.searchType(SearchType.DFS_QUERY_THEN_FETCH);
searchRequest.indices(req.index);
searchRequest.source(builder);

multiSearchRequest.add(searchRequest);
}

return restHighLevelClient.msearch(multiSearchRequest, RequestOptions.DEFAULT);
}

我不知道我的解决方案是否有帮助,但还是

--更新--

在我的宠物项目中,我是这样的转换器

public static List<SensorValueElasticsearch> parse(MultiSearchResponse response) {

List<SensorValueElasticsearch> values = new ArrayList<>();

for (MultiSearchResponse.Item item : response.getResponses()){
if (item.getResponse().getHits().getTotalHits().value > 0){
values.addAll(convertToList(item.getResponse()));
}
}
return values;
}

public static List<SensorValueElasticsearch> convertToList(SearchResponse response) {
SearchHit[] res = response.getHits().getHits();

List<SensorValueElasticsearch> list = new LinkedList<>();

for (SearchHit sh : res) {

SensorValueElasticsearch object = null;
try {
object = OBJECT_MAPPER.readValue(sh.getSourceAsString(), SensorValueElasticsearch.class);
} catch (JsonProcessingException e) {
LOGGER.warn("Error while convert SearchResponse to SensorValueElasticsearch", e);
}

list.add(object);
}

return list;
}

OBJECT_MAPPER.readValue 之前的情况下,您必须检查您收到的是哪种对象,或者像这样用 try-catch block 编写返回:

        ObjectA a = null;
ObjectB b = null;

try {
return OBJECT_MAPPER.readValue(sh.getSourceAsString(), ObjectA.class);
} catch (JsonProcessingException e) {
// ignore
}

try {
return OBJECT_MAPPER.readValue(sh.getSourceAsString(), ObjectB.class);
} catch (JsonProcessingException e) {
// ignore
}

throw new IllegalArgumentException("Unknown class");

关于java - Spring Elasticsearch : Howto search across multiple indexes with mappings to different objects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67137784/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com