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)
输出将是:
- 将 3 个字段添加到索引
- 索引 indexName 中的新文档包含所有字段
请注意,链接文档已有几年历史了。
使用 Spring Data Elasticsearch 可以将不同 类(不仅仅是 Map
s)的对象索引到同一个索引,不是使用 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 字段被自动映射到一个数值而不是一个字符串。
或者,如果您存储两个不同 类 的对象,这两个 属性 具有相同的名称但类型不同,您将得到相同的错误。
所以技术上是可行的,但我真的不建议以这种方式存储数据。
我看到 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)
输出将是:
- 将 3 个字段添加到索引
- 索引 indexName 中的新文档包含所有字段
请注意,链接文档已有几年历史了。
使用 Spring Data Elasticsearch 可以将不同 类(不仅仅是 Map
s)的对象索引到同一个索引,不是使用 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 字段被自动映射到一个数值而不是一个字符串。
或者,如果您存储两个不同 类 的对象,这两个 属性 具有相同的名称但类型不同,您将得到相同的错误。
所以技术上是可行的,但我真的不建议以这种方式存储数据。