Spring Data Elasticsearch 动态映射。将属性映射为键值?
Posted
技术标签:
【中文标题】Spring Data Elasticsearch 动态映射。将属性映射为键值?【英文标题】:Spring Data Elasticsearch dynamic mapping. Map property as key-value? 【发布时间】:2021-04-02 04:47:09 【问题描述】:应用程序会生成一个弹性索引。描述了对象到索引的映射,然后需要在索引中动态创建字段(即,不在所描述的映射中的字段)。 映射示例:
@Document (indexName = "product", createIndex = true)
public class Product
@Id
@Field (name = "id", type = FieldType.Long)
private Long id;
@Field (name = "name", type = FieldType.Text)
private String name;
写文档到索引的时候需要给它加字段吗?
count_mag1 = 5,
count_mag2 = 6,
...
count_magN = 5
也就是说,映射中未描述的字段及其编号是动态的。
据我了解,在这种情况下,我只需要离开描述的Entity并通过Spring数据存储库保存实体吗? 理想情况下,当然,我想为实体添加一个属性,其集合值的形式为:
@Document (indexName = "product", createIndex = true)
public class Product
@Id
@Field (name = "id", type = FieldType.Long)
private Long id;
@Field (name = "name", type = FieldType.Text)
private String name;
private Map <String, Long> counts;
在形成弹性请求的阶段,迭代这个映射并创建具有这样一个键值的元素,并忽略它本身。也许有这样的机会,我没有注意到?
更新:
不,不幸的是它不适合我。在上述问题中,数据嵌套在 innerData 字段中,现在我通过在实体中指定以下选项来实现相同的结果:
private Map<String, Long> counts;
我的目标是最终得到这样的结果:
"_index": "infos",
"_type": "_doc",
"_id": "123456",
"_version": 1,
"_seq_no": 6919,
"_primary_term": 1,
"_routing": "4",
"found": true,
"_source":
"id": 123,
"name": "test",
"count_wh_1": 123,
"count_wh_2": 1234,
"count_wh_3": 1235,
.....
"count_wh_N": 123,
【问题讨论】:
您要搜索具有特定键的条目吗?看看这个问题:***.com/questions/63780364/… @P.J.Meisch,不,不幸的是它不适合我。我已经添加了对原始问题的更新并进行了澄清。 这种映射在 Spring Data Elasticsearch 中是不可能的。请记住,Elasticsearch 将为每个 count_sh_N 属性创建一个动态属性映射。 Elasticsearch 将文档中的字段数限制为 1000,因此您也可能会遇到麻烦。 @P.J.Meisch 非常感谢您的回复。非常抱歉,。 【参考方案1】:也许你可以试试自定义转化
@Bean
@Override
public ElasticsearchCustomConversions elasticsearchCustomConversions()
return new ElasticsearchCustomConversions(
Arrays.asList(new AddressToMap(), new MapToAddress()));
@WritingConverter
static class AddressToMap implements Converter<Address, Map<String, Object>>
@Override
public Map<String, Object> convert(Address source)
LinkedHashMap<String, Object> target = new LinkedHashMap<>();
target.put("ciudad", source.getCity());
// ...
return target;
@ReadingConverter
static class MapToAddress implements Converter<Map<String, Object>, Address>
@Override
public Address convert(Map<String, Object> source)
// ...
return address;
【讨论】:
以上是关于Spring Data Elasticsearch 动态映射。将属性映射为键值?的主要内容,如果未能解决你的问题,请参考以下文章
springboot 集成 spring-data-elasticsearch
Spring BootSpring Boot之使用 Spring Data Elasticsearch 整合elasticsearch