关于ES只更新少量数据,不批量处理

之前没有用过es直接上手的  如若有错误请指正

背景:新增数据界面可以单个录入,也可以批量录入。同事图简单,数据录入后,无论单个录入还是批量录入都使用BulkProcessor 进行批量处理

BulkProcessor bulkProcessor = esProcessor.getBulkProcessor();

bulkProcessor.add(new IndexRequest(esname_EN).source(JSONObject.toJSONString(data), XContentType.JSON));

。该方法确实没问题,但是代码执行后会有几秒的反应时间,用户体验不是很好。于是更改了需求,数据插入更新,界面需要实时显示。

开始:

插入更新使用同一个方法,所以一开始查看了官网的方法。

IndexRequest indexRequest = new IndexRequest("index", "type", "1")
        .source(jsonBuilder()
            .startObject()
                .field("name", "Joe Smith")
                .field("gender", "male")
            .endObject());

new 部分可以封装成:

 XContentBuilder builder = XContentFactory.jsonBuilder().startObject();

//document是新增或者修改该条数据的全量数据

Map<object,object> document = esIndexApiService.getDocument(arcTableName, id);

//for循环将所有字段加入builder

for (String key : document .keySet()) {
       builder.field(key, document .get(key));
}

builder.endObject();

// index指esdb,type指_doc,1指_id,官网写法

//IndexRequest indexRequest = new IndexRequest("index", "type", "1"); 

//但是在我的项目中实际是IndexRequest indexRequest = new IndexRequest("esdb", "_doc", "ev2_K30BoZQ27hu-lMdk");

//id这里有坑,后面再说

IndexRequest indexRequest = new IndexRequest("index", "type", "1");

indexRequest .source(builder);

UpdateRequest updateRequest = new UpdateRequest("index", "type", "1");

updateRequest .doc(builder).upsert(indexRequest);

//发送请求

restHighLevelClient.update(updateRequest , RequestOptions.DEFAULT);

该方法确实可以立马更新数据,但是无法自由自动新增

IndexRequest indexRequest = new IndexRequest("index", "type", "ev2_K30BoZQ27hu-lMdk");

第三个参数id必须指定!这就很不科学了,索引id一般自动生成,也可以自己定义id自增规则,但是除了特殊要求,一般用自带的就行了。

因为无法自由自动新增就舍弃了这个方法。

换为:先删除,再新增:代码如下:

ids用于查询数据库数据,arcTableName是该条数据的表名。

restHighLevelClient框架自动配置好了

public AjaxResult updateByIdsAndTablename2(List<String> ids, String arcTableName) {
        AjaxResult res = new AjaxResult();
        res.put("message", "更新成功!");
        res.put("code", 0);
        List<Map<String, Object>> datas = new ArrayList<>();
        List<Map<String, Object>> document = null;
        List<Map<String, Object>> maps = null;
        if (ids != null && ids.size() > 0) {
            for (String id : ids) {
                // 获取数据库数据
                String sql1 = "select * from " + arcTableName + " where id=" + id;
                maps = jdbcTemplate.queryForList(sql1);
                document = esIndexApiService.getDocument(arcTableName, id);
                if (maps != null && maps.size() > 0) {
                    datas.add(maps.get(0));
                }
            }
        }
        if (datas.size() > 0) {
            if (document.size() != 0) {
                //如果该条数据在索引存在,则先删除
                DeleteRequest deleteRequest = new DeleteRequest(esname_EN, document.get(0).get("_id").toString());
                try {
                    DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
                } catch (IOException e) {
                    res.put("message", "更新失败!");
                    res.put("code", -1);
                    res.put("data", "数据库中未找到任何数据!");
                    e.printStackTrace();
                }
            }
            for (Map<String, Object> data : datas) {
                data.put("table_name", arcTableName);
                IndexRequest source = new IndexRequest(esname_EN).source(JSONObject.toJSONString(data), XContentType.JSON);
                try {
                    IndexResponse index = restHighLevelClient.index(source, RequestOptions.DEFAULT);
                } catch (IOException e) {
                    res.put("message", "更新失败!");
                    res.put("code", -1);
                    res.put("data", "索引新增失败!");
                    e.printStackTrace();
                }
            }
        }
        return res;
    }

### 回答1: 是的,Elasticsearch可以通过HTTP API进行批量插入操作。你可以通过以下步骤进行批量插入: 1. 准备数据:将要插入的数据格式化为JSON格式,并按照ES要求的格式进行组织。每个文档应该包括一个唯一的ID。 2. 使用Bulk API进行批量插入:将准备好的数据通过HTTP POST请求发送到ES的Bulk API中。Bulk API允许在单个请求中插入多个文档。请求的URL应该是ES的索引URL加上`_bulk`路径。例如,如果你要将数据插入名为`my_index`的索引,那么请求的URL应该是`http://localhost:9200/my_index/_bulk`。 3. 解析响应:ES会返回一个JSON格式的响应,包含每个文档的插入状态和任何错误信息。 以下是一个示例批量插入的Python代码: ```python import requests import json # 准备数据 data = [ {"index": {"_index": "my_index", "_id": "1"}}, {"title": "Article 1", "content": "This is the first article."}, {"index": {"_index": "my_index", "_id": "2"}}, {"title": "Article 2", "content": "This is the second article."}, {"index": {"_index": "my_index", "_id": "3"}}, {"title": "Article 3", "content": "This is the third article."} ] # 发送请求 url = "http://localhost:9200/my_index/_bulk" headers = {"Content-Type": "application/json"} response = requests.post(url, headers=headers, data=json.dumps(data)) # 解析响应 if response.status_code == 200: results = json.loads(response.text) for item in results["items"]: if item["index"]["status"] == 201: print(f"Document {item['index']['_id']} inserted successfully.") else: print(f"Error inserting document {item['index']['_id']}: {item['index']['error']}") else: print(f"Error: {response.text}") ``` 在这个示例中,我们将三个文档插入到名为`my_index`的索引中。每个文档都有一个唯一的ID,因此我们可以在解析响应时识别每个文档的插入状态。 ### 回答2: Elasticsearch是一个基于Lucene的开源搜索引擎,采用分布式的方式来存储和检索数据。在Elasticsearch中,可以使用HTTP的方式来进行数据批量插入。 通过HTTP的方式批量插入数据是利用Elasticsearch的RESTful API来实现的。具体的步骤如下: 1. 准备要插入的数据:在批量插入之前,首先需要准备好要插入的数据,并将其组织成特定的格式。一般情况下,使用JSON格式来表示数据,并按照批量插入的要求进行格式化。 2. 构建HTTP请求:使用任意的HTTP客户端,可以通过POST方法向Elasticsearch的_bulk API发送批量插入请求。该API允许一次性插入多条数据,并且支持同时插入到多个索引中。 3. 发送HTTP请求:将构建好的HTTP请求发送到Elasticsearch的_bulk API的URL地址上。可以使用 curl 命令或者其他HTTP客户端工具来发送请求。 4. 处理响应结果:Elasticsearch将返回一个包含每条插入操作的结果的响应。可以通过解析响应结果来获取插入操作的状态、成功与否等信息。 需要注意的是,在进行批量插入时,为了提高性能,可以一次性插入多条数据。但是,如果插入的数据量过大,可能会导致请求超时或者负载过大。因此,建议在进行批量插入时,适当控制每次插入的数据量,选择合适的插入策略。 总而言之,通过HTTP的方式批量插入数据是利用Elasticsearch的RESTful API来实现的。通过准备数据、构建HTTP请求、发送请求以及处理响应结果等步骤,可以方便地实现数据批量插入。 ### 回答3: Elasticsearch是一个开源的搜索引擎,可以通过多种方式向其索引数据,其中一种方式是通过HTTP的方式进行批量插入。 使用HTTP的方式批量插入数据Elasticsearch,需要通过发送HTTP请求来与Elasticsearch的REST API进行交互。具体步骤如下: 1. 构建批量插入请求体:批量插入请求体是一个包含多个插入操作的JSON数组。每个插入操作包含两部分:操作类型和操作数据。操作类型可以是"index"、"create"、"update"或"delete",具体看需求。操作数据是要插入的文档数据。 2. 发送HTTP请求:将构建的批量插入请求体发送给Elasticsearch的_bulk接口,使用HTTP的POST方法发送请求。 3. 解析返回结果:Elasticsearch将返回一个JSON响应,包含每个插入操作的结果。可以根据需要解析响应结果,了解每个操作的执行情况。 需要注意的是,批量插入请求体的大小是有限制的,一般建议要一次性插入过多的数据,以免造成请求过大。 通过HTTP的方式批量插入数据相对简单,适用于一次性插入较少量数据。如果需要高效地插入大量数据,可以考虑使用Elasticsearch提供的更高级的客户端API,如Java API或Python API,这些API可以更好地利用Elasticsearch的分布式特性来提高插入性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值