elasticsearch系列-使用Java客户端创建索引、mapping、文档

在前两篇我们介绍了通过postman和elasticsearch-head介绍了操作elasticsearch的增删改查操作和文档的添加、修改、搜索等基本操作。在实际工作中,难免使用Java对elasticsearch进行操作,本篇我们来介绍通过Java客户端如何创建索引、mappings和文档等。

引入maven依赖

引入elasticsearch和transport依赖如下所示。

        <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.6.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>6.6.1</version>
        </dependency>

elasticsearch.yml配置

在使用Java API对elasticsearch操作之前,需要在elasticsearch.yml中添加必要的配置,在elasticsearch.yml配置文件结尾处追加以下配置信息。

# elasticsearch集群名称
cluster.name: my-elasticsearch
# elasticsearch服务端口号
http.port: 9200
# 集群间通信端口号
transport.tcp.port: 9300

如果在一台物理机上存在多个elasticsearch服务实例形成一个集群,服务端口号及集群建通信端口号需要不同。

使用Java客户端操作elasticsearch

使用Java客户端创建索引

使用Java客户端创建索引库的步骤可以总结为以下几步:

  • 创建一个setting对象,相当于一个配置信息,主要配置集群名称。
  • 创建一个客户端client对象
  • 使用client对象创建一个索引库
  • 关闭client

创建代码示例如下所示。

    public static void createIndex(ElasticSearchParams elasticSearchParams) throws UnknownHostException {
        if (Objects.isNull(elasticSearchParams) || Strings.isNullOrEmpty(elasticSearchParams.getIndexName())
                || Strings.isNullOrEmpty(elasticSearchParams.getIp())
                || Objects.isNull(elasticSearchParams.getPort())
                || Strings.isNullOrEmpty(elasticSearchParams.getClusterName())
                || elasticSearchParams.getPort() <= 0) {
            log.error("参数不合法");
        }
        // 创建Settings
        Settings settings = Settings.builder()
                .put("cluster.name", elasticSearchParams.getClusterName())
                .put("client.transport.ignore_cluster_name", true)
                .build();
        // 创建transportclient对象
        TransportClient transportClient = new PreBuiltTransportClient(settings);
        transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName(elasticSearchParams.getIp()), elasticSearchParams.getPort()));

        transportClient.admin().indices().prepareCreate(elasticSearchParams.getIndexName())
                .get();
        transportClient.close();
    }

在执行上述demo代码后,通过了elasticsearch-head的插件查看创建索引库的创建情况,可以发现索引库创建成功,但是存在副本,如下图所示。在创建setting对象时,如何设置索引的分片与副本数量小编暂时还没有找到方法,希望有知道的小伙伴可以加以指点。
使用Java客户端创建索引

使用Java客户端对索引设置mapping信息

使用Java客户端对索引设置mapping信息的步骤总结为以下几步:

  • 创建一个settings对象
  • 创建一个client对象
  • 创建一个mapping信息,mapping信息为一个json数据,可以为字符串也可以使用XContextBuilder对象。
  • 使用client向elasticsearch服务器发送mapping信息
  • 关闭client对象

在设置mapping信息时,需要准备mapping信息,为一个json字符串,使用XContextBuilder构造json字符串,如下所示,其实就是一个json字符串的拼装,以startObject开始,endObject结束。

XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
                .startObject()
                    .startObject("house")
                        .startObject("properties")
                            .startObject("house_id")
                                .field("type", "long")
                                .field("store", true)
                            .endObject()
                            .startObject("house_guid")
                                .field("type", "text")
                                .field("store", true)
                                .field("analyzer", "ik_smart")
                            .endObject()
                            .startObject("house_name")
                                .field("type", "text")
                                .field("store", true)
                                .field("analyzer", "ik_smart")
                            .endObject()
                        .endObject()
                    .endObject()
                .endObject();

向elasticsearch的index中设置索引的过程如下所示。

public static boolean setMappings(ElasticSearchParams elasticSearchParams) throws IOException {
        TransportClient transportClient = buildTransportClient(elasticSearchParams);
        transportClient.admin().indices()
                // 设置要映射的
                .preparePutMapping(elasticSearchParams.getIndexName())
                // 设置要映射的type
                .setType("house")
                .setSource(elasticSearchParams.getXContentBuilder())
                .get();
        return true;
    }

    private static TransportClient buildTransportClient(ElasticSearchParams elasticSearchParams) throws UnknownHostException {
        if (Objects.isNull(elasticSearchParams) || Strings.isNullOrEmpty(elasticSearchParams.getIndexName())
                || Strings.isNullOrEmpty(elasticSearchParams.getIp())
                || Objects.isNull(elasticSearchParams.getPort())
                || Strings.isNullOrEmpty(elasticSearchParams.getClusterName())
                || elasticSearchParams.getPort() <= 0) {
            log.error("参数不合法");
            return null;
        }
        // 创建Settings
        Settings settings = Settings.builder()
                .put("cluster.name", elasticSearchParams.getClusterName())
                .put("client.transport.ignore_cluster_name", true)
                .build();

        // 创建transportclient对象
        TransportClient transportClient = new PreBuiltTransportClient(settings);
        transportClient.addTransportAddress(new TransportAddress(InetAddress.getByName(elasticSearchParams.getIp()), elasticSearchParams.getPort()));

        return transportClient;
    }

执行设置mapping信息后,通过elasticsearch-head查看为索引的设置的mapping信息,可以发现设置成功,如下图所示。
使用Java客户端设置mapping信息

使用Java客户端向索引中添加文档

在添加mapping信息后,就可以向索引中添加文档。同样添加过程可以总结为以下几步。

  • 创建一个Setting对象
  • 创建一个Client对象
  • 创建一个文档对象,即一个json字符串,同样可以使用XContextBuilder构造json字符串
  • 使用Client把文档添加到文档中
  • 关闭Client对象

下面是向索引中添加文档的示例代码。

    @Test
    public void addDocuments() throws IOException {
        ElasticSearchParams elasticSearchParams = new ElasticSearchParams();
        elasticSearchParams.setIndexName("20200128-xinghaol")
                .setIp("47.107.90.36")
                .setClusterName("my-elasticsearch")
                .setPort(9300);
        TransportClient transportClient = ElasticSearchUtil.obtainTransport(elasticSearchParams);
        XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
                .startObject()
                .field("house_id", "123456")
                .field("house_guid", "lsaldlsdlflskdkfk")
                .field("house_name", "elasticsearch测试房屋")
                .endObject();
        transportClient.prepareIndex(elasticSearchParams.getIndexName(), "house", "1")
                .setSource(xContentBuilder).get();
        transportClient.close();
    }

获取TransportClient方式与前面创建索引、mapping时相同,运行上述demo示例后,通过elasticsearch-head插件查看对应的index中已经存在我们添加的文档,如下图所示。
使用Java客户端添加文档

小节

本篇介绍了如何通过Java客户端向elasticsearch中创建索引,指定mapping信息,添加文档,对于初学者还是有所帮助。下一篇,我们将继续介绍如何通过Java客户端查询索引中的各个信息。

最后,希望全国疫情赶快过去,一线医护人员平安归来。武汉加油、中国加油。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以帮你回答这个问题。 使用Java客户端创建索引和映射,需要连接Elasticsearch服务器,并使用Elasticsearch Java API进行操作。以下是一个简单的示例代码,用于创建索引和映射: ```java import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.common.xcontent.json.JsonXContent; import java.io.IOException; public class ElasticSearchIndexAndMapping { private static final String INDEX_NAME = "example_index"; private static final String TYPE_NAME = "example_type"; public static void main(String[] args) throws IOException { RestHighLevelClient client = new RestHighLevelClient(/* your Elasticsearch client configuration */); // Create index request CreateIndexRequest request = new CreateIndexRequest(INDEX_NAME); // Create index mapping XContentBuilder builder = XContentFactory.jsonBuilder(); builder.startObject(); { builder.startObject("properties"); { builder.startObject("field1"); { builder.field("type", "text"); } builder.endObject(); } builder.endObject(); } builder.endObject(); // Put mapping request PutMappingRequest mappingRequest = new PutMappingRequest(INDEX_NAME); mappingRequest.type(TYPE_NAME); mappingRequest.source(builder); // Execute requests client.indices().create(request, RequestOptions.DEFAULT); client.indices().putMapping(mappingRequest, RequestOptions.DEFAULT); client.close(); } } ``` 在此示例中,我们使用了 `CreateIndexRequest` 和 `PutMappingRequest` 类来创建索引和映射。我们首先创建了一个名为 `example_index` 的索引,并指定了一个名为 `example_type` 的类型。然后,我们使用 `XContentBuilder` 来构建映射。在此示例中,我们只创建了一个名为 `field1` 的字段,并将其类型设置为 `text`。最后,我们使用 `RestHighLevelClient` 来执行创建索引和映射的请求。 请注意,以上示例仅表示如何创建索引和映射。如果您需要更详细的功能,例如添加文档或查询索引,请查看Elasticsearch Java API文档

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值