import org.apache.hc.client5.http.auth.AuthScope;
import org.apache.hc.client5.http.auth.UsernamePasswordCredentials;
import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager;
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
import org.apache.hc.core5.function.Factory;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
import org.apache.hc.core5.reactor.ssl.TlsDetails;
import org.apache.hc.core5.ssl.SSLContextBuilder;
import org.apache.hc.core5.util.Timeout;
import org.opensearch.client.json.JsonData;
import org.opensearch.client.opensearch.OpenSearchClient;
import org.opensearch.client.opensearch._types.FieldValue;
import org.opensearch.client.opensearch._types.mapping.KnnVectorProperty;
import org.opensearch.client.opensearch._types.mapping.Property;
import org.opensearch.client.opensearch._types.mapping.TextProperty;
import org.opensearch.client.opensearch._types.mapping.TypeMapping;
import org.opensearch.client.opensearch.cluster.HealthResponse;
import org.opensearch.client.opensearch.core.*;
import org.opensearch.client.opensearch.indices.CreateIndexRequest;
import org.opensearch.client.opensearch.indices.IndexSettings;
import org.opensearch.client.opensearch.indices.PutIndicesSettingsRequest;
import org.opensearch.client.opensearch.indices.RefreshRequest;
import org.opensearch.client.transport.OpenSearchTransport;
import org.opensearch.client.transport.httpclient5.ApacheHttpClient5TransportBuilder;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;
import java.util.Base64;
import java.util.concurrent.TimeUnit;
public class OSinitClientTest {
public OpenSearchClient initClientIgnoreCA(HttpHost[] hosts, String user, String password) throws Exception {
if (hosts == null || hosts.length == 0) {
throw new IllegalArgumentException("invalid empty hosts");
BasicCredentialsProvider provider = new BasicCredentialsProvider();
for (HttpHost host : hosts) {
provider.setCredentials(new AuthScope(host), new UsernamePasswordCredentials(user, password.toCharArray()));
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (x509Certificates, s) -> true).build();
final ApacheHttpClient5TransportBuilder builder = ApacheHttpClient5TransportBuilder.builder(hosts);
builder.setHttpClientConfigCallback(httpClientBuilder -> {
final TlsStrategy tlsStrategy = ClientTlsStrategyBuilder.create()
.setSslContext(sslContext)
.setTlsDetailsFactory(new Factory<SSLEngine, TlsDetails>() {
public TlsDetails create(final SSLEngine sslEngine) {
return new TlsDetails(sslEngine.getSession(), sslEngine.getApplicationProtocol());
final PoolingAsyncClientConnectionManager connectionManager = PoolingAsyncClientConnectionManagerBuilder
.setTlsStrategy(tlsStrategy)
.setMaxConnPerRoute(1000)
.setDefaultConnectionConfig(ConnectionConfig.custom()
.setTimeToLive(300, TimeUnit.SECONDS)
.setConnectTimeout(Timeout.ofSeconds(5))
.setSocketTimeout(Timeout.ofSeconds(60))
return httpClientBuilder
.setDefaultCredentialsProvider(provider)
.setConnectionManager(connectionManager);
final OpenSearchTransport transport = builder.build();
return new OpenSearchClient(transport);
public static void main(String[] args) throws Exception {
OpenSearchClient client = new OSinitClientTest().initClientIgnoreCA(
new HttpHost[]{new HttpHost("<https|http>","<接入点地址>", 9200)},
HealthResponse health = client.cluster().health();
System.out.println("current cluster status is: " + health.status());N
String index = "sample-index";
final KnnVectorProperty nameVector = KnnVectorProperty.of(
.method(m -> m.spaceType("cosinesimil")
.parameters("L", JsonData.of(30))
.parameters("R", JsonData.of(32))
client.indices().create(ci -> ci.index(index)
builder -> builder.properties(
"firstName", p -> p.text(t -> t.analyzer("ik_smart"))
).properties("nameVector", p -> p.knnVector(nameVector))
.settings(s -> s.index(indexSetting -> indexSetting.knn(true))));
client.indices().putSettings(ps -> ps.index(index)
.settings(s -> s.autoExpandReplicas("0-all"))
IndexData indexData = new IndexData( "云搜索", new Float[]{ 1.0f,1.0f,1.0f,1.0f});
client.index(ib -> ib.index(index).id("1").document(indexData));
client.indices().refresh(r -> r.index(index));
String json_query = "{\"match\":{ \"firstName\": \"云搜索\"}}";
String encodedJSON = Base64.getEncoder().encodeToString(json_query.getBytes());
SearchResponse<IndexData> search_by_json = client.search(
q -> q.wrapper(m -> m.query(encodedJSON))),
System.out.println(search_by_json.hits().hits().get(0).source().getFirstName());
SearchResponse<IndexData> search_res = client.search(
match -> match.field("firstName")
.query(f -> f.stringValue("云搜索"))
System.out.println(search_res.hits().hits().get(0).source().getFirstName());
SearchResponse<IndexData> vector_res = client.search(
knn -> knn.field("nameVector")
.vector(new float[]{ 1.0f, 1.0f, 1.0f, 1.0f})
System.out.println(vector_res.hits().hits().get(0).source().getFirstName());
IndexData updateData = new IndexData();
updateData.setFirstName("OpenSearch");
client.update(r -> r.id("1").doc(updateData).index(index),IndexData.class);
client.indices().refresh(r -> r.index(index));
GetResponse<IndexData> getRes = client.get(r -> r.id("1").index(index), IndexData.class);
System.out.println(getRes.source().getFirstName());
client.delete(b -> b.index(index).id("1"));
client.indices().delete( r -> r.index(index));
private String firstName;
private Float[] nameVector;
public IndexData(String firstName, Float[] nameVector) {
this.firstName = firstName;
this.nameVector = nameVector;
public void setFirstName(String firstName) {
this.firstName = firstName;
public void setNameVector(Float[] nameVector) {
this.nameVector = nameVector;
public String getFirstName() {
public Float[] getNameVector() {