Elasticsearch批量插入数据

本文介绍如何使用Java连接Elasticsearch集群,并实现创建索引、批量插入数据等操作。通过具体的代码示例,展示了如何配置客户端、定义索引映射及使用JSON构建数据模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 创建本地TransportClient:

    static TransportClient client = null;
	
	private static Logger logger = LoggerFactory.getLogger(ESUtils.class);
	
	public final static String HOST = "localhost";
	
	public final static int PORT = 9300;
	
	static Settings settings = Settings.builder().put("cluster.name","elasticsearch")
			.put("client.transport.sniff",true)
			.put("transport.type","netty3")
			.put("http.type", "netty3")
			.build();
	static {
		getConnection();
	}
	@SuppressWarnings({ "resource", "unchecked" })
	public static void getConnection() {
		try {
			client = new PreBuiltTransportClient(Settings.EMPTY)
					.addTransportAddress(new TransportAddress(InetAddress.getByName(HOST), PORT));
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
        logger.debug("Elasticsearch connect info:" + client.toString());
        }
	public void closeClient() {
		if(client != null) {
			client.close();
		}
	}
	public static void main(String[] args) {
		System.out.println(client);
	}

2. 创建索引:

    public void addIndexByName(String index, String type, TransportClient client) throws IOException {
		XContentBuilder mapper = XContentFactory.jsonBuilder().startObject().startObject("settings")
				.startObject("index")
				.field("number_of_shards",3).field("number_of_replicas",0)
				.endObject().endObject()
				.startObject("mappings").startObject(type)
				.field("dynamic","false")
				.startObject("_all").field("enabled",false)
				.endObject()
				.startObject("properties")
				.startObject("mnc").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("lac").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("ci").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("latitude").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("longtitude").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("uli").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("area_code").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("validity").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("address").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("province").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("city").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("district").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("township").field("type","keyword").field("ignore_above",128).endObject()
				.startObject("acc").field("type","keyword").field("ignore_above",128).endObject()
				.endObject().endObject().endObject().endObject();
		System.out.println(mapper);
		CreateIndexRequestBuilder cirb = client.admin().indices().prepareCreate(index).setSource(mapper);
		CreateIndexResponse reponse = cirb.execute().actionGet();
		mapper.close();
		if(reponse.isAcknowledged()) {
			System.out.println("创建索引成功");
		}else {
			System.out.println("创建索引失败");
		}
	}

3. Model实体:

public class Cellinfo {

	private String mnc;
	private String lac;
	private String ci;
	private String latitude;
	private String longtitude;
	private String uli;
	private String area_code;
	private String validity;
	private String address;
	private String province;
	private String city;
	private String district;
	private String township;
	private String acc;
	public Cellinfo() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getMnc() {
		return mnc;
	}
	public void setMnc(String mnc) {
		this.mnc = mnc;
	}
	...
	public String getAcc() {
		return acc;
	}
	public void setAcc(String acc) {
		this.acc = acc;
	}
	
    }

4. 批量插入数据:

    private void save(List<Cellinfo> list) {
		BulkRequestBuilder bulkRequest = ESUtils.client.prepareBulk();
		int count = 0;
		for(Cellinfo cell : list) {
			JSONObject json = JSONObject.fromObject(cell);
			bulkRequest.add(ESUtils.client.prepareIndex("cellinfo", "nx_type").setSource(json));
			
			if(++count%1000 == 0) {
				bulkRequest.execute().actionGet();
				bulkRequest = ESUtils.client.prepareBulk();
				System.out.println("插入-->"+1000+"--条!");
			}
			
		}
		bulkRequest.execute().actionGet();
		System.out.println("插入完毕,共计:"+count+"条...");
		
	}

4. maven依赖:

<!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport -->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>6.2.4</version>
</dependency>
<!-- 日志依赖 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.8.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.0</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.14</version>
</dependency>
<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

### Elasticsearch 批量插入数据的 SDL 语法 在 Elasticsearch 中,批量插入数据的操作通常通过 `_bulk` API 实现。以下是有关如何使用 Bulk API 插入数据的具体说明以及示例。 #### 使用 Bulk API 进行批量插入 Bulk API 是一种高效的接口,允许一次性执行多个索引、删除或其他操作。其请求体由多行组成,每两行为一组:第一行是一个 JSON 对象,表示要执行的操作;第二行是实际的数据文档(对于 `index` 或 `create` 操作)。需要注意的是,每一行都必须以换行符结束,并且最后一行也应有一个换行符[^5]。 以下是一个典型的批量插入数据的请求结构: ```json { "index": { "_index": "my_index", "_id": "1" } } { "field1": "value1", "field2": "value2" } { "index": { "_index": "my_index", "_id": "2" } } { "field1": "value3", "field2": "value4" } ``` 上述例子展示了两个文档被创建并存储到名为 `my_index` 的索引中。第一个文档具有 ID `1` 和字段值 `{ field1: "value1", field2: "value2"}`,第二个文档则有 ID `2` 并带有不同的字段值[^5]。 #### 发送 Bulk 请求的方式 可以通过多种方式发送 Bulk 请求给 Elasticsearch 集群,比如利用 curl 命令或者编程语言库来完成 HTTP POST 请求。下面展示了一个基于 curl 工具的例子: ```bash curl -H 'Content-Type: application/json' -XPOST localhost:9200/_bulk --data-binary @requests.json ``` 这里假设文件 `requests.json` 包含了之前提到的那种格式化好的 bulk 请求内容[^6]。 #### 设置内存和其他选项的影响 当处理大量数据时,可能还需要调整 JVM 堆大小等设置以优化性能。可以参考如下命令行参数来进行配置: ```bash ./elasticsearch -d -Xmx8g -Xms8g ``` 此命令将在后台启动 Elasticsearch,并分配最大和最小堆栈空间均为 8GB 来支持更复杂的查询需求或更大的数据集加载过程[^7]。 #### 日志级别调试建议 如果遇到任何问题,增加日志记录可以帮助诊断错误原因。例如启用 DEBUG 级别的日志输出可能会提供更多有用的信息以便排查故障所在之处: ```bash ./elasticsearch -Des.logger.level=DEBUG ``` 这一步骤能够帮助开发者更好地理解内部运作机制及其潜在瓶颈位置[^8]。 ### 总结 为了实现高效地向 Elasticsearch 导入大批量数据,推荐采用官方提供的 _bulk 接口方法。它不仅简化了程序设计复杂度而且提高了整体吞吐率表现。同时合理调节服务器资源配置也是不可或缺的一部分工作环节之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值