🐕

【🚀Qdrant入門】QdrantにおけるFilteringの仕組みと使い方

に公開

Qdrantはベクトルデータベースとして、類似度検索だけでなく、複雑な条件でのフィルタリング機能も提供しています。この記事ではQdrantのFilteringについて体系的に解説し、実際の使用方法を具体例とともに紹介します。

🔎 1. QdrantのFilteringとは?

QdrantのFilteringは、ベクトル類似度検索を実行する際に、特定の条件に一致するデータのみを対象にする機能です。データの属性(ペイロード)に基づいて絞り込むことが可能です。

📐 2. フィルターの基本構造

QdrantのFilterオブジェクトは以下の3つの主要コンポーネントで構成されます。

must: すべての条件を満たす必要があります(AND条件)

should: 少なくとも1つ以上の条件を満たす必要があります(OR条件)

must_not: 条件を満たさないデータを対象にします(NOT条件)

  • 各条件を組み合わせて柔軟なフィルターを作成できます。

📌 3. フィルター条件の例

{
  "filter": {
    "must": [
      { "key": "price", "range": { "gte": 100, "lte": 500 } },
      { "key": "category", "match": { "value": "clothing" } }
    ],
    "should": [
      { "key": "brand", "match": { "value": "nike" } },
      { "key": "brand", "match": { "value": "adidas" } }
    ],
    "must_not": [
      { "key": "out_of_stock", "match": { "value": true } }
    ]
  }
  • 上記例では、価格が100〜500で、カテゴリーがclothingであり、NikeかAdidasブランドの商品を検索します。
  • ただし、在庫切れの商品は除外しています。

🛠 4. 各種条件タイプ

  • Qdrantでは多様なフィルタリング条件をサポートしています。
条件タイプ 説明
match 属性が特定の値に完全一致する
range 数値や日時などの範囲条件を指定
geo_bounding_box 地理的範囲(矩形)でのフィルタリング
geo_polygon ポリゴン内に含まれるデータでフィルタリング

ex)Range条件

{ "key": "age", "range": { "gt": 20, "lt": 30 } }

ex)Geo条件

{ "key": "location", "geo_radius": { "center": { "lat": 35.68, "lon": 139.76 }, "radius": 5000 } }

🚀 5. 高度な条件組み合わせ

  • 複雑な条件を組み合わせることも可能です。
{
  "filter": {
    "must": [
      { "key": "status", "match": { "value": "active" } },
      { "key": "views", "range": { "gte": 1000 } }
    ],
    "should": [
      { "key": "tags", "match": { "value": "sale" } },
      { "key": "tags", "match": { "value": "new" } }
    ]
  }
}
  • このフィルターは、「ステータスがactiveで、ビュー数が1000以上のもの」を必須条件とし、「タグがsaleまたはnewのもの」をオプショナルに指定しています。

🌟 7. 実践的なTips

  • よく使用するフィルターは事前にインデックス化しておくことで、検索速度が向上します。
  • ペイロードデータを適切に構造化すると、フィルター作成が簡単になります
  • 大量データのフィルタリングはscroll APIを使用すると効率的に処理できます。

🚧 まとめ

QdrantのFiltering機能は、強力かつ柔軟な検索条件を実現します。基本的な使い方から高度な条件の組み合わせまで、目的に応じて適切に活用することで、より高精度で効率的なベクトル検索を実現しましょう。

参考ドキュメント

Discussion