迁移至Spring API Client后,Elasticsearch文档_index字段无法填充的问题
解决Spring API Client迁移后_index元数据字段为空的问题
问题原因
RestHighLevelClient会自动将_index这类元数据字段映射到实体类的对应字段,但Spring Data Elasticsearch的ElasticsearchClient默认仅映射文档_source中的内容到实体类,_index属于元数据(不在_source内),因此用@Field(name="_index")无法获取到值,返回null。
解决方案
方案1:手动从SearchHit提取元数据赋值
遍历搜索结果时,直接从SearchHit对象中获取_index元数据,手动设置到实体类对象中:
SearchHits<TestDocument> hits = esClient.search(query, TestDocument.class, IndexCoordinates.of(index)); for (SearchHit<TestDocument> hit : hits) { TestDocument doc = hit.getContent(); doc.setIndex(hit.getIndex()); // 手动设置_index值 // 后续业务处理 }
方案2:通过注解自动映射元数据
使用Spring Data Elasticsearch 4.4及以上版本支持的@Metadata注解,标记实体类中的index字段,让框架自动映射元数据:
import org.springframework.data.elasticsearch.annotations.Metadata; public class TestDocument { @Metadata(field = "_index") private String index; // 其他字段、getter和setter }
方案3:实现MetadataAware接口
实现MetadataAware接口,通过重写方法获取元数据并赋值:
import org.springframework.data.elasticsearch.core.mapping.MetadataAware; import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMetadata; public class TestDocument implements MetadataAware { private String index; private SimpleElasticsearchMetadata metadata; @Override public SimpleElasticsearchMetadata getMetadata() { return metadata; } @Override public void setMetadata(SimpleElasticsearchMetadata metadata) { this.metadata = metadata; this.index = metadata.getIndex(); // 从元数据中提取_index } // 其他字段、getter和setter }
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

