我看到了Spring Boot与document annotation的映射。使用@ Document注释定义索引使我不得不使用特定数量的字段和特定的字段名称。在我的应用程序中,用户定义了自己的字段,因此@@ Document不能很好地满足我的需求。
如何使用弹簧数据实现特定索引的动态字段?
示例:
用户生成一些数据:
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,可以将不同类(不仅仅是Map
)的对象索引到相同的索引,而不是使用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字段自动映射到一个数值而不是一个字符串。或者,如果您存储的两个不同类的对象都具有相同的名称但类型不同的属性,则会得到相同的错误。
因此从技术上讲是有可能的,但是我真的不建议以这种方式存储数据。