[英]Spring Data Elasticsearch dynamic mapping. Map property as key-value?
應用程序會生成一個彈性索引。 描述了 object 到索引的映射,然后需要在索引中動態創建字段(即,不在所述映射中的字段)。 映射示例:
@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
也就是說,映射中未描述的字段及其編號是動態的。
據我了解,在這種情況下,我只需要離開描述的實體並通過 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;
}
在彈性請求形成階段,迭代這個 map 並創建具有這樣一個鍵值的元素,並忽略它本身。 也許有這樣的機會,我沒有注意到?
更新:
不,不幸的是它不適合我。 在上面的問題中,數據嵌套在 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,
}
}
也許您可以嘗試自定義轉換
@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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.