[ElasticSearch]Java API 之 索引文档 (Index API)

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/52806082 Index API 允许我们存储一个JSON格式的文档,使数据可以被搜索。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/52806082

Index API 允许我们存储一个JSON格式的文档,使数据可以被搜索。文档通过index、type、id唯一确定。我们可以自己提供一个id,或者也使用Index API 为我们自动生成一个。

这里有几种不同的方式来产生JSON格式的文档(document):

(1)手动方式,使用原生的byte[]或者String

(2)使用Map方式,会自动转换成与之等价的JSON

(3)使用第三方库来序列化beans,如Jackson

(4)使用内置的帮助类 XContentFactory.jsonBuilder()

1. 手动方式
 
 
  1.    /**
  2.     *  手动方式 产生JSON 索引文档
  3.     * @param client
  4.     * @param index
  5.     * @param type
  6.     * @param id
  7.     * @param json
  8.     */
  9.    public static boolean indexDocByJSON(Client client, String index, String type, String id, String json) {
  10.        // Index
  11.        IndexRequestBuilder indexRequestBuilder = client.prepareIndex();
  12.        indexRequestBuilder.setIndex(index);
  13.        indexRequestBuilder.setType(type);
  14.        indexRequestBuilder.setId(id);
  15.        indexRequestBuilder.setSource(json);
  16.        indexRequestBuilder.setTTL(8000);
  17.        // 执行
  18.        IndexResponse indexResponse = indexRequestBuilder.get();
  19.        return indexResponse.isCreated();
  20.    }

测试,下面代码存储梅西信息到索引为football-index,类型为football-type,id为1的文档中:

 
 
  1.    @Test
  2.    public void indexDocByJSON() throws Exception {
  3.        String index = "football-index";
  4.        String type = "football-type";
  5.        String id = "1";
  6.        String json = "{" +
  7.                "\"club\":\"巴萨罗那\"," +
  8.                "\"country\":\"阿根廷\"," +
  9.                "\"name\":\"梅西\"" +
  10.                "}";
  11.        boolean result = IndexDocAPI.indexDocByJSON(client, index, type , id,  json);
  12.        logger.info("--------- indexDocByJSON {}", result);
  13.    }


2. Map方式
 
 
  1.    /**
  2.     *  使用Map 产生JSON 索引文档
  3.     * @param client
  4.     * @param index
  5.     * @param type
  6.     * @param id
  7.     */
  8.    public static boolean indexDocByMap(Client client, String index, String type, String id, Map<String, Object> map) {
  9.        // Index
  10.        IndexRequestBuilder indexRequestBuilder = client.prepareIndex();
  11.        indexRequestBuilder.setIndex(index);
  12.        indexRequestBuilder.setType(type);
  13.        indexRequestBuilder.setId(id);
  14.        indexRequestBuilder.setSource(map);
  15.        indexRequestBuilder.setTTL(8000);
  16.        // 执行
  17.        IndexResponse indexResponse = indexRequestBuilder.get();
  18.        return indexResponse.isCreated();
  19.    }

测试,下面代码存储穆勒信息到索引为football-index,类型为football-type,id为2的文档中:

 
 
  1.    @Test
  2.    public void indexDocByMap() throws Exception {
  3.        String index = "football-index";
  4.        String type = "football-type";
  5.        String id = "2";
  6.        Map<String, Object> map = Maps.newHashMap();
  7.        map.put("name", "穆勒");
  8.        map.put("club", "拜仁慕尼黑俱乐部");
  9.        map.put("country", "德国");
  10.        boolean result = IndexDocAPI.indexDocByMap(client, index, type , id,  map);
  11.        logger.info("--------- indexDocByMap {}", result);
  12.    }
3.  序列化方式

 
 
  1.    /**
  2.     * 利用Json序列化 产生JSON 索引文档
  3.     *
  4.     * @param client
  5.     * @param index
  6.     * @param type
  7.     * @param id
  8.     */
  9.    public static boolean indexDocByBean(Client client, String index, String type, String id, Object bean) {
  10.        // Bean转换为字节
  11.        ObjectMapper mapper = new ObjectMapper();
  12.        byte[] json;
  13.        try {
  14.            json = mapper.writeValueAsBytes(bean);
  15.        } catch (JsonProcessingException e) {
  16.            logger.error("---------- json 转换失败 Bean:{}", bean.toString());
  17.            return false;
  18.        }
  19.        // Index
  20.        IndexRequestBuilder indexRequestBuilder = client.prepareIndex();
  21.        indexRequestBuilder.setIndex(index);
  22.        indexRequestBuilder.setType(type);
  23.        indexRequestBuilder.setId(id);
  24.        indexRequestBuilder.setSource(json);
  25.        indexRequestBuilder.setTTL(8000);
  26.        // 执行
  27.        IndexResponse response = indexRequestBuilder.get();
  28.        return response.isCreated();
  29.    }

测试,下面代码存储卡卡信息到索引为football-index,类型为football-type,id为3的文档中:

 
  
  1. @Test
  2. public void indexDocByBean() throws Exception {
  3. String index = "football-index";
  4. String type = "football-type";
  5. String id = "3";
  6. FootballPlayer footballPlayer = new FootballPlayer();
  7. footballPlayer.setName("卡卡");
  8. footballPlayer.setClub("奥兰多城俱乐部");
  9. footballPlayer.setCountry("巴西");
  10. boolean result = IndexDocAPI.indexDocByBean(client, index, type , id, footballPlayer);
  11. logger.info("--------- indexDocByBean {}", result);
  12. }
4.  XContentBuilder帮助类方式

ElasticSearch提供了一个内置的帮助类XContentBuilder来产生JSON文档

 
 
  1.    /**
  2.     * 使用帮助类XContentBuilder 产生JSON 索引文档
  3.     * @param client
  4.     * @param index
  5.     * @param type
  6.     * @param id
  7.     * @param xContentBuilder
  8.     * @return
  9.     */
  10.    public static boolean indexDocByXContentBuilder(Client client, String index, String type, String id, XContentBuilder xContentBuilder) {
  11.        // Index
  12.        IndexRequestBuilder indexRequestBuilder = client.prepareIndex();
  13.        indexRequestBuilder.setIndex(index);
  14.        indexRequestBuilder.setType(type);
  15.        indexRequestBuilder.setId(id);
  16.        indexRequestBuilder.setSource(xContentBuilder);
  17.        indexRequestBuilder.setTTL(8000);
  18.        // 执行
  19.        IndexResponse response = indexRequestBuilder.get();
  20.        return response.isCreated();
  21.    }

测试,下面代码存储托雷斯信息到索引为football-index,类型为football-type,id为4的文档中:

 
  
  1.    @Test
  2.    public void indexDocByXContentBuilder() throws Exception {
  3.        String index = "football-index";
  4.        String type = "football-type";
  5.        String id = "4";
  6.        XContentBuilder xContentBuilder;
  7.        try {
  8.            xContentBuilder = XContentFactory.jsonBuilder();
  9.            xContentBuilder
  10.                    .startObject()
  11.                        .field("name", "托雷斯")
  12.                        .field("club", "马德里竞技俱乐部")
  13.                        .field("country", "西班牙")
  14.                    .endObject();
  15.        } catch (IOException e) {
  16.            logger.error("----------indexDocByXContentBuilder create xContentBuilder failed", e);
  17.            return;
  18.        }
  19.        boolean result = IndexDocAPI.indexDocByXContentBuilder(client, index, type, id, xContentBuilder);
  20.        logger.info("--------- indexDocByXContentBuilder result {}", result);
  21.    }
备注:

你还可以通过startArray(string)和endArray()方法添加数组。.field()方法可以接受多种对象类型。你可以给它传递数字、日期、甚至其他XContentBuilder对象。



参考:https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-index.html#java-docs-index-generate



相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
30天前
|
存储 人工智能 自然语言处理
Elasticsearch Inference API增加对阿里云AI的支持
本文将介绍如何在 Elasticsearch 中设置和使用阿里云的文本生成、重排序、稀疏向量和稠密向量服务,提升搜索相关性。
67 14
Elasticsearch Inference API增加对阿里云AI的支持
|
14天前
|
JSON 前端开发 API
后端开发中的API设计与文档编写指南####
本文探讨了后端开发中API设计的重要性,并详细阐述了如何编写高效、可维护的API接口。通过实际案例分析,文章强调了清晰的API设计对于前后端分离项目的关键作用,以及良好的文档习惯如何促进团队协作和提升开发效率。 ####
|
18天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
48 4
|
27天前
|
Java API 数据处理
探索Java中的Lambda表达式与Stream API
【10月更文挑战第22天】 在Java编程中,Lambda表达式和Stream API是两个强大的功能,它们极大地简化了代码的编写和提高了开发效率。本文将深入探讨这两个概念的基本用法、优势以及在实际项目中的应用案例,帮助读者更好地理解和运用这些现代Java特性。
|
9天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
16天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
8天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
8天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
下一篇
无影云桌面