如何从查询中返回一个字段(Spring Data Elasticsearch)

问题描述 投票:0回答:3

我正在写一个查询;在 Kibana 中很容易

GET populationstreamassignment/_search
{
    "query": {
    "match": {
      "healthyChildrenIndicator": true
    }
  }, 
  "_source": "memberId"
}

我想要做的是获取“健康儿童”的所有 memberId 的列表。但我想把它翻译成 java 语法。

import java.util.List;
import java.util.UUID;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

/**
 Spring Data Elasticsearch repository for the {@link PopulationStreamAssignment} entity.
 */
public interface PopulationStreamAssignmentSearchRepository extends ElasticsearchRepository<PopulationStreamAssignment, Long> {

    @Query("{\"match\": {\"?0\": \"?1\"}}")
    List<UUID> getMemberIdsByPopulationStream(String popStream, Boolean criteria);

}

这个查询有几个问题。这是我有问题的地方..

  1. 如何指定“_source”以便只返回memberId字段?
  2. memberId 是一个 UUID,我可以让它直接返回 memberId 作为值列表吗?
java spring elasticsearch spring-data-elasticsearch
3个回答
1
投票

目前有一个 pull request 正在处理,它将允许添加源包含和源排除到用

@Query
注释注释的存储库方法,因此这将在下一个版本中可用。

除此之外,还可以将源过滤器值设置为

Query
接口(
StringQuery
CriteriaQuery
NativeSearchQuery
)的任何提供的实现。您需要创建一个存储库片段(请参阅https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories.custom-implementations)以添加构建的函数如果您希望将其集成到存储库中,则使用这些查询之一。

您用来读取数据的实体需要具有与返回值匹配的属性,例如

@Document(indexName="populationstreamassignment")
public class Returned {
  @Id
  private String id;
  @Field(type= FieldType.text)
  private String memberId
  // getter and setter
}

0
投票

this GitHub issue 中所述,您不能使用注释直接过滤源,您需要使用

NativeSearchQueryBuilder
来完成相同的操作。

您可以查看 this Val 为 NativeSearch 查询生成器编写的 SO 答案。


0
投票

@Shruti - 请注意 CustomRepoImpl 将由 spring 自动搜索,因为包位于 spring boot 的搜索路径中。 Impl 的名称应该是 (interface-name)Impl

@Repository
public interface NormalRepo extends ElasticsearchRepository<User, String>, CustomRepo {

  Optional<Instant> findByName(String name);
}

public interface CustomRepo {
  Optional<Instant> findByName(String name);
}

public class CustomRepoImpl implements CustomRepo {
  Optional<Instant> findByName(String name) {
    // your implementation
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.