在数据存储方面,Java程序员习惯于使用魔术般持久的Java Bean。 诸如Hibernate和用于关系数据存储的JPA规范或Morphia和Spring Data MongoDB之类的解决方案是受欢迎的示例。
使用Elasticsearch的开发人员有时也有相同的愿望–传递Java bean并对其进行自动索引。 提供了适用于Elasticsearch的Spring Data实现,但是这可能对您来说是开销,或者您的Elasticsearch版本不支持。 还有一个Jest ,它使用支持直接存储Java Bean的HTTP API。
如果您想使用标准的Java客户端(针对Elasticsearch)执行相同的操作,则没有对此的直接支持,但是可以轻松地手动实现。
假设您要保留代表一本书的以下简单对象结构。
Publisher publisher = new Publisher();
publisher.setCountry("UK");
publisher.setName("Packt");
Book book = new Book();
book.setTitle("Learning Spring Boot");
book.setAuthors(Arrays.asList("Greg L. Turnquist"));
book.setPublisher(publisher);
经常会发生的情况是,我们在认真思考一种解决问题的方法,以至于看不到更简单的方法。 我们不需要Elasticsearch的特殊框架。 Elastcsearch将为您愉快地存储大多数JSON结构。 幸运的是,使用Jackson或GSON之类的库从Java对象创建JSON文档是一个已解决的问题。
我们可以简单地在项目中添加一个依赖项(在这种情况下,将其添加到jackson-databind) ,并实例化一个ObjectMapper。
ObjectMapper mapper = new ObjectMapper();
如果您使用的是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客户端界面为结果建立索引。
IndexResponse response = client
.prepareIndex(indexName, "book")
.setSource(value).execute().actionGet();
检索文档时,可以使用readValue方法再次创建Java对象。
GetResponse getResponse = client
.prepareGet(indexName, "book", response.getId())
.execute().actionGet();
String source = getResponse.getSourceAsString();
Book persistedBook = mapper
.readValue(source, Book.class);
assertEquals("Packt", persistedBook.getPublisher().getName());
甚至更好:也许您甚至不需要再次创建Java对象? 当您仅在模板中显示结果时,仅传递结果文档的Map就足够了吗?
Map<String, Object> sourceAsMap =
getResponse.getSourceAsMap();
有时,当我们甚至不需要复杂的解决方案时,他们也在寻找它们。 由于Elasticsearch到处都使用JSON,因此使用Java或其他语言的通用库进行序列化非常容易。
翻译自: https://www.javacodegeeks.com/2016/07/simple-way-index-java-beans-elasticsearch.html