ElasticSearch JavaAPI

Java Client Version: 6.2.4

参考资料:

1. 建立关闭ES连接

1.1. 集群版

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
public class EsDemo {
TransportClient client = null;

@Before
public void setUp() throws UnknownHostException {
// 创建settings,指定ES集群名
Settings settings = Settings.builder().put("cluster.name", "my-application").build();
// 创建client,指定服务器地址,建立连接
client = new PreBuiltTransportClient(settings).addTransportAddresses(new TransportAddress
(InetAddress.getByName("192.168.57.102"), 9300));
System.out.println(client);
}

@Test
public void test() {
GetResponse response = client.prepareGet("myindex", "person", "1").execute().actionGet();
System.out.println(response.getSourceAsString());
}

@After
public void tearDown() {
// 关闭连接
if (client != null) {
client.close();
}
}
}

1.2. 单机版

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
public class EsDemo {
TransportClient client = null;

@Before
public void setUp() throws UnknownHostException {
// 创建client,指定服务器地址,建立连接。单机版的集群参数为Settings.EMPTY
client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddresses(new TransportAddress
(InetAddress.getByName("192.168.57.102"), 9300));
System.out.println(client);
}

@Test
public void test() {
GetResponse response = client.prepareGet("myindex", "person", "1").execute().actionGet();
System.out.println(response.getSourceAsString());
}

@After
public void tearDown() {
// 关闭连接
if (client != null) {
client.close();
}
}
}

2. 查询

2.1. prepareGet(index, type, id) 根据id查询文档

1
2
3
4
5
6
@Test
public void prepareGet() {
// 指定 index/type/id
GetResponse response = client.prepareGet("jobbole", "doc", "d8d38d06c5c1b720e6f010af156bb849").execute().actionGet();
System.out.println(response.getSourceAsString());
}

2.2. 添加文档

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void test() throws IOException {
// 构建一个文档
XContentBuilder doc = XContentFactory.jsonBuilder()
.startObject()
.field("title", "article1")
.field("create_date", "2018-01-01")
.endObject();
// 添加文档,指定 index/type/id
IndexResponse response = client.prepareIndex("jobbole", "doc", UUID.randomUUID().toString())
.setSource(doc).get();
System.out.println(response.status());
}

2.3. 删除文档

1
2
3
4
5
6
@Test
public void testDelete() {
// 删除文档,指定 index/type/id
DeleteResponse response = client.prepareDelete("jobbole", "doc", "d743fa3d-561c-4434-8e00-5aa08d128185").get();
System.out.println(response.status());
}

2.4. 局部更新文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void testUpdate() throws Exception {
// 设置要局部更新的字段
XContentBuilder doc = XContentFactory.jsonBuilder().startObject()
.field("title", "hello world")
.field("content", "123456").endObject();

// 封装update请求
UpdateRequest request = new UpdateRequest();
request.index("jobbole")
.type("doc")
.id("1cd80e81-e402-492d-bd3f-07c0561fe632")
.doc(doc);

// 发送update请求
UpdateResponse response = client.update(request).get();
System.out.println(response.status());
}

2.5. upsert

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void testUpSert() throws Exception {
String id = "465d5d46-433c-469e-a2d9-25c73652e568";
// 封装要添加的文档
IndexRequest indexRequest = new IndexRequest("jobbole", "doc", id)
.source(XContentFactory.jsonBuilder().startObject()
.field("title", "hello world")
.field("content", "123456").endObject());

// 封装更新的文档
// upsert: 如果文档不存在,则执行添加操作,若存在,则局部更新
UpdateRequest updateRequest = new UpdateRequest("jobbole", "doc", id).doc(
XContentFactory.jsonBuilder().startObject()
.field("title", "aaabbb")
.endObject())
.upsert(indexRequest);

// 发送update请求
UpdateResponse response = client.update(updateRequest).get();
System.out.println(response.status());
}

2.6. mget批量查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
public void multiGet() {
MultiGetResponse response = client.prepareMultiGet()
// 指定要查询的各个文档的 index/type/id
.add("jobbole", "doc", "d8d38d06c5c1b720e6f010af156bb849")
.add("jobbole", "doc", "b29078ff2b754246daf901cba6a20190")
// 执行get()进行批量查询
.get();
for (MultiGetItemResponse item : response) {
// 取出每次查询的响应结果
GetResponse get = item.getResponse();
// 输出响应结果的source
if (get.isExists()) {
System.out.println(get.getSourceAsString());
}
}
}

2.7. bulk批量添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Test
public void bulkInsert() throws IOException {
BulkRequestBuilder bulkRequest = client.prepareBulk();

// 添加一次操作
bulkRequest.add(client.prepareIndex("jobbole", "doc", UUID.randomUUID().toString())
.setSource(
XContentFactory.jsonBuilder().startObject()
.field("title", "artile111")
.endObject()));
// 添加一次操作
bulkRequest.add(client.prepareIndex("jobbole", "doc", UUID.randomUUID().toString())
.setSource(
XContentFactory.jsonBuilder().startObject()
.field("title", "artile222")
.endObject()));
// 执行bulk
BulkResponse response = bulkRequest.get();

System.out.println(response.status());
if (response.hasFailures()) {
System.out.println("失败");
}
}

2.8. bulk批量条件删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
BulkByScrollResponse response = DeleteByQueryAction.INSTANCE
.newRequestBuilder(client)
// 查询条件
.filter(QueryBuilders.matchQuery("title", "article"))
// 指明index
.source("jobbole")
// 执行请求
.get();
// 获取删除的文档数
long deletedCount = response.getDeleted();
System.out.println(deletedCount);
}

2.9. matchAll查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Test
public void test() {
QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();

SearchResponse response =
// 指定 index
client.prepareSearch("jobbole")
.setQuery(queryBuilder)
// 取前3条
.setSize(3)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
// 输出source的json形式
System.out.println(hit.getSourceAsString());
// 得到source的Map形式
Map<String, Object> map = hit.getSourceAsMap();
map.forEach((k, v) -> {
System.out.println(k + ": " + v);
});
}
}

2.10. match查询

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void test() {
// 指定match查询的 字段以及值
QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", "linux");
SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.setSize(3)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.11. multiMatch查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
// 根据title和tags字段 查询含有linux关键词 的文档。第1个参数是关键词,后面N个参数是各个field
QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("linux", "title",
"tags");
SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.setSize(3)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.12. term查询

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void test() {
// title字段含有linux
QueryBuilder queryBuilder = QueryBuilders.termQuery("title", "linux");
SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.setSize(3)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.13. terms查询

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void test() {
// title字段含有 "linux"或"windows"
QueryBuilder queryBuilder = QueryBuilders.termsQuery("title", "linux", "windows");
SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.setSize(3)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.14. range查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Test
public void test() {
QueryBuilder queryBuilder = QueryBuilders
// 指定field
.rangeQuery("create_date")
// 指定范围
.from("1990-01-01").to("2019-01-01")
// 指定格式
.format("yyyy-MM-dd");
SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.setSize(3)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.15. prefix查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
QueryBuilder queryBuilder = QueryBuilders
.prefixQuery("title", "linux");

SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.setSize(3)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.16. wildcard查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
QueryBuilder queryBuilder = QueryBuilders
.wildcardQuery("title", "linux*");

SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.setSize(3)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.17. fuzzy查询

1
2
3
4
5
6
7
8
9
10
11
12
13
@Test
public void test() {
QueryBuilder queryBuilder = QueryBuilders
.fuzzyQuery("title", "linnx");

SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.18. type查询

查询指定index/type下所有的文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
QueryBuilder queryBuilder = QueryBuilders
// 指定 type
.typeQuery("doc");
SearchResponse response =
client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.19. ids查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
public void test() {
QueryBuilder queryBuilder = QueryBuilders
.idsQuery()
// 指定多个id
.addIds("d8d38d06c5c1b720e6f010af156bb849",
"b29078ff2b754246daf901cba6a20190",
"8033832ada5440b9015d447b6c1f32b0");
SearchResponse response =
client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.20. common查询

1
2
3
4
5
6
7
8
9
10
11
@Test
public void test() {
QueryBuilder queryBuilder = QueryBuilders.commonTermsQuery("title", "linux");
SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.21. queryStringQuery

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void test() {
// 对所有字段查询 包含"linux"但不包含"使用"
QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("+linux -使用");
SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

2.22. simpleQueryStringQuery

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void test() {
// 对所有字段查询 包含"linux"但不包含"使用"。不完全满足条件也能查到
QueryBuilder queryBuilder = QueryBuilders.simpleQueryStringQuery("+linux -使用");
SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

3. 聚合查询

3.1. max查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
AggregationBuilder aggregationBuilder = AggregationBuilders
// 聚合结果字段命名
.max("agg")
// 指定field
.field("like_num");
SearchResponse response = client
.prepareSearch("jobbole")
.addAggregation(aggregationBuilder)
.get();
Max agg = response.getAggregations().get("agg");
System.out.println(agg.getValue());
}

3.2. min查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
AggregationBuilder aggregationBuilder = AggregationBuilders
// 聚合结果字段命名
.min("agg")
// 指定field
.field("like_num");
SearchResponse response = client
.prepareSearch("jobbole")
.addAggregation(aggregationBuilder)
.get();
Min agg = response.getAggregations().get("agg");
System.out.println(agg.getValue());
}

3.3. avg查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
AggregationBuilder aggregationBuilder = AggregationBuilders
// 聚合结果字段命名
.avg("agg")
// 指定field
.field("like_num");
SearchResponse response = client
.prepareSearch("jobbole")
.addAggregation(aggregationBuilder)
.get();
Avg agg = response.getAggregations().get("agg");
System.out.println(agg.getValue());
}

3.4. sum查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
AggregationBuilder aggregationBuilder = AggregationBuilders
// 聚合结果字段命名
.sum("agg")
// 指定field
.field("like_num");
SearchResponse response = client
.prepareSearch("jobbole")
.addAggregation(aggregationBuilder)
.get();
Sum agg = response.getAggregations().get("agg");
System.out.println(agg.getValue());
}

3.5. cardinality查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
public void test() {
AggregationBuilder aggregationBuilder = AggregationBuilders
// 聚合结果字段命名
.cardinality("agg")
// 指定field
.field("like_num");
SearchResponse response = client
.prepareSearch("jobbole")
.addAggregation(aggregationBuilder)
.get();
Cardinality agg = response.getAggregations().get("agg");
System.out.println(agg.getValue());
}

4. 组合查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Test
public void test() {
QueryBuilder queryBuilder = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("title", "linux"))
.mustNot(QueryBuilders.matchQuery("title", "使用"))
.should(QueryBuilders.matchQuery("title", "python"))
.filter(QueryBuilders.rangeQuery("create_date")
.from("1990-01-01").to("2019-01-01")
.format("yyyy-MM-dd"));
SearchResponse response = client.prepareSearch("jobbole")
.setQuery(queryBuilder)
.get();
SearchHits hits = response.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
}

5. 查询建议

5.1. completion查询建议

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
@Test
public void test() {
CompletionSuggestionBuilder suggestionBuilder =
// 查询completion字段
new CompletionSuggestionBuilder("suggest")
// 设置要查询的文本,以及fuzziness
.prefix("linux", Fuzziness.TWO);

SearchResponse response = client.prepareSearch("jobbole")
// 指定type
.setTypes("doc")
// 设置suggest,并给建议结果命名
.suggest(new SuggestBuilder().addSuggestion("mysuggest", suggestionBuilder))
// 取前10条
.setFrom(0).setSize(10)
// 指定只返回"title"字段,第1个参数是include(要返回的),第2个参数是exclude(不允许返回的)
.setFetchSource("title", null)
.get();

Suggest suggest = response.getSuggest();

// 获取suggestion
CompletionSuggestion suggestion = suggest.getSuggestion("mysuggest");
List<CompletionSuggestion.Entry> entries = suggestion.getEntries();
for (CompletionSuggestion.Entry entry : entries) {
List<CompletionSuggestion.Entry.Option> options = entry.getOptions();
for (CompletionSuggestion.Entry.Option option : options) {
System.out.println("--------------------------------------");
// 得分
float score = option.getScore();
System.out.println("score: " + score);

// 命中的文档
SearchHit hit = option.getHit();
System.out.println(hit);
System.out.println("文档id: " + hit.getId());
System.out.println("文档type: " + hit.getType());
System.out.println("文档score: " + hit.getScore());
System.out.println("文档source: " + hit.getSourceAsMap().get("title"));

// suggest查询时的文本,即用户传入的文本
System.out.println("text: " + option.getText());

// 包括得分的基本信息
ScoreDoc doc = option.getDoc();
System.out.println(doc);
}
}
}
panchaoxin wechat
关注我的公众号
支持一下