-
Notifications
You must be signed in to change notification settings - Fork 196
/
Copy pathFlatObjectBasics.java
119 lines (95 loc) · 5.11 KB
/
FlatObjectBasics.java
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/
package org.opensearch.client.samples;
import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.client.opensearch._types.FieldValue;
import org.opensearch.client.opensearch._types.mapping.FlatObjectProperty;
import org.opensearch.client.opensearch._types.mapping.Property;
import org.opensearch.client.opensearch.core.IndexRequest;
import org.opensearch.client.opensearch.core.SearchRequest;
import org.opensearch.client.opensearch.core.SearchResponse;
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
import org.opensearch.client.samples.util.IssueDocument;
public class FlatObjectBasics {
private static final Logger LOGGER = LogManager.getLogger(IndexingBasics.class);
public static void main(String[] args) {
try {
var client = SampleClient.create();
var version = client.info().version();
LOGGER.info("Server: {}@{}", version.distribution(), version.number());
final var indexName = "flat_object-sample";
// Create a new index with an "issue" field with flat_object type
if (!client.indices().exists(e -> e.index(indexName)).value()) {
final CreateIndexRequest createIndexRequest = new CreateIndexRequest.Builder().index(indexName)
.mappings(m -> m.properties("issue", Property.of(p -> p.flatObject(new FlatObjectProperty.Builder().build()))))
.build();
client.indices().create(createIndexRequest);
}
// Index some flat object documents
final IssueDocument issueDocument = new IssueDocument();
final IssueDocument.Issue issue = new IssueDocument.Issue();
issue.setNumber("123456");
final IssueDocument.Labels labels = new IssueDocument.Labels();
labels.setBackport(List.of("1.3", "2.0"));
labels.setVersion("2.1");
final IssueDocument.Category category = new IssueDocument.Category();
category.setType("API");
category.setLevel("enhancement");
labels.setCategory(category);
issue.setLabels(labels);
issueDocument.setIssue(issue);
final IndexRequest<IssueDocument> indexRequest = new IndexRequest.Builder<IssueDocument>().index(indexName)
.id("1")
.document(issueDocument)
.build();
client.index(indexRequest);
// Index second document
final IssueDocument document2 = new IssueDocument();
final IssueDocument.Issue issue2 = new IssueDocument.Issue();
issue2.setNumber("123457");
IssueDocument.Labels labels2 = new IssueDocument.Labels();
labels2.setVersion("2.2");
IssueDocument.Category category2 = new IssueDocument.Category();
category2.setType("API");
category2.setLevel("bug");
labels2.setCategory(category2);
issue2.setLabels(labels2);
document2.setIssue(issue2);
final IndexRequest<IssueDocument> indexRequest2 = new IndexRequest.Builder<IssueDocument>().index(indexName)
.id("2")
.document(document2)
.build();
client.index(indexRequest2);
// wait for the document to index - as refresh period is set to 3s
Thread.sleep(3000);
// Search for the documents
// Ref: https://opensearch.org/docs/latest/field-types/supported-field-types/flat-object/
// Even if you don’t know the field names, you can search for a leaf value in the entire flat object.
// For example, the following request searches for all issues labeled as bugs
SearchRequest searchRequest = new SearchRequest.Builder().index(indexName)
.query(q -> q.match(m -> m.field("issue").query(FieldValue.of("bug"))))
.build();
SearchResponse<IssueDocument> searchResponse = client.search(searchRequest, IssueDocument.class);
for (var hit : searchResponse.hits().hits()) {
LOGGER.info("Found {} with score {}", hit.source(), hit.score());
}
// Alternatively, if you know the subfield name in which to search, provide the field’s path in dot notation
SearchRequest searchRequest2 = new SearchRequest.Builder().index(indexName)
.query(q -> q.match(m -> m.field("issue.labels.category.level").query(FieldValue.of("bug"))))
.build();
SearchResponse<IssueDocument> searchResponse2 = client.search(searchRequest2, IssueDocument.class);
for (var hit : searchResponse2.hits().hits()) {
LOGGER.info("Found {} with score {}", hit.source(), hit.score());
}
} catch (Exception e) {
LOGGER.error("Unexpected exception", e);
}
}
}