🚀 Zilliz Cloudを無料で試す、完全管理型のMilvus—10倍の高速パフォーマンスを体験しよう!今すぐ試す>>

milvus-logo
LFAI
  • Home
  • Blog
  • データベースはどのようにクエリを理解し、実行するのか?

データベースはどのようにクエリを理解し、実行するのか?

  • Engineering
May 05, 2022
Milvus

Cover image 表紙画像

この記事はAngela Niによって書き起こされています。

Milvusにおけるベクトル検索とは、ブーリアン式に基づくスカラーフィルタリングによってベクトルを検索することである。スカラーフィルタリングでは、ユーザーはデータの属性に特定の条件を適用してクエリ結果を制限することができる。例えば、1990年から2010年の間に公開された映画で、8.5以上のスコアを持つ映画を検索する場合、属性(公開年とスコア)が条件を満たす映画のみが検索されます。

この投稿では、Milvusにおいて、クエリ式の入力からクエリプランの生成、クエリの実行まで、クエリがどのように完了するのかを検証することを目的としています。

ジャンプ

クエリ式

Milvusでは、属性フィルタリングを伴うクエリの表現は、EBNF(Extended Backus-Naur form)構文を採用しています。下の画像はMilvusの表現ルールです。

Expression Syntax 式の構文

論理式は、二項論理演算子、単項論理演算子、論理式、単式を組み合わせて作成することができます。EBNF構文自体が再帰的であるため、論理式は組み合わせの結果であったり、より大きな論理式の一部であったりします。論理式は多くの下位論理式を含むことができます。Milvusでも同じルールが適用されます。ユーザが多くの条件で結果の属性をフィルタリングする必要がある場合、ユーザは異なる論理演算子や論理式を組み合わせて、独自のフィルタリング条件セットを作成することができます。

Boolean expression ブール式

上の画像はMilvusの論理式ルールの一部を示しています。式には単項論理演算子を追加することができます。現在、Milvusは単項論理演算子 "not "のみをサポートしており、これはスカラーフィールドの値が計算結果を満たさないベクトルを取る必要があることを示します。二項論理演算子には "and "と "or "がある。単式には項式や比較式がある。

加算、減算、乗算、除算のような基本的な算術計算もMilvusのクエリでサポートされています。以下の図は演算の優先順位を示しています。演算子の優先順位は上から順に表示されています。

Precedence 優先順位

Milvusでは、あるフィルムに関するクエリー式はどのように処理されるのでしょうか?

Milvusに豊富なフィルムデータが保存されており、ユーザが特定のフィルムに対するクエリを実行したいとします。例として、Milvusに保存されている各映画データには、映画ID、公開年、映画タイプ、スコア、ポスターの5つのフィールドがあります。この例では、映画IDと公開年のデータ型はint64であり、映画の点数は浮動小数点データである。また、映画のポスターは浮動小数点ベクトルの形式で、映画のタイプは文字列データの形式で格納されている。文字列データ型のサポートは、Milvus 2.1の新機能である。

例えば、ユーザが8.5点以上の映画を検索したい場合。また、2000年以前の10年間から2000年以降の10年間に公開された映画であること、または、その映画のタイプがコメディ映画かアクション映画であることが必要である場合、ユーザは次の述語式を入力する必要があります:score > 8.5 && (2000 - 10 < release_year < 2000 + 10 || type in [comedy,action])

クエリ式を受け取ると、システムは以下の優先順位でクエリを実行する:

  1. スコアが8.5より高い映画のクエリ。クエリー結果は "result1 "と呼ばれる。
  2. 2000-10を計算し、"result2"(1990)を得る。
  3. 2000+10を計算し、"result3"(2010)を得る。
  4. release_year "の値が "result2 "より大きく、"result3 "より小さい映画をクエリーする。つまり、システムは1990年から2010年の間に公開された映画をクエリする必要がある。クエリー結果は "result4 "と呼ばれる。
  5. コメディまたはアクション映画のクエリ。クエリー結果は "result5 "と呼ばれる。
  6. result4 "と "result5 "を組み合わせて、1990年から2010年の間に公開された映画か、コメディ映画かアクション映画のカテゴリーに属する映画を取得する。この結果を "result6 "と呼ぶ。
  7. result1 "と "result6 "の共通部分を取り、すべての条件を満たす最終結果を得る。

Film example 映画の例

プランAST生成

MilvusはプランAST(抽象構文木)生成にオープンソースツールANTLR(ANother Tool for Language Recognition)を活用しています。ANTLRは、構造体テキストファイルやバイナリファイルの読み取り、処理、実行、翻訳のための強力な構文解析ジェネレータです。より具体的には、ANTLR は事前に定義された構文やルールに基づいて構文木を構築し、歩くためのパーサーを生成することができます。以下の画像は、入力式が「SP=100;」である例です。ANTLR の組み込み言語認識機能である LEXER は、入力式に対して 4 つのトークンを生成します - "SP"、"="、"100"、および "; "です。そして、このツールはさらに4つのトークンを解析し、対応する解析木を生成します。

parse tree 解析ツリー

ウォーカー機構はANTLRツールの重要な部分である。すべての解析木をウォークして、各ノードが構文規則に従っているかどうかを調べたり、特定のセンシティブな単語を検出したりするように設計されています。関連する API の一部を下の画像に示します。ANTLR はルートノードから開始し、各サブノードを通って一番下まで下っていくので、解析ツリーの歩き方の順序を区別する必要はありません。

parse tree walker 解析ツリーウォーカー

MilvusはANTLRと同様の方法でクエリ用のPlanASTを生成します。しかし、ANTLRを使用するには、かなり複雑な構文ルールを再定義する必要があります。そのため、Milvusは最も一般的なルールの1つであるブール式ルールを採用し、GitHubでオープンソース化されているExprパッケージに依存して、クエリ式の構文をクエリおよびパースします。

属性フィルタリングを伴う問い合わせの間、Milvusは問い合わせ式を受け取ると、Exprが提供する解析手法であるant-parserを使用して、原始的な未解決計画木を生成します。生成される計画木は単純なバイナリ木です。次に、この計画木はExprとMilvusの組み込みオプティマイザによって微調整されます。Milvusのオプティマイザは前述のウォーカー機構とよく似ています。Exprが提供するプランツリーの最適化機能はかなり洗練されているので、Milvusの組み込みオプティマイザの負担はかなり軽減される。最終的に、アナライザは最適化されたプランツリーを再帰的に解析し、プロトコルバッファ(protobuf)構造のプランASTを生成します。

plan AST workflow プランASTのワークフロー

クエリの実行

クエリの実行は、前のステップで生成されたプランASTの実行を根本とします。

Milvusでは、プランASTはプロト構造で定義されます。下の画像はプロトブフ構造体のメッセージです。式は6種類あり、このうちバイナリ式とユナリ式は、さらにバイナリ論理式とユナリ論理式を持つことができます。

protobuf1 プロトブーフ1

protobuf2 プロトブーフ2

下の図は、クエリ式のUMLイメージです。各式の基本クラスと派生クラスを示しています。各クラスには、ビジターのパラメータを受け付けるメソッドがあります。これは典型的なビジターの設計パターンです。Milvusはこのパターンを使用してプランASTを実行します。最大の利点は、ユーザがプリミティブ式に何もする必要がなく、パターンのメソッドのいずれかに直接アクセスして、特定のクエリ式クラスと関連する要素を変更できることです。

UML UML

計画ASTを実行する際、Milvusはまずプロトタイプの計画ノードを受け取ります。次に、内部C++プロトパーサーを介してセグコア型プランノードが取得されます。この2種類のプランノードを取得すると、Milvusは一連のクラスアクセスを受け付け、プランノードの内部構造を修正して実行します。最後に、Milvusはすべての実行計画ノードを検索し、フィルタリングされた結果を得ます。最終結果はビットマスク形式で出力されます。ビットマスクはビット番号("0 "と "1")の配列です。フィルタリング条件を満たすデータはビットマスクに "1 "と表示され、条件を満たさないデータはビットマスクに "0 "と表示される。

execute workflow 実行ワークフロー

ディープダイブシリーズについて

Milvus 2.0の一般提供の正式発表に伴い、Milvusのアーキテクチャとソースコードの詳細な解釈を提供するために、このMilvus Deep Diveブログシリーズを企画しました。このブログシリーズで扱うトピックは以下の通りです:

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

続けて読む