如何在 spring 启动数据弹性搜索中搜索嵌套列表对象
How to search inside nested list object in spring boot data elastic-search
我的合约模型class
@Data
@Document(indexName = "contract",type = "contract")
public class Contract implements Serializable
{
@JsonProperty("contract_number")
@Id
@Parent(type = "p")
@Field(type = FieldType.Text,index =true)
private String contract_number;
private String startDate;
private String endDate;
private String supportTypeCode;
@Field(type = FieldType.Nested,searchAnalyzer = "true")
private List<Product> products;
我的产品class
@Data
public class Product implements Serializable
{
@Field(type = FieldType.Keyword)
private String baseNumber;
@Field(type = FieldType.Keyword)
private String rowId;
@Field(type = FieldType.Keyword)
private String effectiveDate;
}
使用 spring 数据,我试图根据产品 class 中存在的 baseNumber
获取数据。
但是无法获取数据。
我尝试使用以下 JPA 方法,但它不起作用。
Optional<Contract> findByProducts_BaseNumber(String s)
我很困惑如何维护合同和产品之间的映射class。
应该是
findByProductsBaseNumber(String s);
或
findByProducts_BaseNumber(String s);
中所述
对我来说,下面的解决方案有效我使用的是 elastic 7.6 版本 java API.
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("products.baseNumber", baseNumber);
searchSourceBuilder.query(matchQueryBuilder);
searchSourceBuilder.from(0);
searchSourceBuilder.size(5);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(INDEX);
searchRequest.source(searchSourceBuilder);
SearchHits hits = null;
try
{
hits = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT).getHits();
final List<Contract> collect = Arrays.stream(hits.getHits()).map(
sourceAsMap -> objectMapper.convertValue(sourceAsMap.getSourceAsMap(), Contract.class)).collect(
Collectors.toList());
return collect.get(0);
}
catch (IOException e)
{
e.printStackTrace();
}
我的合约模型class
@Data
@Document(indexName = "contract",type = "contract")
public class Contract implements Serializable
{
@JsonProperty("contract_number")
@Id
@Parent(type = "p")
@Field(type = FieldType.Text,index =true)
private String contract_number;
private String startDate;
private String endDate;
private String supportTypeCode;
@Field(type = FieldType.Nested,searchAnalyzer = "true")
private List<Product> products;
我的产品class
@Data
public class Product implements Serializable
{
@Field(type = FieldType.Keyword)
private String baseNumber;
@Field(type = FieldType.Keyword)
private String rowId;
@Field(type = FieldType.Keyword)
private String effectiveDate;
}
使用 spring 数据,我试图根据产品 class 中存在的 baseNumber
获取数据。
但是无法获取数据。
我尝试使用以下 JPA 方法,但它不起作用。
Optional<Contract> findByProducts_BaseNumber(String s)
我很困惑如何维护合同和产品之间的映射class。
应该是
findByProductsBaseNumber(String s);
或
findByProducts_BaseNumber(String s);
中所述
对我来说,下面的解决方案有效我使用的是 elastic 7.6 版本 java API.
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("products.baseNumber", baseNumber);
searchSourceBuilder.query(matchQueryBuilder);
searchSourceBuilder.from(0);
searchSourceBuilder.size(5);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(INDEX);
searchRequest.source(searchSourceBuilder);
SearchHits hits = null;
try
{
hits = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT).getHits();
final List<Contract> collect = Arrays.stream(hits.getHits()).map(
sourceAsMap -> objectMapper.convertValue(sourceAsMap.getSourceAsMap(), Contract.class)).collect(
Collectors.toList());
return collect.get(0);
}
catch (IOException e)
{
e.printStackTrace();
}