All Products
Search
Document Center

OpenSearch:Query data

Last Updated:Oct 30, 2026

This topic describes how to use Java, Python, Go, and asynchronous Java to perform vector retrieval, prediction retrieval, and retrieval with filter conditions.

Dependencies

Java

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-sdk-ha3engine-vector</artifactId>
    <version>1.1.18</version>
</dependency>

python

# Requires: Python >=3.6
pip install alibabacloud_ha3engine_vector==1.1.18

Go

go get github.com/aliyun/alibabacloud-ha3-go-sdk@v1.1.18-vector

Asynchronous Java

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>aliyun-sdk-ha3engine-async</artifactId>
  <version>1.1.8</version>
</dependency>

Parameters

You must configure the following four required parameters in both the Java and Python SDKs (endpoint,instance_id,access_user_name,access_pass_word):

  • endpoint: the internal or public endpoint

You can view it in the Network Information and API Endpoint sections of the instance details page:

After you enable Internet access, you can call the instance from your local environment by using the public endpoint (the endpoint that contains public). For information about how to configure the IP address whitelist for access, see Add a whitelist.

If you have an ECS instance, you can configure the same vSwitch and call the instance by using the API endpoint.

  • instance_id: the instance ID

You can view the instance ID at the top of the Instances or Instance Details page. Example: (ha-cn-zpr3dgzxg04).

  • access_user_name: the username

  • access_pass_word: the password

You can view the username and password in the API Endpoint section of the instance details page. (The password is set when you purchase the instance and can be changed.)

For example, the Username is admin,Password is displayed as Configured.

Vector retrieval

Syntax

  1. table_name: the name of the table to query.

  2. vector: the vector data to query. Note that the dimension of the query must be the same as the dimension configured for the vector index.

  3. vector_count: the number of vectors in the vector field. For example, the default value 2 indicates that the query contains two vectors.

  4. include_vector: specifies whether to return the vector information in documents.

  5. output_fields: the list of fields whose values are returned.

  6. top_k: the number of results to return. You can set this parameter based on your requirements.

  7. filter: the filter expression, which allows you to specify filter conditions. For more information about the syntax, see Filter expressions syntax.

  8. search_params: the query parameters. For more information, see QcSearcher,HnswSearcher.

  9. queries: the queries to execute. You can submit multiple queries.

Simple retrieval

Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.Config;
import com.aliyun.ha3engine.vector.models.QueryRequest;
import com.aliyun.ha3engine.vector.models.SearchResponse;
import com.aliyun.tea.TeaException;

import org.junit.Before;
import org.junit.Test;

public class Demo {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void query() throws Exception {
        try {
            QueryRequest request = new QueryRequest();
            request.setTableName("gist"); // Required. Table to query
            request.setVector(Arrays.asList(0.183762561f, 0.738372617f)); // Required. Query vectors
            request.setTopK(100); // Optional. Number of results to return
            request.setIncludeVector(true); // Optional. Whether to return document vectors
            
            SearchResponse searchResponse = client.query(request);
            System.out.println("Search results:\n" + searchResponse.getBody());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }

}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector.models import QueryRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

request = QueryRequest(table_name="gist",
                    	vector=[0.1, 0.2, 0.3],
                        include_vector=True,
                        top_k=10)
result = client.query(request)

Go

package main

import (
    "fmt"
    "github.com/alibabacloud-go/tea-utils/v2/service"
    "github.com/alibabacloud-go/tea/tea"
    ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
)

func main() {

    //Create a request client
    config := &ha3engine.Config{
        // API endpoint, available under Instance Details > API Endpoint
        Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        // Username, available under Instance Details > API Endpoint
        AccessUserName: tea.String("username"),
        // Password, configurable under Instance Details > API Endpoint
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    // Initialize a client to send requests.
    client, _clientErr := ha3engine.NewClient(config)

    // If NewClient fails, return _clientErr and print the error.
    if _clientErr != nil {
        fmt.Println(_clientErr)
        return
    }

    query(client)
}

/**
 *	Simple query
 */
func query(client *ha3engine.Client) {

    searchRequestModel := &ha3engine.QueryRequest{}
    searchRequestModel.SetTableName("test1")

    // Create an array of float32 pointers
    ids := make([]*float32, 4)

    // Assign values to the pointer array
    ids[0] = tea.Float32(0.1)
    ids[1] = tea.Float32(0.2)
    ids[2] = tea.Float32(0.3)
    ids[3] = tea.Float32(0.4)

    searchRequestModel.SetVector(ids)

    response, _requestErr := client.Query(searchRequestModel)

    // If sending the request fails, return _requestErr and print the error.
    if _requestErr != nil {
        fmt.Println(_requestErr)
        return
    }

    // Print the successful response.
    fmt.Println(response)
}

Asynchronous Java

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * @author alibaba
 */
public class SimpleQuery {

    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void simpleQuery() {
        try {
            QueryRequest queryRequest = QueryRequest.builder()
                    .tableName("table_name") // Table to query
                    .indexName("index_name") // Index to query
                    .vector(Arrays.asList(0.0001575F, 0.00682848F)) // Query vectors
                    .topK(10) // Number of results to return
                    .includeVector(true) //Whether to return document vectors
                    .build();
            
            CompletableFuture<SearchResponse> responseCompletableFuture = client.query(queryRequest);
            String responseBody = responseCompletableFuture.get().getBody();
            System.out.println("result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Multi-vector retrieval

A single retrieval can contain multiple vectors. The retrieval results are merged and sorted, and the optimal top K results are returned.

Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.Config;
import com.aliyun.ha3engine.vector.models.QueryRequest;
import com.aliyun.ha3engine.vector.models.SearchResponse;
import com.aliyun.tea.TeaException;

import org.junit.Before;
import org.junit.Test;

public class Demo {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void query() throws Exception {
        try {
            QueryRequest request = new QueryRequest();
            request.setTableName("gist"); // Required. Table to query
            request.setVector(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f)); // Required. Query vectors
            request.setVectorCount(2); // Optional. Number of vectors in the vector field
            request.setTopK(100); // Optional. Number of results to return
            request.setIncludeVector(true); // Optional. Whether to return document vectors
            request.setOutputFields(new ArrayList<String>()); // Optional. Fields to return
            request.setFilter("a>10"); // Optional. Filter expression
            
            SearchResponse searchResponse = client.query(request);
            System.out.println("Search results:\n" + searchResponse.getBody());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }

}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector.models import QueryRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

request = QueryRequest(table_name="t1",
                        vector=[0.1, 0.2, 0.3, 0.4],
                        vector_count=2,
                        include_vector=True,
                        filter="a > 10",
                        output_fields=["a", "b"]
                        top_k=10)
result = client.query(request)

Go

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
	"sync"
)

func main() {

	//Create a request client
	config := &ha3engine.Config{
		// API endpoint, available under Instance Details > API Endpoint
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// Username, available under Instance Details > API Endpoint
		AccessUserName: tea.String("username"),
		// Password, configurable under Instance Details > API Endpoint
		AccessPassWord: tea.String("password"),
		RuntimeOptions: &service.RuntimeOptions{
			KeepAlive:    tea.Bool(true),
			MaxIdleConns: tea.Int(1000),
			ReadTimeout:  tea.Int(1000),
		},
	}

	// Initialize a client to send requests.
	client, _clientErr := ha3engine.NewClient(config)

	// If NewClient fails, return _clientErr and print the error.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}

	multiVectorQuery(client)
}

func multiVectorQuery(client *ha3engine.Client) {

	queryRequest := &ha3engine.QueryRequest{}
	queryRequest.SetTableName("test1")

	// Create an array of float32 pointers
	ids := make([]*float32, 8)

	// Assign values to the pointer array
	ids[0] = tea.Float32(0.1)
	ids[1] = tea.Float32(0.2)
	ids[2] = tea.Float32(0.3)
	ids[3] = tea.Float32(0.4)
	ids[4] = tea.Float32(0.1)
	ids[5] = tea.Float32(0.2)
	ids[6] = tea.Float32(0.3)
	ids[7] = tea.Float32(0.4)

	queryRequest.SetVector(ids)
	queryRequest.SetVectorCount(2)

	response, _requestErr := client.Query(queryRequest)

	// If sending the request fails, return _requestErr and print the error.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	// Print the successful response.
	fmt.Println(response)
}

Asynchronous Java

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * Multi-vector query
 */
public class MultiVectorQuery {

    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test

    public void multiVectorQuery() {
        try {
            QueryRequest queryRequest = QueryRequest.builder()
                    .tableName("test1") // Table to query
                    .indexName("vector") // Index to query
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F,0.62498F, 0.886408F, 0.586114F, 0.043189F)) // Query vectors
                    .vectorCount(2)// Optional. Number of vectors in the vector field
                    .topK(10) // Number of results to return
                    .includeVector(false) //Whether to return document vectors
                    .build();

            CompletableFuture<SearchResponse> responseCompletableFuture = client.query(queryRequest);
            String responseBody = responseCompletableFuture.get().getBody();
            System.out.println("query result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Namespace retrieval

OpenSearch Vector Search Edition allows you to partition an index by namespace. After you configure namespaces for a vector index, you can query within a specified namespace. This way, different query requests can search different subsets of the index.

Note: After you configure a namespace, you must specify the namespace in queries.

Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.Config;
import com.aliyun.ha3engine.vector.models.QueryRequest;
import com.aliyun.ha3engine.vector.models.SearchResponse;
import com.aliyun.tea.TeaException;

import org.junit.Before;
import org.junit.Test;

public class Demo {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void query() throws Exception {
        try {
            QueryRequest request = new QueryRequest();
            request.setTableName("gist"); // Required. Table to query
            request.setVector(Arrays.asList(0.183762561f, 0.738372617f)); // Required. Query vectors
            request.setNamespace("namespace"); // Optional. Query vector namespace
            request.setTopK(100); // Optional. Number of results to return
            request.setIncludeVector(true); // Optional. Whether to return document vectors
            
            SearchResponse searchResponse = client.query(request);
            System.out.println("Search results:\n" + searchResponse.getBody());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }

}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector.models import QueryRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

request = QueryRequest(table_name="t1",
                        namespace="space_b",
                        vector=[0.1, 0.2],
                        include_vector=True,
                        top_k=10)
result = client.query(request)

Go

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
	"sync"
)

func main() {

	//Create a request client
	config := &ha3engine.Config{
		// API endpoint, available under Instance Details > API Endpoint
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// Username, available under Instance Details > API Endpoint
		AccessUserName: tea.String("username"),
		// Password, configurable under Instance Details > API Endpoint
		AccessPassWord: tea.String("password"),
		RuntimeOptions: &service.RuntimeOptions{
			KeepAlive:    tea.Bool(true),
			MaxIdleConns: tea.Int(1000),
			ReadTimeout:  tea.Int(1000),
		},
	}

	// Initialize a client to send requests.
	client, _clientErr := ha3engine.NewClient(config)

	// If NewClient fails, return _clientErr and print the error.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}

	nameSpaceQuery(client)
}

func nameSpaceQuery(client *ha3engine.Client) {

	searchRequestModel := &ha3engine.QueryRequest{}
	searchRequestModel.SetTableName("test1")

	// Create an array of float32 pointers
	ids := make([]*float32, 4)

	// Assign values to the pointer array
	ids[0] = tea.Float32(0.1)
	ids[1] = tea.Float32(0.2)
	ids[2] = tea.Float32(0.3)
	ids[3] = tea.Float32(0.4)

	searchRequestModel.SetVector(ids)
	searchRequestModel.SetNamespace("1")

	response, _requestErr := client.Query(searchRequestModel)

	// If sending the request fails, return _requestErr and print the error.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	// Print the successful response.
	fmt.Println(response)
}

Asynchronous Java

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class NameSpaceQuery {
    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void nameSpaceQuery() {
        try {
            QueryRequest queryRequest = QueryRequest.builder()
                    .tableName("test1") // Table to query
                    .indexName("vector") // Index to query
                    .namespace("1")
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F)) // Query vectors
                    .topK(10) // Number of results to return
                    .includeVector(false) //Whether to return document vectors
                    .build();

            CompletableFuture<SearchResponse> responseCompletableFuture = client.query(queryRequest);
            String responseBody = responseCompletableFuture.get().getBody();
            System.out.println("query result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Multi-namespace retrieval

After you configure namespaces for a vector index, you can query across multiple namespaces.

Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.*;
import com.aliyun.tea.TeaException;

import org.junit.Before;
import org.junit.Test;

public class Demo {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void multiQuery() throws Exception {
        try {
            MultiQueryRequest request = new MultiQueryRequest();
            request.setTableName("gist");
            request.setTopK(3);
            request.setIncludeVector(true);

            QueryRequest query1 = new QueryRequest();
            query1.setVector(Arrays.asList(0.1f, 0.2f, 0.3f));
            query1.setNamespace("space_a");

            QueryRequest query2 = new QueryRequest();
            query2.setVector(Arrays.asList(0.1f, 0.2f, 0.3f));
            query2.setNamespace("space_b");

            request.setQueries(Arrays.asList(query1, query2));

            SearchResponse searchResponse = client.multiQuery(request);
            System.out.println("Search results:\n" + searchResponse.getBody());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }

}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector.models import QueryRequest
from alibabacloud_ha3engine_vector.models import MultiQueryRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

q1 = QueryRequest(vector=[0.1, 0.2, 0.3], namespace="space_a")
q2 = QueryRequest(vector=[0.4, 0.5, 0.6], namespace="space_b")
request = MultiQueryRequest(table_name = "gist", 
                            queries=[q1, q2], 
                            top_k=3, 
                            include_vector=True)
result = client.multi_query(request)

Go

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
	"sync"
)

func main() {

	//Create a request client
	config := &ha3engine.Config{
		// API endpoint, available under Instance Details > API Endpoint
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// Username, available under Instance Details > API Endpoint
		AccessUserName: tea.String("username"),
		// Password, configurable under Instance Details > API Endpoint
		AccessPassWord: tea.String("password"),
		RuntimeOptions: &service.RuntimeOptions{
			KeepAlive:    tea.Bool(true),
			MaxIdleConns: tea.Int(1000),
			ReadTimeout:  tea.Int(1000),
		},
	}

	// Initialize a client to send requests.
	client, _clientErr := ha3engine.NewClient(config)

	// If NewClient fails, return _clientErr and print the error.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}

	multiNameSpaceQuery(client)
}

func multiNameSpaceQuery(client *ha3engine.Client) {

	query1 := &ha3engine.QueryRequest{}
	// Create an array of float32 pointers
	array := make([]*float32, 4)

	// Allocate memory and initialize the values
	value1 := float32(1.23)
	value2 := float32(4.56)
	value3 := float32(7.89)
	value4 := float32(7.89)

	// Assign values to the pointer array
	array[0] = &value1
	array[1] = &value2
	array[2] = &value3
	array[3] = &value4

	query1.SetVector(array)
	query1.SetNamespace("space_a")

	query2 := &ha3engine.QueryRequest{}
	query2.SetVector(array)
	query2.SetNamespace("space_b")

	request := &ha3engine.MultiQueryRequest{}

	request.SetTableName("test2")

	querys := make([]*ha3engine.QueryRequest, 2)
	querys[0] = query1
	querys[1] = query2
	request.SetQueries(querys)
	request.SetTopK(10)
	request.SetIncludeVector(false)
	request.SetOrder("DESC")

	response, _requestErr := client.MultiQuery(request)

	// If sending the request fails, return _requestErr and print the error.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	// Print the successful response.
	fmt.Println(response)
}

Asynchronous Java

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.MultiQueryRequest;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class MultiNameSpaceQuery {
    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void multiNameSpaceQuery() {
        try {
            QueryRequest query1 = QueryRequest.builder()
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F))
                    .namespace("space_a")
                    .build();
            QueryRequest query2 = QueryRequest.builder()
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F))
                    .namespace("space_b")
                    .build();
            MultiQueryRequest request = MultiQueryRequest.builder()
                    .tableName("test1")// Table to query
                    .topK(3)
                    .includeVector(false)// Whether to return document vectors
                    .queries(Arrays.asList(query1, query2))// Query conditions for multiple namespaces
                    .build();

            CompletableFuture<SearchResponse> responseCompletableFuture = client.multiQuery(request);
            String responseBody = responseCompletableFuture.get().getBody();

            System.out.println("multiQuery result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Retrieval with filter conditions

You can use Filter expressions to specify filter conditions for queries.

Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.Config;
import com.aliyun.ha3engine.vector.models.QueryRequest;
import com.aliyun.ha3engine.vector.models.SearchResponse;
import com.aliyun.tea.TeaException;

import org.junit.Before;
import org.junit.Test;

public class Demo {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void query() throws Exception {
        try {
            QueryRequest request = new QueryRequest();
            request.setTableName("gist"); // Required. Table to query
            request.setVector(Arrays.asList(0.183762561f, 0.738372617f)); // Required. Query vectors
            request.setTopK(100); // Optional. Number of results to return
            request.setIncludeVector(true); // Optional. Whether to return document vectors
            request.setOutputFields(new ArrayList<String>()); // Optional. Fields to return
            request.setFilter("a>10"); // Optional. Filter expression
            
            SearchResponse searchResponse = client.query(request);
            System.out.println("Search results:\n" + searchResponse.getBody());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }

}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector.models import QueryRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

request = QueryRequest(table_name="t1",
                        vector=[0.1, 0.2],
                        include_vector=True,
                        filter="a > 10",
                        output_fields=["a", "b"]
                        top_k=10)
result = client.query(request)

Go

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
	"sync"
)

func main() {

	//Create a request client
	config := &ha3engine.Config{
		// API endpoint, available under Instance Details > API Endpoint
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// Username, available under Instance Details > API Endpoint
		AccessUserName: tea.String("username"),
		// Password, configurable under Instance Details > API Endpoint
		AccessPassWord: tea.String("password"),
		RuntimeOptions: &service.RuntimeOptions{
			KeepAlive:    tea.Bool(true),
			MaxIdleConns: tea.Int(1000),
			ReadTimeout:  tea.Int(1000),
		},
	}

	// Initialize a client to send requests.
	client, _clientErr := ha3engine.NewClient(config)

	// If NewClient fails, return _clientErr and print the error.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}

	filterQuery(client)
}

func filterQuery(client *ha3engine.Client) {

	searchRequestModel := &ha3engine.QueryRequest{}
	searchRequestModel.SetTableName("test1")

	// Create an array of float32 pointers
	ids := make([]*float32, 4)

	// Assign values to the pointer array
	ids[0] = tea.Float32(0.1)
	ids[1] = tea.Float32(0.2)
	ids[2] = tea.Float32(0.3)
	ids[3] = tea.Float32(0.4)

	searchRequestModel.SetVector(ids)
	searchRequestModel.SetFilter("count>25")

	response, _requestErr := client.Query(searchRequestModel)

	// If sending the request fails, return _requestErr and print the error.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	// Print the successful response.
	fmt.Println(response)
}

Java asynchronous

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class FilterQuery {
    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void filterQuery() {
        try {
            QueryRequest queryRequest = QueryRequest.builder()
                    .tableName("test1") // Table to query
                    .indexName("vector") // Index to query
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F)) // Query vectors
                    .topK(10) // Number of results to return
                    .filter("count>25")// Filter condition
                    .includeVector(false) //Whether to return document vectors
                    .build();

            CompletableFuture<SearchResponse> responseCompletableFuture = client.query(queryRequest);
            String responseBody = responseCompletableFuture.get().getBody();

            System.out.println("multiQuery result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

For more information about how to use filter, see Filter expressions.

Primary key-based retrieval

Java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.Config;
import com.aliyun.ha3engine.vector.models.FetchRequest;
import com.aliyun.ha3engine.vector.models.SearchResponse;
import com.aliyun.tea.TeaException;

import org.junit.Before;
import org.junit.Test;

public class Demo {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void fetch() throws Exception {
        try {
            FetchRequest request = new FetchRequest();
            request.setTableName("gist");
            request.setIds(Arrays.asList("1", "2"));
            SearchResponse searchResponse = client.fetch(request);
            System.out.println("Search results:\n" + searchResponse.getBody());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }

}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector.models import FetchRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

request = FetchRequest(table_name="gist", ids=["1", "2"])
result = client.fetch(request)

Go

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
)

func main() {

	//Create a request client
	config := &ha3engine.Config{
		// API endpoint, available under Instance Details > API Endpoint
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// Username, available under Instance Details > API Endpoint
		AccessUserName: tea.String("username"),
		// Password, configurable under Instance Details > API Endpoint
		AccessPassWord: tea.String("password"),
		RuntimeOptions: &service.RuntimeOptions{
			KeepAlive:    tea.Bool(true),
			MaxIdleConns: tea.Int(1000),
			ReadTimeout:  tea.Int(1000),
		},
	}

	// Initialize a client to send requests.
	client, _clientErr := ha3engine.NewClient(config)

	// If NewClient fails, return _clientErr and print the error.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}

	fetch(client)
}

/**
 *	Primary key query
 */
func fetch(client *ha3engine.Client) {

	searchRequestModel := &ha3engine.FetchRequest{}
	searchRequestModel.SetTableName("test1")

	// Assign values to the pointer array
	ids := make([]*string, 3)
	ids[0] = tea.String("1")
	ids[1] = tea.String("2")
	ids[2] = tea.String("3")
	searchRequestModel.SetIds(ids)

	response, _requestErr := client.Fetch(searchRequestModel)

	//If sending the request fails, return _requestErr and print the error.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	//Print the successful response.
	fmt.Println(response)
}

Java asynchronous

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.FetchRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * @author alibaba
 */
public class PrimaryKeyQuery {
    
    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void primaryKeyQuery() {
        try {
            FetchRequest fetchRequest = FetchRequest.builder().tableName("table_name").ids(Arrays.asList("1", "2")).build();
            CompletableFuture<SearchResponse> searchResponseCompletableFuture = client.fetch(fetchRequest);
            String responseBody = searchResponseCompletableFuture.get().getBody();

            System.out.println("result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Prediction query

A prediction query is the query method that you use when you generate vectors from text or images by using OpenSearch Vector Search Edition and then perform vector-based retrieval by using text or images. The following sample code shows how to use the SDK:

Java

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.Config;
import com.aliyun.ha3engine.vector.models.QueryRequest;
import com.aliyun.ha3engine.vector.models.SearchResponse;
import com.aliyun.tea.TeaException;
import org.junit.Before;
import org.junit.Test;

import java.util.Map;

public class InferenceQuery {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void inferenceQuery() throws Exception {
        try {
            QueryRequest request = new QueryRequest();
            request.setTableName("test"); // Required. Table to query
            request.setContent("child"); // Required. Content to query
            request.setModal("text"); // Required. Used to embed the query terms
            request.setTopK(100); // Optional. Number of results to return
            request.setSearchParams("{\\\"qc.searcher.scan_ratio\\\":0.01}");
            SearchResponse searchResponse = client.inferenceQuery(request);
            System.out.println("Search results:\n" + searchResponse.getBody());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config
from alibabacloud_ha3engine_vector.models import QueryRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

def inference_query():
    request = QueryRequest(table_name="test",
                           content="puppy",
                           modal="text",
                           namespace="123",
                           search_params="{\\\"qc.searcher.scan_ratio\\\":0.01}",
                           top_k=10)
    result = client.inference_query(request)
    print(result.body)

if __name__ == "__main__":
    inference_query()

Go

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
)


func main() {

	//Create a request client
	config := &ha3engine.Config{
		// API endpoint, available under Instance Details > API Endpoint
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// Username, available under Instance Details > API Endpoint
		AccessUserName: tea.String("username"),
		// Password, configurable under Instance Details > API Endpoint
		AccessPassWord: tea.String("password"),
		RuntimeOptions: &service.RuntimeOptions{
			KeepAlive:    tea.Bool(true),
			MaxIdleConns: tea.Int(1000),
			ReadTimeout:  tea.Int(1000),
		},
	}

	// Initialize a client to send requests.
	client, _clientErr := ha3engine.NewClient(config)

	// If NewClient fails, return _clientErr and print the error.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}

	inferenceQuery(client)
}

/**
 *	Prediction query
 */
func inferenceQuery(client *ha3engine.Client) {

	searchRequestModel := &ha3engine.QueryRequest{}
	searchRequestModel.SetTableName("test1")

	// Create an array of float32 pointers
	array := make([]*float32, 3)

	// Allocate memory and initialize the values
	value1 := float32(1.23)
	value2 := float32(4.56)
	value3 := float32(7.89)

	// Assign values to the pointer array
	array[0] = &value1
	array[1] = &value2
	array[2] = &value3

	//searchRequestModel.SetVector(array)
	searchRequestModel.SetContent("puppy")
	searchRequestModel.SetNamespace("123")
	searchRequestModel.SetModal("text") // Required. Used to embed the query terms

	response, _requestErr := client.InferenceQuery(searchRequestModel)

	// If sending the request fails, return _requestErr and print the error.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	// Print the successful response.
	fmt.Println(response)
}

Java asynchronous

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * Prediction query
 */
public class InferenceQuery {
    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void inferenceQuery() {
        try {
            QueryRequest queryRequest = QueryRequest.builder()
                    .tableName("test2") // Table to query
                    .indexName("source_text_vector") // Index to query
                    .namespace("1")// Query namespace
                    .modal("text")// Model name
                    .content("Sample text for embedding")// Content to embed
                    .topK(10) // Number of results to return
                    .includeVector(false) //Whether to return document vectors
                    .build();

            CompletableFuture<SearchResponse> responseCompletableFuture = client.inferenceQuery(queryRequest);
            String responseBody = responseCompletableFuture.get().getBody();
            System.out.println("queryInference result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Parameters:

  • content in queryRequest specifies the content to query. In text vectorization scenarios, enter text. In image vectorization scenarios, you can enter text or a Base64-encoded image.

  • modal in queryRequest specifies the query method. text indicates text vectorization, which means searching text by text. Image vectorization means searching images by text.

Multi-query search

Java

import java.util.Arrays;
import java.util.Map;

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.Config;
import com.aliyun.ha3engine.vector.models.MultiQueryRequest;
import com.aliyun.ha3engine.vector.models.QueryRequest;
import com.aliyun.ha3engine.vector.models.SearchResponse;
import com.aliyun.tea.TeaException;

import org.junit.Before;
import org.junit.Test;

/**
 * Batch query
 */
public class Demo {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void query() throws Exception {
        try {

            MultiQueryRequest multiQueryRequest = new MultiQueryRequest();

            multiQueryRequest.setTableName("test1"); //Table to query
            multiQueryRequest.setTopK(50); // Final number of results to return
            multiQueryRequest.setOutputFields(Arrays.asList("content", "name", "age")); // Fields to return
            multiQueryRequest.setOrder("DESC");

            QueryRequest queryRequest = new QueryRequest();
            queryRequest.setIndexName("vector"); // Index name. Specify it in SearchRequest or in each Query
            queryRequest.setNamespace("space_a"); // Query vector namespace
            queryRequest.setVector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F)); // Query vectors. Multiple vectors can be flattened

            multiQueryRequest.setQueries(Arrays.asList(queryRequest));

            SearchResponse searchResponse = client.multiQuery(multiQueryRequest);
            System.out.println(searchResponse.getBody());

        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config, MultiQueryRequest
from alibabacloud_ha3engine_vector.models import QueryRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

def multi_query():
    query1 = QueryRequest(table_name="test",
                          vector=[0.1, 0.2, 0.3, 0.4],
                          include_vector=True,
                          search_params="{\\\"qc.searcher.scan_ratio\\\":0.01}",
                          top_k=10)
    queries = [query1]
    request = MultiQueryRequest(table_name="test",
                                queries=queries,
                                top_k=10)
    result = client.multi_query(request)
    print(result.body)

if __name__ == "__main__":
    multi_query()

Go

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
)

func main() {

	//Create a request client
	config := &ha3engine.Config{
		// API endpoint, available under Instance Details > API Endpoint
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// Username, available under Instance Details > API Endpoint
		AccessUserName: tea.String("username"),
		// Password, configurable under Instance Details > API Endpoint
		AccessPassWord: tea.String("password"),
		RuntimeOptions: &service.RuntimeOptions{
			KeepAlive:    tea.Bool(true),
			MaxIdleConns: tea.Int(1000),
			ReadTimeout:  tea.Int(1000),
		},
	}

	// Initialize a client to send requests.
	client, _clientErr := ha3engine.NewClient(config)

	// If NewClient fails, return _clientErr and print the error.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}
	multiQuery(client)
}


/**
 *	Batch query
 */
func multiQuery(client *ha3engine.Client) {

	query := &ha3engine.QueryRequest{}
	query.SetTableName("test1")

	// Create an array of float32 pointers
	array := make([]*float32, 4)

	// Allocate memory and initialize the values
	value1 := float32(1.23)
	value2 := float32(4.56)
	value3 := float32(7.89)
	value4 := float32(7.89)

	// Assign values to the pointer array
	array[0] = &value1
	array[1] = &value2
	array[2] = &value3
	array[3] = &value4

	query.SetVector(array)

	request := &ha3engine.MultiQueryRequest{}

	request.SetTableName("test1")

	querys := make([]*ha3engine.QueryRequest, 1)
	querys[0] = query
	request.SetQueries(querys)
	request.SetTopK(10)
	request.SetIncludeVector(true)
	request.SetOrder("DESC")

	response, _requestErr := client.MultiQuery(request)

	// If sending the request fails, return _requestErr and print the error.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	// Print the successful response.
	fmt.Println(response)
}

Java asynchronous

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.MultiQueryRequest;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * @author alibaba
 */
public class SearchDoc {

    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void searchDoc()  {
        try {
            QueryRequest queryRequest = QueryRequest.builder()
                    .indexName("content_vector") // Index to query
                    .namespace("150086193") // Query vector namespace
                    .vector(Arrays.asList(0.0001575F, 0.00682848F)) // Query vectors
                    .build();
            MultiQueryRequest multiQueryRequest = MultiQueryRequest.builder()
                    .tableName("hybrid") // Table to query
                    .topK(10) // Number of results to return
                    .outputFields(Arrays.asList("content", "source", "instance_id")) // Fields to return
                    .filter("type='TEXT'") // Filter expression
                    .order("DESC") // Sort order
                    .queries(Arrays.asList(queryRequest)).build();
            CompletableFuture<SearchResponse> searchResponseCompletableFuture = client.multiQuery(multiQueryRequest);
            String responseBody = searchResponseCompletableFuture.get().getBody();

            System.out.println("result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Batch query

Java

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.BatchRequest;
import com.aliyun.ha3engine.vector.models.Config;
import com.aliyun.ha3engine.vector.models.QueryRequest;
import com.aliyun.ha3engine.vector.models.SearchResponse;
import com.aliyun.tea.TeaException;
import org.junit.Before;
import org.junit.Test;
import org.something.util.VectorUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * Batch query
 */
public class BatchQuery {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void batch() throws Exception {
        try {
            BatchRequest request = new BatchRequest();

            QueryRequest queryRequest1 = new QueryRequest();
            queryRequest1.setTableName("test");
            queryRequest1.setIndexName("vector");
            queryRequest1.setOutputFields(Arrays.asList("id", "name"));
            queryRequest1.setVector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F));

            QueryRequest queryRequest2 = new QueryRequest();
            queryRequest2.setTableName("test1");
            queryRequest2.setIndexName("vector");
            queryRequest2.setOutputFields(Arrays.asList("id", "title"));
            queryRequest2.setVector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F));
            List<QueryRequest> queries = new ArrayList<>();
            queries.add(queryRequest1);
            queries.add(queryRequest2);
            request.setQueries(queries);

            SearchResponse searchResponse = client.batch(request);
            System.out.println("Search results:\n" + searchResponse.getBody());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config, QueryRequest
from alibabacloud_ha3engine_vector.models import BatchRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

def batch_query():
    query_request1 = QueryRequest(table_name="test",
                                  index_name="vector",
                                  vector=[0.524355, 0.940892, 0.002874, 0.551031],
                                  include_vector=True,
                                  search_params="{\\\"qc.searcher.scan_ratio\\\":0.01}",
                                  top_k=10)
    query_request2 = QueryRequest(table_name="test1",
                                  index_name="vector",
                                  vector=[0.524355, 0.940892, 0.002874, 0.551031],
                                  include_vector=True,
                                  search_params="{\\\"qc.searcher.scan_ratio\\\":0.01}",
                                  top_k=10)
    request = BatchRequest(queries=[query_request1, query_request2])
    result = client.batch_query(request)
    print(result.headers)
    print(result.body)

if __name__ == "__main__":
    batch_query()

Go

package main

import (
    "fmt"
    "github.com/alibabacloud-go/tea-utils/v2/service"
    "github.com/alibabacloud-go/tea/tea"
    ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
)

func main() {

    //Create a request client
    config := &ha3engine.Config{
        // API endpoint, available under Instance Details > API Endpoint
        Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        // Username, available under Instance Details > API Endpoint
        AccessUserName: tea.String("username"),
        // Password, configurable under Instance Details > API Endpoint
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    // Initialize a client to send requests.
    client, _clientErr := ha3engine.NewClient(config)

    // If NewClient fails, return _clientErr and print the error.
    if _clientErr != nil {
        fmt.Println(_clientErr)
        return
    }

    batch(client)
}

func batch(client *ha3engine.Client) {

    queryRequestModel1 := &ha3engine.QueryRequest{}
    queryRequestModel1.SetTableName("test")
    // Create an array of float32 pointers
    ids1 := make([]*float32, 4)
    // Assign values to the pointer array
    ids1[0] = tea.Float32(0.1)
    ids1[1] = tea.Float32(0.2)
    ids1[2] = tea.Float32(0.3)
    ids1[3] = tea.Float32(0.4)
    queryRequestModel1.SetVector(ids1)

    queryRequestModel2 := &ha3engine.QueryRequest{}
    queryRequestModel2.SetTableName("test1")
    // Create an array of float32 pointers
    ids2 := make([]*float32, 4)
    // Assign values to the pointer array
    ids2[0] = tea.Float32(0.1)
    ids2[1] = tea.Float32(0.2)
    ids2[2] = tea.Float32(0.3)
    ids2[3] = tea.Float32(0.4)
    queryRequestModel2.SetVector(ids2)

    batchRequestModel := &ha3engine.BatchRequest{}
    batchRequestModel.SetQueries([]*ha3engine.QueryRequest{queryRequestModel1, queryRequestModel2})

    response, _requestErr := client.BatchQuery(batchRequestModel)

    //If sending the request fails, return _requestErr and print the error.
    if _requestErr != nil {
        fmt.Println(_requestErr)
        return
    }

    //Print the successful response.
    fmt.Println(response)
}

Java asynchronous

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.BatchRequest;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;
import org.something.util.VectorUtils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * Batch query
 */
public class BatchQuery {
    
    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void batch() {
        try {
            QueryRequest queryRequest1 = QueryRequest.builder()
                    .tableName("test") // Table to query
                    .indexName("vector") // Index to query
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F)) // Query vectors
                    .outputFields(Arrays.asList("id", "name"))
                    .build();
            QueryRequest queryRequest2 = QueryRequest.builder()
                    .tableName("test1") // Table to query
                    .indexName("vector") // Index to query
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F)) // Query vectors
                    .outputFields(Arrays.asList("id", "title"))
                    .build();
            List<QueryRequest> queries = new ArrayList<>();
            queries.add(queryRequest1);
            queries.add(queryRequest2);
            BatchRequest request = BatchRequest.builder()
                    .queries(queries)
                    .build();

            CompletableFuture<SearchResponse> responseCompletableFuture = client.batchQuery(request);
            String responseBody = responseCompletableFuture.get().getBody();
            System.out.println("batch result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Hybrid query (single vector)

A hybrid query lets you query data by using a combination of dense vectors and sparse vectors. The SDK usage is as follows:

Java

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.*;
import com.aliyun.tea.TeaException;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;

public class Demo {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void query() throws Exception {
        try {
            QueryRequest queryRequest = new QueryRequest();
            queryRequest.setIndexName("index"); // Index name. Specify it in SearchRequest or in each Query
            queryRequest.setNamespace("cate1"); // Query vector namespace
            queryRequest.setVector(Arrays.asList(0.0001575F, 0.00682848F)); // Query vectors. Multiple vectors can be flattened

            SparseData sparseData = new SparseData();
            sparseData.setCount(Arrays.asList(2)); // Number of elements in each sparse vector
            sparseData.setIndices(Arrays.asList(983589459L, 1261855554L)); // Element indices, sorted in ascending order
            sparseData.setValues(Arrays.asList(0.0001575F, 0.00682848F)); // Element values, one per index

            queryRequest.setSparseData(sparseData);

            SearchResponse searchResponse = client.query(queryRequest);
            System.out.println(searchResponse.getBody());

        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }

}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config, SparseData
from alibabacloud_ha3engine_vector.models import QueryRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

def mix_query():
    sparse_data = SparseData(indices=[101, 203], values=[0.1, 0.5])
    request = QueryRequest(table_name="test",
                           index_name="embedding",
                           vector=[0.1, 0.2, 0.3, 0.4],
                           sparse_data=sparse_data,
                           include_vector = True,
                           top_k = 10)
    result = client.query(request)
    print(result.body)

if __name__ == "__main__":
    mix_query()

Go

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
	"sync"
)

func main() {

	//Create a request client
	config := &ha3engine.Config{
		// API endpoint, available under Instance Details > API Endpoint
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// Username, available under Instance Details > API Endpoint
		AccessUserName: tea.String("username"),
		// Password, configurable under Instance Details > API Endpoint
		AccessPassWord: tea.String("password"),
		RuntimeOptions: &service.RuntimeOptions{
			KeepAlive:    tea.Bool(true),
			MaxIdleConns: tea.Int(1000),
			ReadTimeout:  tea.Int(1000),
		},
	}

	// Initialize a client to send requests.
	client, _clientErr := ha3engine.NewClient(config)

	// If NewClient fails, return _clientErr and print the error.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}

	mixQuery(client)
}

func mixQuery(client *ha3engine.Client) {

	searchRequestModel := &ha3engine.QueryRequest{}
	searchRequestModel.SetTableName("test1")

	// Create an array of float32 pointers
	ids := make([]*float32, 4)

	// Assign values to the pointer array
	ids[0] = tea.Float32(0.1)
	ids[1] = tea.Float32(0.2)
	ids[2] = tea.Float32(0.3)
	ids[3] = tea.Float32(0.4)

	searchRequestModel.SetVector(ids)
	count := make([]*int, 1)
	count[0] = tea.Int(2)

	indices := make([]*int64, 2)
	indices[0] = tea.Int64(1)
	indices[1] = tea.Int64(2)

	values := make([]*float32, 2)
	values[0] = tea.Float32(0.1)
	values[1] = tea.Float32(0.2)
	sparseDataha := &ha3engine.SparseData{
		Count:   count,
		Indices: indices,
		Values:  values,
	}
	searchRequestModel.SetSparseData(sparseDataha)

	response, _requestErr := client.Query(searchRequestModel)

	// If sending the request fails, return _requestErr and print the error.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	// Print the successful response.
	fmt.Println(response)
}

Java asynchronous

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.ha3engine.async.models.SparseData;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * Hybrid query
 */
public class MixQuery {
    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void mixQuery() {
        try {
            QueryRequest queryRequest = QueryRequest.builder()
                    .tableName("test1") // Table to query
                    .indexName("vector") // Index to query
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F)) // Query vectors
                    .sparseData(SparseData.builder().count(Arrays.asList(2)).indices(Arrays.asList(1L,2L)).values(Arrays.asList(0.1F,0.2F)).build())// Sparse vector
                    .topK(10) // Number of results to return
                    .includeVector(false) //Whether to return document vectors
                    .build();
            
            CompletableFuture<SearchResponse> responseCompletableFuture = client.query(queryRequest);
            String responseBody = responseCompletableFuture.get().getBody();
            System.out.println("query result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Hybrid query (multiple vectors)

A hybrid query lets you query data by using a combination of dense vectors and sparse vectors. The SDK usage is as follows:

Java

import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.*;
import com.aliyun.tea.TeaException;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;

public class Demo {

    /**
     * OpenSearch engine client
     */
    private Client client;

    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void query() throws Exception {
        try {

            MultiQueryRequest multiQueryRequest = new MultiQueryRequest();

            multiQueryRequest.setTableName("main"); //Table to query
            multiQueryRequest.setTopK(50); // Final number of results to return
            multiQueryRequest.setOutputFields(Arrays.asList("content", "source", "instance_id")); // Fields to return
            multiQueryRequest.setFilter("type='TEXT'"); // Filter expression
            multiQueryRequest.setOrder("DESC");

            QueryRequest queryRequest = new QueryRequest();
            queryRequest.setIndexName("index"); // Index name. Specify it in SearchRequest or in each Query
            queryRequest.setNamespace("cate1"); // Query vector namespace
            queryRequest.setVector(Arrays.asList(0.0001575F, 0.00682848F)); // Query vectors. Multiple vectors can be flattened

            SparseData sparseData = new SparseData();
            sparseData.setCount(Arrays.asList(2)); // Number of elements in each sparse vector
            sparseData.setIndices(Arrays.asList(983589459L, 1261855554L)); // Element indices, sorted in ascending order
            sparseData.setValues(Arrays.asList(0.0001575F, 0.00682848F)); // Element values, one per index

            queryRequest.setSparseData(sparseData);
            multiQueryRequest.setQueries(Arrays.asList(queryRequest));

            SearchResponse searchResponse = client.multiQuery(multiQueryRequest);
            System.out.println(searchResponse.getBody());

        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config, SparseData, MultiQueryRequest
from alibabacloud_ha3engine_vector.models import QueryRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

def mix_multi_query():
    sd1 = SparseData(indices=[101, 203], values=[0.1, 0.5])
    sd2 = SparseData(indices=[200, 405, 502], values=[0.9, 0.5, 0.75])
    q1 = QueryRequest(vector=[0.1, 0.2, 0.3, 0.4], sparse_data=sd1)
    q2 = QueryRequest(vector=[0.4, 0.5, 0.6, 0.7], sparse_data=sd2)
    request = MultiQueryRequest(table_name="test",
                                queries=[q1, q2],
                                top_k=3,
                                include_vector=True)
    result = client.multi_query(request)
    print(result.body)

if __name__ == "__main__":
    mix_multi_query()

Go

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
	"sync"
)

func main() {

	//Create a request client
	config := &ha3engine.Config{
		// API endpoint, available under Instance Details > API Endpoint
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// Username, available under Instance Details > API Endpoint
		AccessUserName: tea.String("username"),
		// Password, configurable under Instance Details > API Endpoint
		AccessPassWord: tea.String("password"),
		RuntimeOptions: &service.RuntimeOptions{
			KeepAlive:    tea.Bool(true),
			MaxIdleConns: tea.Int(1000),
			ReadTimeout:  tea.Int(1000),
		},
	}

	// Initialize a client to send requests.
	client, _clientErr := ha3engine.NewClient(config)

	// If NewClient fails, return _clientErr and print the error.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}

	mixMultiVectorQuery(client)
}

func mixMultiVectorQuery(client *ha3engine.Client) {

	query1 := &ha3engine.QueryRequest{}
	// Create an array of float32 pointers
	array := make([]*float32, 4)

	// Allocate memory and initialize the values
	value1 := float32(1.23)
	value2 := float32(4.56)
	value3 := float32(7.89)
	value4 := float32(7.89)

	// Assign values to the pointer array
	array[0] = &value1
	array[1] = &value2
	array[2] = &value3
	array[3] = &value4

	count := make([]*int, 1)
	count[0] = tea.Int(2)
	indices := make([]*int64, 2)
	indices[0] = tea.Int64(1)
	indices[1] = tea.Int64(2)
	values := make([]*float32, 2)
	values[0] = tea.Float32(0.1)
	values[1] = tea.Float32(0.2)
	sparseData := &ha3engine.SparseData{
		Count:   count,
		Indices: indices,
		Values:  values,
	}

	query1.SetSparseData(sparseData)
	query1.SetVector(array)

	query2 := &ha3engine.QueryRequest{}
	query2.SetVector(array)

	request := &ha3engine.MultiQueryRequest{}

	request.SetTableName("test1")

	querys := make([]*ha3engine.QueryRequest, 2)
	querys[0] = query1
	querys[1] = query2
	request.SetQueries(querys)
	request.SetTopK(10)
	request.SetIncludeVector(false)
	request.SetOrder("DESC")

	response, _requestErr := client.MultiQuery(request)

	// If sending the request fails, return _requestErr and print the error.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	// Print the successful response.
	fmt.Println(response)
}

Java asynchronous

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.MultiQueryRequest;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.ha3engine.async.models.SparseData;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * Multi-vector query
 */
public class MixMultiVectorQuery {

    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void mixMultiVectorQuery() {
        try {
            QueryRequest query1 = QueryRequest.builder()
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F))
                    .sparseData(SparseData.builder().count(Arrays.asList(2)).indices(Arrays.asList(1L,2L)).values(Arrays.asList(0.1F,0.2F)).build())// Sparse vector
                    .namespace("space_a")
                    .build();
            QueryRequest query2 = QueryRequest.builder()
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F))
                    .sparseData(SparseData.builder().count(Arrays.asList(2)).indices(Arrays.asList(1L,2L)).values(Arrays.asList(0.1F,0.2F)).build())// Sparse vector
                    .namespace("space_b")
                    .build();
            MultiQueryRequest request = MultiQueryRequest.builder()
                    .tableName("test2")// Table to query
                    .topK(3)
                    .includeVector(false)// Whether to return document vectors
                    .queries(Arrays.asList(query1, query2))// Query conditions for multiple namespaces
                    .build();
            
            CompletableFuture<SearchResponse> responseCompletableFuture = client.multiQuery(request);
            String responseBody = responseCompletableFuture.get().getBody();
            System.out.println("query result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}
Important

A multi-vector query requires all vectors to be of the same type. For example, all vectors are used for dense vector retrieval, or all vectors are used for hybrid retrieval.

Hybrid vector and text query

Java

import java.util.Arrays;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.aliyun.ha3engine.vector.Client;
import com.aliyun.ha3engine.vector.models.*;
import com.aliyun.tea.TeaException;

import org.junit.Before;
import org.junit.Test;

/**
 * Hybrid vector and text query example
 **/
public class VectorSearchService {

    /**
     * OpenSearch engine client
     */
    private Client client;


    @Before
    public void clientInit() throws Exception {
        /*
          Initialize the OpenSearch Retrieval Engine Edition client
         */
        Config config = new Config();

        // Instance name, shown in the upper-left corner of the instance details page. Example: ha-cn-i7*****605
        config.setInstanceId("ha-cn-i7*****605");
        // Username, available under Instance Details > API Endpoint
        config.setAccessUserName("username");
        // Password, configurable under Instance Details > API Endpoint
        config.setAccessPassWord("password");
        // API endpoint, available under Instance Details > API Endpoint
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");

        client = new Client(config);
    }

    @Test
    public void search() throws Exception {
        try {
            // Build a search request
            SearchRequest request = new SearchRequest();
            request.setTableName("test1");// Required. Table to search
            // KNN query parameters
            QueryRequest queryRequest = new QueryRequest();
            queryRequest.setIndexName("vector");// Index name
            queryRequest.setTopK(10);
            queryRequest.setVector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F));// Search vector
            // Sparse vector
            SparseData sparseData = new SparseData();
            sparseData.setIndices(Arrays.asList(1L, 2L, 3L, 4L));
            sparseData.setValues(Arrays.asList(0.0001575F, 0.00682848F, 0.008745F, 0.4583474F));
            queryRequest.setSparseData(sparseData);
            request.setKnn(queryRequest);
            // Build text query parameters
            TextQuery textQuery = new TextQuery();
            textQuery.setQueryString("content:'release'");
            request.setText(textQuery);
            request.setSize(10);
            request.setOutputFields(Arrays.asList("id", "content", "name"));

            SearchResponse searchResponse = client.search(request);
            System.out.println("Search results:\n" + searchResponse.getBody());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Python

from alibabacloud_ha3engine_vector.client import Client
from alibabacloud_ha3engine_vector.models import Config, SearchRequest, TextQuery, RankQuery
from alibabacloud_ha3engine_vector.models import QueryRequest

config = Config(
    # API endpoint, available under Instance Details > API Endpoint
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    # Username, available under Instance Details > API Endpoint
    access_user_name="username",
    # Password, configurable under Instance Details > API Endpoint
    access_pass_word="password")
client = Client(config)

def search():
    knn = QueryRequest(index_name="vector",
                       vector=[0.62498, 0.886408, 0.586114, 0.043189],
                       include_vector=True,
                       top_k=10)
    text = TextQuery(query_string="content:'release'")
    request = SearchRequest(table_name="test1",
                            size=10,
                            output_fields=["id", "content", "name"],
                            knn=knn,
                            text=text,
                            rank=RankQuery(rrf={"rankConstant": 1000}))
    result = client.search(request)
    print(result.body)

if __name__ == "__main__":
    search()

Go

package main

import (
	"fmt"
	"github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	ha3engine "github.com/aliyun/alibabacloud-ha3-go-sdk/client"
	"sync"
)

func main() {

	//Create a request client
	config := &ha3engine.Config{
		// API endpoint, available under Instance Details > API Endpoint
		Endpoint: tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
		// Username, available under Instance Details > API Endpoint
		AccessUserName: tea.String("username"),
		// Password, configurable under Instance Details > API Endpoint
		AccessPassWord: tea.String("password"),
		RuntimeOptions: &service.RuntimeOptions{
			KeepAlive:    tea.Bool(true),
			MaxIdleConns: tea.Int(1000),
			ReadTimeout:  tea.Int(1000),
		},
	}

	// Initialize a client to send requests.
	client, _clientErr := ha3engine.NewClient(config)

	// If NewClient fails, return _clientErr and print the error.
	if _clientErr != nil {
		fmt.Println(_clientErr)
		return
	}

	search(client)
}
func search(client *ha3engine.Client) {

	searchRequestModel := &ha3engine.SearchRequest{}
	searchRequestModel.SetTableName("test1")

	knn := &ha3engine.QueryRequest{}

	// Assign values to the pointer array
	ids := make([]*float32, 4)
	ids[0] = tea.Float32(0.1)
	ids[1] = tea.Float32(0.2)
	ids[2] = tea.Float32(0.3)
	ids[3] = tea.Float32(0.4)
	knn.SetVector(ids)
	
	text := &ha3engine.TextQuery{}
	text.SetQueryString("content:'release'")

	searchRequestModel.SetText(text)
	searchRequestModel.SetKnn(knn)

	response, _requestErr := client.Search(searchRequestModel)

	//If sending the request fails, return _requestErr and print the error.
	if _requestErr != nil {
		fmt.Println(_requestErr)
		return
	}

	//Print the successful response.
	fmt.Println(response)
}

Java asynchronous

import com.aliyun.ha3engine.async.AsyncClient;
import com.aliyun.ha3engine.async.models.QueryRequest;
import com.aliyun.ha3engine.async.models.SearchRequest;
import com.aliyun.ha3engine.async.models.SearchResponse;
import com.aliyun.ha3engine.async.models.TextQuery;
import com.aliyun.sdk.ha3engine.async.core.AsyncConfigInfoProvider;
import com.aliyun.tea.TeaException;
import darabonba.core.client.ClientOverrideConfiguration;
import org.junit.Before;
import org.junit.Test;

import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class VectorTextMixSearch {

    /**
     * OpenSearch engine client
     */
    private AsyncClient client;

    @Before
    public void clientInit() {
        // Configure the instance username and password, available under Instance Details > API Endpoint
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        // Initialize the asynchronous client
        client = AsyncClient.builder()
                .credentialsProvider(provider)
                .overrideConfiguration(
                        ClientOverrideConfiguration.create()
                                .setEndpointOverride("ha-cn-i7*****605.public.ha.aliyuncs.com")
                                .setProtocol("http")
                ).build();
    }

    @Test
    public void search() {
        try {
            SearchRequest request = SearchRequest.builder()
                    .tableName("test1")// Table to query
                    .size(10)// Number of results to return
                    .knn(QueryRequest.builder()
                            .vector(Arrays.asList(0.1f, 0.2f, 0.3f,0.4f))// Vector
                            .namespace("space_a")// Namespace
                            .build())// KNN query parameters
                    .text(TextQuery.builder()
                            .queryString("content:'content'")// Search condition
                            .build())
                    .outputFields(Arrays.asList("name", "age", "content"))// Fields to return
                    .build();

            CompletableFuture<SearchResponse> responseCompletableFuture = client.search(request);
            String responseBody = responseCompletableFuture.get().getBody();

            System.out.println("search result:" + responseBody);
        } catch (ExecutionException | InterruptedException e) {
            System.out.println(e.getMessage());
        } catch (TeaException e) {
            System.out.println(e.getCode());
            System.out.println(e.getMessage());
            Map<String, Object> exceptionData = e.getData();
            System.out.println(com.aliyun.teautil.Common.toJSONString(exceptionData));
        }
    }
}

Description

  • For the response results of requests, see the corresponding query method under Traffic API reference > Query data in Response parameters

  • Do not run the go get github.com/aliyun/alibabacloud-ha3-go-sdk command to pull the Git dependency without a version. You must append a version to the command, because the tags of OpenSearch Vector Search Edition and OpenSearch Retrieval Engine Edition are in the same GitHub repository. When you pull the dependency, pull the dependency that corresponds to the edition of your instance.