簡體   English   中英

Spring 數據 Elasticsearch 動態映射。 Map 屬性作為鍵值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM