すべてのプロダクト
Search
ドキュメントセンター

OpenSearch:データのクエリ

最終更新日:Aug 22, 2026

OpenSearch Vector Search Edition SDK は、複数のクエリ戦略をサポートしています。以下の表を使用して、ユースケースに適したアプローチを見つけ、対応するセクションに移動してコード例を確認してください。

クエリタイプ 使用シーン
ベクターベースのクエリ クエリベクターに類似したレコードの検索 (最近傍探索)
プライマリキーベースのクエリ ID による特定のレコードのフェッチ
予測ベースのクエリ 生テキストまたは画像でのクエリ — SDK が自動的に入力をベクトル化
バッチクエリ 単一のリクエストで複数の独立したクエリを実行し、ネットワークオーバーヘッドを削減
複数クエリ 単一のテーブルに対して複数のサブクエリでクエリを実行し、結果をマージ
単一ベクターを使用したハイブリッドクエリ 単一のリクエストで密ベクトルと疎ベクトルのスコアリングを組み合わせる
複数ベクターを使用したハイブリッドクエリ 単一のリクエストで複数のサブクエリにわたって密ベクトルと疎ベクトルのスコアリングを組み合わせる
ベクターとテキストに基づくハイブリッドクエリ ベクターの類似度と全文検索を組み合わせる

すべての例で、Java、Python、Go、および Java (非同期) の 4 つの SDK クライアントを使用します。

前提条件

開始する前に、以下が準備できていることを確認してください:

  • OpenSearch Vector Search Edition インスタンス

  • インスタンスのエンドポイント、ユーザー名、パスワード (インスタンス詳細ページの [API エンドポイント] セクションで確認可能)

  • インスタンス ID (インスタンス詳細ページの左上で確認可能)

依存関係

ご利用の言語に対応する SDK の依存関係を追加します。

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

非同期 Java

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

設定パラメーター

以下のパラメーターは Java および Python SDK に適用されます。クライアントを初期化する際にこれらを設定します。

パラメーター 説明
endpoint インスタンスの内部エンドポイントまたはパブリックエンドポイントです。インスタンス詳細ページの [ネットワーク情報] セクションと [API エンドポイント] セクションで確認できます。[パブリックアクセス] を有効にすると、パブリックエンドポイントを取得できます (エンドポイント URL には public という単語が含まれます)。同じ vSwitch 上の Elastic Compute Service (ECS) インスタンスからアクセスする場合は、内部エンドポイントを使用します。
instance_id インスタンス ID です。インスタンス詳細ページの左上で確認できます。
access_user_name ユーザー名です。インスタンス詳細ページの [API エンドポイント] セクションで確認できます。
access_pass_word パスワードです。購入時に設定し、インスタンス詳細ページから変更可能です。

インスタンス ID (例:ha-cn-zpr3dgzxg04) は、[インスタンスリスト] または [インスタンス詳細] ページの上部で確認できます。

例えば、[ユーザー名] は admin で、[パスワード] は [設定] と表示されます。

パブリックエンドポイントアクセス用の IP アドレス許可リストの設定については、「インスタンス詳細の表示」の ネットワーク情報セクションをご参照ください。

ベクターベースのクエリ

ベクターベースのクエリは、クエリベクターに最も類似した上位 K 件のレコードを検索します。クエリパラメーターは QueryRequest で渡します。

クエリパラメーター

パラメーター 必須 説明
table_name はい クエリ対象のテーブル名。
vector はい クエリベクター。そのディメンションはベクターインデックスのディメンションと一致する必要があります。
vector_count いいえ ベクトルフィールド内のベクターの数。フィールドに 2 つのベクターが含まれている場合は 2 に設定します。
top_k いいえ 返す結果の数。
include_vector いいえ レスポンスにベクター値を含めるかどうか。
output_fields いいえ 返すフィールドのリスト。
filter いいえ 結果を絞り込むためのフィルター式。詳細については、「フィルター式」をご参照ください。
search_params いいえ 追加のクエリパラメーター。詳細については、「QcSearcher」および「HNSW 設定」をご参照ください。
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 {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        // インスタンス ID — インスタンス詳細ページの左上で確認可能。
        config.setInstanceId("ha-cn-i7*****605");
        // ユーザー名 — インスタンス詳細ページの [API エンドポイント] セクションで確認可能。
        config.setAccessUserName("username");
        // パスワード — 購入時に設定し、インスタンス詳細ページから変更可能。
        config.setAccessPassWord("password");
        // API エンドポイント — インスタンス詳細ページの [API エンドポイント] セクションで確認可能。
        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");                                  // 必須。
            request.setVector(Arrays.asList(0.183762561f, 0.738372617f)); // 必須。
            request.setTopK(100);                                          // オプション。
            request.setIncludeVector(true);                               // オプション。

            SearchResponse searchResponse = client.query(request);
            System.out.println("Result:\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

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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"
)

func main() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }

    query(client)
}

func query(client *ha3engine.Client) {
    request := &ha3engine.QueryRequest{}
    request.SetTableName("test1")

    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)
    request.SetVector(ids)

    response, err := client.Query(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

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 SimpleQuery {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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")
                    .indexName("index_name")
                    .vector(Arrays.asList(0.0001575F, 0.00682848F))
                    .topK(10)
                    .includeVector(true)
                    .build();

            CompletableFuture<SearchResponse> future = client.query(queryRequest);
            String responseBody = future.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));
        }
    }
}

複数ベクターに基づくクエリ

単一のリクエストで複数のベクターを指定します。SDK は結果をマージし、すべてのベクターにわたる上位 K 件のレコードを返します。

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 {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        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");
            request.setVector(Arrays.asList(0.183762561f, 0.738372617f));
            request.setNamespace("namespace");
            request.setTopK(100);
            request.setIncludeVector(true);

            SearchResponse searchResponse = client.query(request);
            System.out.println("Result:\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

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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"
)

func main() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    nameSpaceQuery(client)
}

func nameSpaceQuery(client *ha3engine.Client) {
    request := &ha3engine.QueryRequest{}
    request.SetTableName("test1")

    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)
    request.SetVector(ids)
    request.SetNamespace("1")

    response, err := client.Query(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

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 {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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")
                    .indexName("vector")
                    .namespace("1")
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F))
                    .topK(10)
                    .includeVector(false)
                    .build();

            CompletableFuture<SearchResponse> future = client.query(queryRequest);
            String responseBody = future.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));
        }
    }
}

名前空間ベースのクエリ

名前空間は、ベクターインデックスを独立したサブセットに分割します。ベクターインデックスに名前空間が設定されている場合、そのインデックスに対するすべてのクエリに名前空間を含める必要があります。

ベクターインデックスに名前空間を設定した場合、そのインデックスに対するすべてのクエリで名前空間を指定する必要があります。

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 {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        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");
            request.setVector(Arrays.asList(0.183762561f, 0.738372617f));
            request.setNamespace("namespace");
            request.setTopK(100);
            request.setIncludeVector(true);

            SearchResponse searchResponse = client.query(request);
            System.out.println("Result:\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

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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"
)

func main() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    nameSpaceQuery(client)
}

func nameSpaceQuery(client *ha3engine.Client) {
    request := &ha3engine.QueryRequest{}
    request.SetTableName("test1")

    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)
    request.SetVector(ids)
    request.SetNamespace("1")

    response, err := client.Query(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

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 {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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")
                    .indexName("vector")
                    .namespace("1")
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F))
                    .topK(10)
                    .includeVector(false)
                    .build();

            CompletableFuture<SearchResponse> future = client.query(queryRequest);
            String responseBody = future.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));
        }
    }
}

複数の名前空間に基づくクエリ

複数の名前空間を対象とする単一のリクエストを送信し、マージされた結果を受け取ります。

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 {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        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("Result:\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, MultiQueryRequest

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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"
)

func main() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    multiNameSpaceQuery(client)
}

func multiNameSpaceQuery(client *ha3engine.Client) {
    array := make([]*float32, 4)
    value1, value2, value3, value4 := float32(1.23), float32(4.56), float32(7.89), float32(7.89)
    array[0] = &value1
    array[1] = &value2
    array[2] = &value3
    array[3] = &value4

    query1 := &ha3engine.QueryRequest{}
    query1.SetVector(array)
    query1.SetNamespace("space_a")

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

    request := &ha3engine.MultiQueryRequest{}
    request.SetTableName("test2")

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

    response, err := client.MultiQuery(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

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 {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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")
                    .topK(3)
                    .includeVector(false)
                    .queries(Arrays.asList(query1, query2))
                    .build();

            CompletableFuture<SearchResponse> future = client.multiQuery(request);
            String responseBody = future.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));
        }
    }
}

フィルター条件を使用したクエリ

filter 式を任意のベクタークエリに追加して、結果を一致するレコードに制限します。完全なフィルター構文については、「フィルター式」をご参照ください。

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 {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        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");
            request.setVector(Arrays.asList(0.183762561f, 0.738372617f));
            request.setTopK(100);
            request.setIncludeVector(true);
            request.setOutputFields(new ArrayList<String>());
            request.setFilter("a>10");

            SearchResponse searchResponse = client.query(request);
            System.out.println("Result:\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

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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"
)

func main() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    filterQuery(client)
}

func filterQuery(client *ha3engine.Client) {
    request := &ha3engine.QueryRequest{}
    request.SetTableName("test1")

    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)
    request.SetVector(ids)
    request.SetFilter("count>25")

    response, err := client.Query(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

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 FilterQuery {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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")
                    .indexName("vector")
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F))
                    .topK(10)
                    .filter("count>25")
                    .includeVector(false)
                    .build();

            CompletableFuture<SearchResponse> future = client.query(queryRequest);
            String responseBody = future.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));
        }
    }
}

プライマリキーベースのクエリ

FetchRequest を使用して、プライマリキー ID で特定のレコードをフェッチします。これは直接的なポイントルックアップであり、ベクターの類似度スコアリングは行われません。

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 {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        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("Result:\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, FetchRequest

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    fetch(client)
}

func fetch(client *ha3engine.Client) {
    request := &ha3engine.FetchRequest{}
    request.SetTableName("test1")

    ids := make([]*string, 3)
    ids[0] = tea.String("1")
    ids[1] = tea.String("2")
    ids[2] = tea.String("3")
    request.SetIds(ids)

    response, err := client.Fetch(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

Java (非同期)

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;

public class PrimaryKeyQuery {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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> future = client.fetch(fetchRequest);
            String responseBody = future.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));
        }
    }
}

予測ベースのクエリ

OpenSearch Vector Search Edition が入力をベクトル化する場合に、予測ベースのクエリを使用します。生テキストまたは画像データを渡し、サービスが検索を実行する前にそれをベクターに変換します。

2 つのパラメーターがベクトル化を制御します:

  • content:ベクトル化する入力。テキストベクトル化シナリオではテキストを提供します。画像ベクトル化シナリオでは、テキストまたは Base64 エンコードされた画像を提供します。

  • modal:モダリティ。テキストおよび画像ベクトル化シナリオの両方でテキストでクエリするには、text に設定します。

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 {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        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");
            request.setContent("Child");           // ベクトル化するコンテンツ。
            request.setModal("text");              // モダリティ。
            request.setTopK(100);
            request.setSearchParams("{\\\"qc.searcher.scan_ratio\\\":0.01}");
            SearchResponse searchResponse = client.inferenceQuery(request);
            System.out.println("Result:\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

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    inferenceQuery(client)
}

func inferenceQuery(client *ha3engine.Client) {
    request := &ha3engine.QueryRequest{}
    request.SetTableName("test1")
    request.SetContent("Puppy")
    request.SetNamespace("123")
    request.SetModal("text")

    response, err := client.InferenceQuery(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

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.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class InferenceQuery {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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")
                    .indexName("source_text_vector")
                    .namespace("1")
                    .modal("text")
                    .content("Test text-to-vector conversion")
                    .topK(10)
                    .includeVector(false)
                    .build();

            CompletableFuture<SearchResponse> future = client.inferenceQuery(queryRequest);
            String responseBody = future.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));
        }
    }
}

複数クエリ

MultiQueryRequest を使用して、単一のリクエストで単一のテーブルに対して複数のベクターサブクエリを送信します。すべてのサブクエリの結果はマージされて一緒に返されます。

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;

public class Demo {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        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");
            multiQueryRequest.setTopK(50);
            multiQueryRequest.setOutputFields(Arrays.asList("content", "name", "age"));
            multiQueryRequest.setOrder("DESC");

            QueryRequest queryRequest = new QueryRequest();
            queryRequest.setIndexName("vector");
            queryRequest.setNamespace("space_a");
            queryRequest.setVector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F));

            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, QueryRequest

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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)
    request = MultiQueryRequest(
        table_name="test",
        queries=[query1],
        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() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    multiQuery(client)
}

func multiQuery(client *ha3engine.Client) {
    query := &ha3engine.QueryRequest{}
    query.SetTableName("test1")

    array := make([]*float32, 4)
    v1, v2, v3, v4 := float32(1.23), float32(4.56), float32(7.89), float32(7.89)
    array[0] = &v1
    array[1] = &v2
    array[2] = &v3
    array[3] = &v4
    query.SetVector(array)

    request := &ha3engine.MultiQueryRequest{}
    request.SetTableName("test1")

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

    response, err := client.MultiQuery(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

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.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;

public class MixMultiVectorQuery {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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())
                    .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())
                    .namespace("space_b")
                    .build();
            MultiQueryRequest request = MultiQueryRequest.builder()
                    .tableName("test2")
                    .topK(3)
                    .includeVector(false)
                    .queries(Arrays.asList(query1, query2))
                    .build();

            CompletableFuture<SearchResponse> future = client.multiQuery(request);
            String responseBody = future.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));
        }
    }
}

バッチクエリ

BatchRequest を使用して、複数の独立したクエリ (それぞれが異なるテーブルやインデックスを対象とする可能性があります) を単一の HTTP リクエストで送信します。これにより、ネットワークのラウンドトリップが削減され、クエリプランナーが同じフィルターを共有するクエリを最適化できます。

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 java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class BatchQuery {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        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("Result:\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, BatchRequest

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    batch(client)
}

func batch(client *ha3engine.Client) {
    queryRequest1 := &ha3engine.QueryRequest{}
    queryRequest1.SetTableName("test")
    ids1 := make([]*float32, 4)
    ids1[0] = tea.Float32(0.1)
    ids1[1] = tea.Float32(0.2)
    ids1[2] = tea.Float32(0.3)
    ids1[3] = tea.Float32(0.4)
    queryRequest1.SetVector(ids1)

    queryRequest2 := &ha3engine.QueryRequest{}
    queryRequest2.SetTableName("test1")
    ids2 := make([]*float32, 4)
    ids2[0] = tea.Float32(0.1)
    ids2[1] = tea.Float32(0.2)
    ids2[2] = tea.Float32(0.3)
    ids2[3] = tea.Float32(0.4)
    queryRequest2.SetVector(ids2)

    batchRequest := &ha3engine.BatchRequest{}
    batchRequest.SetQueries([]*ha3engine.QueryRequest{queryRequest1, queryRequest2})

    response, err := client.BatchQuery(batchRequest)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

Java (非同期)

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 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;

public class BatchQuery {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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")
                    .indexName("vector")
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F))
                    .outputFields(Arrays.asList("id", "name"))
                    .build();
            QueryRequest queryRequest2 = QueryRequest.builder()
                    .tableName("test1")
                    .indexName("vector")
                    .vector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F))
                    .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> future = client.batchQuery(request);
            String responseBody = future.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));
        }
    }
}

単一ベクターを使用したハイブリッドクエリ

単一の QueryRequest で密ベクトルと疎ベクトルを組み合わせ、両方のスコアリングシグナルを同時に活用します。

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 {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        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");
            queryRequest.setNamespace("cate1");
            queryRequest.setVector(Arrays.asList(0.0001575F, 0.00682848F));

            SparseData sparseData = new SparseData();
            sparseData.setCount(Arrays.asList(2));                              // 各疎ベクトルの要素数。
            sparseData.setIndices(Arrays.asList(983589459L, 1261855554L));      // 昇順の要素インデックス。
            sparseData.setValues(Arrays.asList(0.0001575F, 0.00682848F));       // インデックス順に一致する要素の値。
            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, QueryRequest

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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"
)

func main() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    mixQuery(client)
}

func mixQuery(client *ha3engine.Client) {
    request := &ha3engine.QueryRequest{}
    request.SetTableName("test1")

    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)
    request.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)

    request.SetSparseData(&ha3engine.SparseData{
        Count:   count,
        Indices: indices,
        Values:  values,
    })

    response, err := client.Query(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

Java (非同期)

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;

public class MixQuery {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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")
                    .indexName("vector")
                    .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())
                    .topK(10)
                    .includeVector(false)
                    .build();

            CompletableFuture<SearchResponse> future = client.query(queryRequest);
            String responseBody = future.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));
        }
    }
}

複数ベクターを使用したハイブリッドクエリ

MultiQueryRequest を使用して、単一のリクエストで複数のサブクエリにわたって密ベクトルと疎ベクトルを組み合わせます。各サブクエリは独自の疎データを保持でき、複数のベクターによるハイブリッドスコアリングを同時に実行できます。

重要

複数ベクターに基づくハイブリッドクエリを実行する場合、単一のクエリ内のすべてのベクターは同じタイプである必要があります (例えば、複数の密ベクトル、または密ベクトルと疎ベクトルのペア)。

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 {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        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");
            multiQueryRequest.setTopK(50);
            multiQueryRequest.setOutputFields(Arrays.asList("content", "source", "instance_id"));
            multiQueryRequest.setFilter("type='TEXT'");
            multiQueryRequest.setOrder("DESC");

            QueryRequest queryRequest = new QueryRequest();
            queryRequest.setIndexName("index");
            queryRequest.setNamespace("cate1");
            queryRequest.setVector(Arrays.asList(0.0001575F, 0.00682848F));

            SparseData sparseData = new SparseData();
            sparseData.setCount(Arrays.asList(2));
            sparseData.setIndices(Arrays.asList(983589459L, 1261855554L));
            sparseData.setValues(Arrays.asList(0.0001575F, 0.00682848F));
            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(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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"
)

func main() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    mixMultiVectorQuery(client)
}

func mixMultiVectorQuery(client *ha3engine.Client) {
    array := make([]*float32, 4)
    value1 := float32(1.23)
    value2 := float32(4.56)
    value3 := float32(7.89)
    value4 := float32(7.89)
    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 := &ha3engine.QueryRequest{}
    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, err := client.MultiQuery(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

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.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;

public class MixMultiVectorQuery {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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())
                    .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())
                    .namespace("space_b")
                    .build();
            MultiQueryRequest request = MultiQueryRequest.builder()
                    .tableName("test2")
                    .topK(3)
                    .includeVector(false)
                    .queries(Arrays.asList(query1, query2))
                    .build();

            CompletableFuture<SearchResponse> future = client.multiQuery(request);
            String responseBody = future.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));
        }
    }
}

ベクターとテキストに基づくハイブリッドクエリ

単一の SearchRequest で、k-最近傍 (k-NN) ベクトル検索と全文検索を組み合わせます。knn フィールドはベクターパラメーターを持つ QueryRequest を受け取り、text フィールドはクエリ文字列を持つ TextQuery を受け取ります。

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;

public class VectorSearchService {

    private Client client;

    @Before
    public void clientInit() throws Exception {
        Config config = new Config();
        config.setInstanceId("ha-cn-i7*****605");
        config.setAccessUserName("username");
        config.setAccessPassWord("password");
        config.setEndpoint("ha-cn-i7*****605.public.ha.aliyuncs.com");
        client = new Client(config);
    }

    @Test
    public void search() throws Exception {
        try {
            // ベクター (k-NN) パラメーター。
            QueryRequest queryRequest = new QueryRequest();
            queryRequest.setIndexName("vector");
            queryRequest.setTopK(10);
            queryRequest.setVector(Arrays.asList(0.62498F, 0.886408F, 0.586114F, 0.043189F));
            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);

            // テキストクエリパラメーター。
            TextQuery textQuery = new TextQuery();
            textQuery.setQueryString("content:'Publish'");

            SearchRequest request = new SearchRequest();
            request.setTableName("test1");
            request.setKnn(queryRequest);
            request.setText(textQuery);
            request.setSize(10);
            request.setOutputFields(Arrays.asList("id", "content", "name"));

            SearchResponse searchResponse = client.search(request);
            System.out.println("Result:\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, QueryRequest, RankQuery

config = Config(
    endpoint="http://ha-cn-i7*****605.public.ha.aliyuncs.com",
    access_user_name="username",
    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:'Publish'")
    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"
)

func main() {
    config := &ha3engine.Config{
        Endpoint:       tea.String("ha-cn-i7*****605.public.ha.aliyuncs.com"),
        AccessUserName: tea.String("username"),
        AccessPassWord: tea.String("password"),
        RuntimeOptions: &service.RuntimeOptions{
            KeepAlive:    tea.Bool(true),
            MaxIdleConns: tea.Int(1000),
            ReadTimeout:  tea.Int(1000),
        },
    }

    client, err := ha3engine.NewClient(config)
    if err != nil {
        fmt.Println(err)
        return
    }
    search(client)
}

func search(client *ha3engine.Client) {
    searchRequest := &ha3engine.SearchRequest{}
    searchRequest.SetTableName("test1")

    knn := &ha3engine.QueryRequest{}
    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:'Publish'")

    searchRequest.SetText(text)
    searchRequest.SetKnn(knn)

    response, err := client.Search(searchRequest)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(response)
}

Java (非同期)

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 {

    private AsyncClient client;

    @Before
    public void clientInit() {
        AsyncConfigInfoProvider provider = AsyncConfigInfoProvider.create("username", "password");
        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")
                    .size(10)
                    .knn(QueryRequest.builder()
                            .vector(Arrays.asList(0.1f, 0.2f, 0.3f, 0.4f))
                            .namespace("space_a")
                            .build())
                    .text(TextQuery.builder()
                            .queryString("content:'Content'")
                            .build())
                    .outputFields(Arrays.asList("name", "age", "content"))
                    .build();

            CompletableFuture<SearchResponse> future = client.search(request);
            String responseBody = future.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));
        }
    }
}

注意事項

  • 複数ベクターに基づくハイブリッドクエリを実行する場合、単一のクエリ内のすべてのベクターは同じタイプである必要があります (例えば、複数の密ベクトル、または密ベクトルと疎ベクトルのペア)。

  • Go の依存関係については、go get を実行する際に、常にエディション固有のタグ (@v1.1.17-vector) を指定してください。タグなしのコマンド go get github.com/aliyun/alibabacloud-ha3-go-sdk は、異なるエディションの SDK に解決される可能性があるため、使用しないでください。

  • レスポンスパラメーターの詳細については、「レスポンスパラメーター」をご参照ください。

次のステップ

  • フィルター式 — 完全なフィルター構文リファレンス

  • QcSearcher 設定 — 定量的クラスタリング検索パラメーターの調整

  • HNSW 設定 — Hierarchical Navigable Small World インデックスパラメーターの調整