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

DashVector:グループ検索ドキュメント

最終更新日:Apr 01, 2026

query_group_by() メソッドを使用して、コレクションを検索し、指定フィールドの値に基づいて結果をグループ化します。これは、検索拡張生成(RAG)パイプラインにおいて特に有用です。たとえば、1 つのドキュメントが複数のチャンクに分割される場合、グループ化を行わないと、上位の検索結果に同一ドキュメントからのチャンクが複数含まれ、他のドキュメントが十分に表現されない可能性があります。

前提条件

開始する前に、以下の準備が完了していることを確認してください。

API 定義

Collection.query_group_by(
        self,
        vector: Optional[Union[List[Union[int, float]], np.ndarray]] = None,
        *,
        group_by_field: str,
        group_count: int = 10,
        group_topk: int = 10,
        id: Optional[str] = None,
        filter: Optional[str] = None,
        include_vector: bool = False,
        partition: Optional[str] = None,
        output_fields: Optional[List[str]] = None,
        sparse_vector: Optional[Dict[int, float]] = None,
        async_req: bool = False,
    ) -> DashVectorResponse:

YOUR_API_KEY をご自身の API キーに置き換え、YOUR_CLUSTER_ENDPOINT をご自身のクラスターのエンドポイントに置き換えてから、サンプルコードを実行してください。

以下のすべてのサンプルコードは、同一のデータセットを使用します。まず、コレクションの作成およびサンプルデータの挿入を行うため、次のセットアップコードを実行してください。

import dashvector
import numpy as np

client = dashvector.Client(
    api_key='YOUR_API_KEY',
    endpoint='YOUR_CLUSTER_ENDPOINT'
)
ret = client.create(
    name='group_by_demo',
    dimension=4,
    fields_schema={'document_id': str, 'chunk_id': int}
)
assert ret

collection = client.get(name='group_by_demo')

ret = collection.insert([
    ('1', np.random.rand(4), {'document_id': 'paper-01', 'chunk_id': 1, 'content': 'xxxA'}),
    ('2', np.random.rand(4), {'document_id': 'paper-01', 'chunk_id': 2, 'content': 'xxxB'}),
    ('3', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 1, 'content': 'xxxC'}),
    ('4', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 2, 'content': 'xxxD'}),
    ('5', np.random.rand(4), {'document_id': 'paper-02', 'chunk_id': 3, 'content': 'xxxE'}),
    ('6', np.random.rand(4), {'document_id': 'paper-03', 'chunk_id': 1, 'content': 'xxxF'}),
])
assert ret

ベクターによる検索

クエリベクターを指定し、グループ化対象のフィールドを設定します。group_count パラメーターで返されるグループ数を制御し、group_topk パラメーターで各グループに含める結果数を制御します。

ret = collection.query_group_by(
    vector=[0.1, 0.2, 0.3, 0.4],
    group_by_field='document_id',  # document_id フィールドで結果をグループ化します。
    group_count=2,                 # 最大 2 つのグループを返します。
    group_topk=2,                  # 各グループにつき最大 2 件の結果を返します。
)
if ret:
    print('query_group_by success')
    print(len(ret))
    print('------------------------')
    for group in ret:
        print('group key:', group.group_id)
        for doc in group.docs:
            prefix = ' -'
            print(prefix, doc)

期待される出力:

query_group_by success
4
------------------------
group key: paper-01
 - {"id": "2", "fields": {"document_id": "paper-01", "chunk_id": 2, "content": "xxxB"}, "score": 0.6807}
 - {"id": "1", "fields": {"document_id": "paper-01", "chunk_id": 1, "content": "xxxA"}, "score": 0.4289}
group key: paper-02
 - {"id": "3", "fields": {"document_id": "paper-02", "chunk_id": 1, "content": "xxxC"}, "score": 0.6553}
 - {"id": "5", "fields": {"document_id": "paper-02", "chunk_id": 3, "content": "xxxE"}, "score": 0.4401}

応答には、類似度スコア順にランク付けされた 2 つのグループ(paper-01 および paper-02)が含まれ、各グループには最大 2 件の結果が含まれます。

プライマリキーによる検索

id パラメーターを使用して、特定のドキュメントに格納されたベクターに基づくグループ化検索を実行します。

ret = collection.query_group_by(
    id='1',
    group_by_field='name',
)
if ret:
    print('query_group_by success')
    print(len(ret))
    for group in ret:
        print('group:', group.group_id)
        for doc in group.docs:
            print(doc)
            print(doc.id)
            print(doc.vector)
            print(doc.fields)

フィルターを用いた検索

ベクターまたはプライマリキーに加え、filter 式を組み合わせることで、グループ化前の検索結果を絞り込みます。フィルター式は SQL の WHERE 句構文に従う必要があります。

ret = collection.query(
    vector=[0.1, 0.2, 0.3, 0.4],   # プライマリキーによる検索の場合は、代わりに id='...' を使用します。
    group_by_field='name',
    filter='age > 18',              # age が 18 より大きいドキュメントのみを返します。
    output_fields=['name', 'age'],  # name および age フィールドのみを返します。
    include_vector=True
)

完全なフィルター構文については、「条件付きフィルタリング」をご参照ください。

密ベクターおよび疎ベクターを用いた検索

vector および sparse_vector の両方を指定することで、密検索と疎検索を統合できます。これにより、キーワード認識型の意味検索が可能となり、疎ベクターがキーワードの重みを、密な意味埋め込みとともにエンコードします。

ret = collection.query(
    vector=[0.1, 0.2, 0.3, 0.4],
    sparse_vector={1: 0.3, 20: 0.7},
    group_by_field='name',
)

キーワード認識型の意味ベクトル検索の詳細については、「キーワード認識型意味ベクトル検索」をご参照ください。

リクエストパラメーター

vector または id のいずれかを指定してください。
パラメーターデフォルト説明
group_by_fieldstrNone必須。 結果をグループ化する対象のフィールドです。スキーマフリーのフィールドはサポートされていません。
vectorOptional[Union[List[Union[int, float]], np.ndarray]]Noneクエリベクターです。
idOptional[str]Noneプライマリキーです。このドキュメントに格納されたベクターを用いて検索します。
group_countint10返す最大グループ数です。これはベストエフォートパラメーターであり、通常は指定した数のグループを返すことができます。
group_topkint10各グループにつき返す類似結果の数です。これは group_count より優先度の低いベストエフォートパラメーターです。
filterOptional[str]NoneSQL WHERE 句の構文を使用した条件付きフィルター。詳細については、「条件付きフィルター」をご参照ください。
include_vectorboolFalse応答にベクトルデータを含めるかどうかを指定します。
partitionOptional[str]None検索対象のパーティションです。
output_fieldsOptional[List[str]]None返すフィールドです。デフォルトではすべてのフィールドを返します。
sparse_vectorOptional[Dict[int, float]]Noneキーワード認識型検索用の疎ベクターです。
async_reqboolFalseリクエストを非同期で送信するかどうかを指定します。

応答パラメーター

DashVectorResponse オブジェクトを返します。状態コードの詳細については、「状態コード」をご参照ください。

パラメーター説明
codeint状態コードです。0
messagestr応答メッセージです。success
request_idstrリクエスト ID です。19215409-ea66-4db9-8764-26ce2eb5bb99
outputList[Group]グループ化検索の結果です。

制限事項

  • group_by_field は、スキーマで定義されたフィールドである必要があります。スキーマフリーのフィールドはサポートされていません。

  • group_count および group_topk はベストエフォートパラメーターです。実際に返されるグループ数または各グループ内の結果数は、指定値より少なくなる場合があります。