【问题标题】:Springframwork and Elasticsearch dynamic field\property namesSpringframwork 和 Elasticsearch 动态字段\属性名称
【发布时间】:2019-12-25 09:58:23
【问题描述】:

我看到了 Spring Boot 与 document annotation 的映射。使用 @Document 注释来定义索引使我有义务指定特定数量的字段和特定字段名称。 在我的应用程序中,用户定义了自己的字段,因此 @Document 不适合我的需求。

如何使用 spring 数据实现特定索引的动态字段?

示例:

用户生成一些数据:

Map<String, String> data = new HashMap<>();
//new fields
data.put("oranges", "tasty");
data.put("apples", "baaa");
data.put("avocado", "ok");
// existing fields
data.put("totalFruits", 20);

并调用一个方法,让我们说:

void indexData(String indexName, Map<String, String> data)

输出将是:

  • 将 3 个字段添加到索引中
  • 索引 indexName 中包含所有字段的新文档

【问题讨论】:

    标签: spring spring-boot elasticsearch spring-data spring-data-elasticsearch


    【解决方案1】:

    请注意,链接的文档已有几年历史了。

    使用 Spring Data Elasticsearch,可以将不同类的对象(不仅仅是 Maps)索引到同一个索引,而不是使用 Repository 方法,而是使用 ElasticsearchOperations 接口的实现方法。

    您可以通过使用 ElasticsearchOperations.index(IndexQuery query) 来实现这一点,直到当前版本 3.2。从 4.0 开始,这将变为 DocumentOperations.index(IndexQuery, IndexCoordinates)
    IndexQuery 包含一个字段,该字段指定文档数据应存储到的索引名称。从 4.0 版本开始,第二个参数中的信息用于传递此信息。

    如果您以这种方式存储数据,请注意索引映射不是由 Spring Data Elasticsearch 创建的,您无法控制它。如果第一个文档包含

    data.put("count", 20)
    

    被存储,稍后另一个文档被存储与

    data.put("count", "twenty")
    

    你会得到一个错误,因为 count 字段被自动映射到一个数值而不是一个字符串。
    或者,如果您存储两个不同类的对象,它们都具有同名但类型不同的属性,您将得到相同的错误。

    所以从技术上讲这是可能的,但我真的不建议以这种方式存储数据。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多