在Elasticsearch中索引Java Bean的简单方法

在数据存储方面,Java程序员习惯于使用魔术般持久的Java Bean。 诸如Hibernate和用于关系数据存储的JPA规范MorphiaSpring Data MongoDB之类的解决方案是受欢迎的示例。

使用Elasticsearch的开发人员有时也有相同的愿望–传递Java bean并对其进行自动索引。 提供了适用于ElasticsearchSpring 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结构。 幸运的是,使用JacksonGSON之类的库从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到处都使用J​​SON,因此使用Java或其他语言的通用库进行序列化非常容易。

翻译自: https://www.javacodegeeks.com/2016/07/simple-way-index-java-beans-elasticsearch.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值