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

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 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



相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
目录
相关文章
|
6月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
存储 人工智能 API
(Elasticsearch)使用阿里云 infererence API 及 semantic text 进行向量搜索
本文展示了如何使用阿里云 infererence API 及 semantic text 进行向量搜索。
648 8
|
Unix API 索引
Elasticsearch集群使用 _cat/health API
Elasticsearch集群使用 _cat/health API
350 1
|
监控 API 索引
Elasticsearch集群使用 _cluster/health API
Elasticsearch集群使用 _cluster/health API
647 2
|
存储 算法 Java
Java零基础-charAt(int index)详解
【10月更文挑战第20天】Java零基础教学篇,手把手实践教学!
474 4
|
存储 算法 Java
Java零基础-charAt(int index)详解
【10月更文挑战第16天】Java零基础教学篇,手把手实践教学!
342 1
|
存储 人工智能 自然语言处理
Elasticsearch Inference API增加对阿里云AI的支持
本文将介绍如何在 Elasticsearch 中设置和使用阿里云的文本生成、重排序、稀疏向量和稠密向量服务,提升搜索相关性。
633 14
Elasticsearch Inference API增加对阿里云AI的支持
|
缓存 Java 关系型数据库
【Java面试题汇总】ElasticSearch篇(2023版)
倒排索引、MySQL和ES一致性、ES近实时、ES集群的节点、分片、搭建、脑裂、调优。
【Java面试题汇总】ElasticSearch篇(2023版)
|
Java
Java计算机IT编程文档常见单词翻译(四)
Java计算机IT编程文档常见单词翻译(四)
220 0
Java计算机IT编程文档常见单词翻译(四)
|
Java
Java计算机IT编程文档常见单词翻译(三)
Java计算机IT编程文档常见单词翻译(三)
213 0
Java计算机IT编程文档常见单词翻译(三)
下一篇
开通oss服务