未反序列化Spring Data Elasticsearch文档
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了未反序列化Spring Data Elasticsearch文档相关的知识,希望对你有一定的参考价值。
Spring Data Elasticsearch版本:3.2.6.RELEASEElasticsearch版本:7.6.2
我正在尝试使用以下方法反序列化MerchantCategory
的列表:
SearchQuery getAllQuery = new NativeSearchQueryBuilder()
.withQuery(matchAllQuery())
.build();
return elasticsearchTemplate.queryForList(getAllQuery, MerchantCategory.class);
[String id]字段已在MerchsntCategory
的列表中正确设置,但其他字段仍为null
。
我已经确认文档字段是使用Kibana保留在Elasticsearch中的。
启动Spring Boot应用程序时,将字段映射提交给Elasticsearch:
request [PUT http://127.0.0.1:9200/merchantcategory/_mapping/merchantcategory?master_timeout=30s&include_type_name=true&timeout=30s] returned 1 warnings: [299 Elasticsearch-7.6.2-ef48eb35cf30adf4db14086e8aabd07ef6fb113f "[types removal] Using include_type_name in put mapping requests is deprecated. The parameter will be removed in the next major version."]
这里是MerchantCategory
类:
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
@Setter
@Document(indexName = "merchantcategory", type = "merchantcategory")
public class MerchantCategory implements Serializable {
@Id
@JsonIgnore
private String id;
@SerializedName("ParentId")
private Long parentId;
@SerializedName("Name")
private String name;
@SerializedName("Description")
private String description;
@SerializedName("UrlName")
private String urlName;
@SerializedName("Id")
private Long categoryId;
@SerializedName("MerchantsInCategory")
private List<MerchantCategoryRelationship> merchants;
}
我使用gson
进行序列化:
val bulkRequest = new BulkRequest();
entities.subList(startIndex, endIndex).forEach(e ->{
String source = gson.toJson(e);
val indexRequest = new IndexRequest(index).source(source, XContentType.JSON).type(type);
bulkRequest.add(indexRequest);
});
highLevelClient.bulkAsync(bulkRequest, RequestOptions.DEFAULT, getListener());
我也尝试过使用merchantCategoryElasticsearchRepository.findAll();
进行相同的操作,并且存在相同的问题。
为什么序列化的唯一字段是String id字段而不是其他字段?
答案
您使用Jackson作为序列化程序吗?
比您必须使用:@JsonProperty
@JsonProperty("UrlName")
private String urlName;
如果使用GSON作为串行器,则必须使用@SerializedName
。
@SerializedName("UrlName")
private String urlName;
以上是关于未反序列化Spring Data Elasticsearch文档的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot集成ElasticSearch 02使用 spring-boot-starter-data-elasticsearch 集成并使用高级客户端