我使用Spring数据进行弹性搜索,并使用ReactiveCrudRepository进行查找和删除等操作。我注意到,在根和简单对象的属性,删除工作(deleteByAttributeName)。但是,如果我有嵌套对象,那么它就不起作用了。
这是我的实体
书
@Data
@TypeAlias("book")
@Document(indexName = "book")
public class EsBook{
@Field(type = FieldType.Long)
private Long id;
@Field(type = FieldType.Nested)
private EsStats stats;
@Field(type = FieldType.Date, format = DateFormat.date)
private LocalDate publishDate;
}
统计
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class EsStats{
@Field(type = FieldType.Double)
private Double averageRating;
@Field(type = FieldType.Integer)
private Double totalRatings;
@Field(type = FieldType.Keyword)
private String category; //this can be null
}
这是我尝试过的,正在工作和不工作我使用ReactiveCrudRepository删除索引中的文档。对于Book Level上的所有常规字段,如id或withid和publishDate,删除工作完美。只要我使用像Stats这样的嵌入式对象,它就会停止工作。我看到我发送的文档和统计数据至少在视觉上是匹配的,但从来没有找到或删除它们。我尝试在统计中使用EqualsAndHashcode,假设由于某种原因可能在内部不考虑相等。我还尝试将双数据类型更改为int,因为在查看弹性搜索文档时,我看到平均评论,如果像3这样的整数保存为3,但是当我们从Java发送它时,我在调试3中看到显示为3.0,所以我怀疑情况是否如此,但似乎并非如此。甚至将数据类型更改为int delete也不起作用。
public interface ReactiveBookRepository extends ReactiveCrudRepository<EsBook, String> {
Mono<Void> deleteById(long id); //working
Mono<Void> deleteByIdAndPublishDate(long id, LocalDate publishDate); //Nor working
Mono<Void> deleteByIdAndStats(long id, LocalDate startDate);
}
任何帮助都将不胜感激
您是否验证了您的Elasticsearch索引映射与Spring Data注释匹配?
验证索引映射将stats
字段定义为嵌套字段类型。
如果没有,那么尝试将Spring注释更改为:
@Field(type = FieldType.Object)
private EsStats stats;