Springframework 和 Elasticsearch 动态 field\property 名称

Springframwork and Elasticsearch dynamic field\property names

我看到 Spring 引导与 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)

输出将是:

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

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

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

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

data.put("count", 20)

被存储,后来另一个文档被存储

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

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

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