谈到数据存储时,Java程序员习惯使用Java bean技术持久化。像Hibernate和JPA规范支持的关系数据库存储方案,以及Morphia和Spring Data 对MongoDB等非关系型数据库解决方案都很受欢迎并已被广泛应用。
使用Elasticsearch的开发人员有时也会有相同的愿望 – 传递一个Java bean并自动对其进行索引。Elasticsearch提供了一个Spring Data的实现,但它可能会造成开销,或者你使用的Elasticsearch版本不支持它。
如果你想用Elasticsearch的标准Java客户端来做同样的事情,那么就没有直接的支持,但它可以很容易地手工实现。
假如你想用以下简单得对象结构来表示一本书籍,、
通常情况下,也没有更简单的方法了。我们不需要Elasticsearch的特殊框架。Elastcsearch可以方便存储大多数JSON结构。幸运的是从Java对象中创建JSON文档是使用像Jackson或GSON这样的库来解决的。
我们可以简单地将一个依赖项添加到项目中,需要实例化一个ObjectMapper,这个项目就是jackson-databind。
如果你使用的是Spring Boot,你通常可以只使用@Autowire ObjectMapper。ObjectMapper可以用来创建对象的JSON形式表示。
String value = mapper.writeValueAsString(book);
将得到类似这样的字符串,
{“title”:”Learning Spring Boot”,”authors”:[“Greg L. Turnquist”],”publisher”:{“name”:”Packt”,”country”:”UK”}}
然后你可以使用Elasticsearch客户端界面为结果进行索引。
在检索文档时,您可以使用readValue方法再次创建Java对象。
甚至不需要再创建一个Java对象,当你只在模板中显示结果时,只需传入生成文档的map就足够了
Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
由于Elasticsearch在任何地方都使用了JSON,所以使用通用库进行序列化非常容易,无论是Java还是其他编程语言。