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.18Go
go get github.com/aliyun/alibabacloud-ha3-go-sdk@v1.1.18-vectorAsynchronous 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
-
table_name: the name of the table to query.
-
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.
-
vector_count: the number of vectors in the vector field. For example, the default value 2 indicates that the query contains two vectors.
-
include_vector: specifies whether to return the vector information in documents.
-
output_fields: the list of fields whose values are returned.
-
top_k: the number of results to return. You can set this parameter based on your requirements.
-
filter: the filter expression, which allows you to specify filter conditions. For more information about the syntax, see Filter expressions syntax.
-
search_params: the query parameters. For more information, see QcSearcher,HnswSearcher.
-
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));
}
}
}
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-sdkcommand 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.