# 基于 upsert 实现汽车最新价格的调整
首先需要手动 mapping,既然是模拟就稍微模拟真实一点。
PUT /car_shop
{
"mappings": {
"cars": {
"properties": {
"brand": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"raw": {
"type": "keyword"
}
}
},
"name": {
"type": "text",
"analyzer": "ik_max_word",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- brand:品牌名称,ik 中文分词,内置一个 raw 不分词字段
- name:汽车名称,同上
# upsert api
package cn.mrcode.newstudy.elasticsearch.senior;
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.concurrent.ExecutionException;
/**
* upsert 调整汽车价格
*
* @author : zhuqiang
* @date : 2019/3/13 22:19
*/
public class UpsertCarTest {
private TransportClient client;
@Before
public void before() throws UnknownHostException {
Settings settings = Settings.builder()
.put("cluster.name", "elasticsearch") // 集群名称
.put("client.transport.sniff", true) // 自动探查
.build();
client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
}
@Test
public void upsertCar() throws IOException, ExecutionException, InterruptedException {
// 当 id=1 不存在的时候新增,存在的时候更新汽车价格
IndexRequest upsertRequest = new IndexRequest("car_shop", "cars", "1");
upsertRequest.source(
XContentFactory.jsonBuilder()
.startObject()
.field("brand", "宝马")
.field("name", "宝马320")
.field("price", 320000)
.field("produce_date", "2017-01-01")
.endObject());
UpdateRequest updateRequest = new UpdateRequest("car_shop", "cars", "1");
updateRequest.doc(XContentFactory.jsonBuilder()
.startObject()
.field("price", 32_0000)
.endObject())
.upsert(upsertRequest); // 更新的时候关联一个 upsert
ActionFuture<UpdateResponse> update = client.update(updateRequest);
System.out.println(update.get());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
执行更新打印的结果信息
UpdateResponse[index=car_shop,type=cars,id=1,version=1,result=created,shards=ShardInfo{total=2, successful=1, failures=[]}]
1