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

milvus-logo
LFAI
  • Home
  • Blog
  • 類似検索アプリケーションを強化する文字列データの使い方

類似検索アプリケーションを強化する文字列データの使い方

  • Engineering
August 08, 2022
Xi Ge

Cover カバー

Milvus 2.1では、Milvusをより使いやすくするために、いくつかの重要なアップデートが行われました。その一つが文字列データ型のサポートである。Milvusは現在、文字列、ベクトル、ブール値、整数、浮動小数点数などのデータ型をサポートしています。

この記事では文字列データ型のサポートについて紹介します。文字列データ型を使って何ができるのか、どのように使うのかを学んでください。

戻る

文字列データ型のサポートは、ユーザーから最も期待されている機能の一つです。Milvusのベクトルデータベースを利用したアプリケーションの構築プロセスを効率化し、類似検索やベクトル検索を高速化します。

具体的には、Milvus 2.1は、様々な長さの文字列を格納するVARCHARデータ型をサポートしています。VARCHAR データ型のサポートにより、以下のことが可能になります:

  1. 外部のリレーショナルデータベースを使用することなく、文字列データを直接管理することができます。

VARCHARデータ型のサポートにより、milvusにデータを挿入する際に、文字列を他のデータ型に変換するステップを省略することができます。例えば、オンライン書店の書籍検索システムを開発しているとします。書籍データセットを作成し、書籍の名前で識別したいとします。Milvusが文字列データ型をサポートしていない以前のバージョンでは、Milvusにデータを挿入する前に、まずMySQLのようなリレーショナルデータベースの助けを借りて、文字列(書籍の名前)を書籍IDに変換する必要があるかもしれません。現在、文字列データ型がサポートされているので、単純に文字列フィールドを作成し、ID番号の代わりに書籍名を直接入力することができます。

この利便性は、検索やクエリーのプロセスでも発揮される。例えば、「Hello milvus」を愛読している顧客がいるとしよう。似たような本をシステム内で検索し、クライアントに推薦したいとします。Milvusの以前のバージョンでは、システムは本のIDだけを返すので、あなたはリレーショナルデータベースで対応する本の情報をチェックするために余分なステップを踏む必要がありました。しかし、Milvus 2.1では、すでに書籍名を含む文字列フィールドが作成されているため、書籍名を直接取得することができます。

一言で言えば、文字列データ型のサポートは、文字列データを管理するために他のツールに頼る手間を省き、開発プロセスを大幅に簡素化します。

  1. 属性フィルタリングによるハイブリッド検索と ベクトル・クエリの高速化。

他のスカラーデータ型と同様に、VARCHARはハイブリッド検索やブール式によるベクトル検索で属性フィルタリングに使用することができます。特にmilvus 2.1では、like という演算子が追加され、前方一致を行うことができるようになりました。また、== 演算子を用いて完全一致を行うこともできる。

さらに、MARISA-trieベースの転置インデックスがサポートされ、ハイブリッド検索とクエリを高速化します。続けて読むと、文字列データで属性フィルタリングを実行するために知っておきたい文字列式の全てを知ることができる。

さて、文字列データ型が非常に便利であることはわかりましたが、具体的にどのような場合にこのデータ型を使用してアプリケーションを構築する必要があるのでしょうか?以下では、Milvus 2.1におけるVARCHARデータの管理方法について理解を深めていただくために、文字列データを含むシナリオのコード例をいくつかご紹介します。

コレクションの作成

前の例に従ってみましょう。book_name という主キーフィールドを持つブックコレクションを作成し、そこに文字列データを挿入します。この場合、以下の例に示すように、フィールドスキーマを設定するときにデータ型をDataType.VARCHAR

VARCHARフィールドを作成する場合、パラメータmax_length (値は1~65,535の範囲)で最大文字数を指定する必要があることに注意してください。 この例では、最大長を200に設定しています。

from pymilvus import CollectionSchema, FieldSchema, DataType
book_id = FieldSchema(
  name="book_id", 
  dtype=DataType.INT64, 
)
book_name = FieldSchema( 
  name="book_name", 
  dtype=DataType.VARCHAR, 
  max_length=200, 
  is_primary=True, 
)
word_count = FieldSchema(
  name="word_count", 
  dtype=DataType.INT64,  
)
book_intro = FieldSchema(
  name="book_intro", 
  dtype=DataType.FLOAT_VECTOR, 
  dim=2
)
schema = CollectionSchema(
  fields=[book_id, word_count, book_intro], 
  description="Test book search"
)
collection_name = "book"

データの挿入

コレクションが作成されたので、データを挿入できます。以下の例では、ランダムに生成された2,000行の文字列データを挿入している。

import random
data = [
  [i for i in range(2000)],
  ["book_" + str(i) for i in range(2000)],
  [i for i in range(10000, 12000)],
  [[random.random() for _ in range(2)] for _ in range(2000)],
]

データの削除

book_0book_1 という名前の2冊の本が、あなたのストアではもう入手できないので、データベースから関連情報を削除したいとします。この場合、以下の例に示すように、in という条件式を使用して、削除するエンティティをフィルタリングすることができます。

Milvusは主キーが明確に指定されたエンティティの削除にのみ対応していますので、以下のコードを実行する前に、book_name フィールドが主キーフィールドとして設定されていることを確認してください。

expr = "book_name in [\"book_0\", \"book_1\"]" 
from pymilvus import Collection
collection = Collection("book")     
collection.delete(expr)

インデックスの構築

Milvus2.1はスカラーインデックスの構築をサポートしており、文字列フィールドのフィルタリングを大幅に高速化することができます。ベクターインデックスの構築とは異なり、スカラーインデックスを構築する前にパラメータを準備する必要はありません。Milvusは一時的に辞書ツリー(MARISA-trie)インデックスのみをサポートしているため、VARCHAR型フィールドのインデックスタイプはデフォルトでMARISA-trieとなります。

インデックス構築時にインデックス名を指定することができます。指定しない場合、index_name のデフォルト値は"_default_idx_" 。 以下の例ではインデックス名をscalar_index とした。

from pymilvus import Collection
collection = Collection("book")   
collection.create_index(
  field_name="book_name", 
  index_name="scalar_index",
)

ブーリアン式を指定することで、ベクトル類似検索の際に文字列フィールドをフィルタリングすることができます。

例えば、イントロがHello Milvusに最も似ている本を検索しているが、名前が'book_2'で始まる本だけを取得したい場合、以下の例に示すように、演算子likeを使用して前方一致を行い、対象となる本を取得することができます。

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}},
  "limit": 2,
  "expr": "book_name like \"Hello%\"",
}
res = collection.search(**search_param)

文字列表現

新しく追加された演算子like 以外にも、Milvusの旧バージョンで既にサポートされている演算子を文字列フィールドのフィルタリングに使用することができます。以下はよく使用される文字列式の例です。A は VARCHAR 型のフィールドを表します。以下の文字列式はすべてAND、OR、NOTなどの論理演算子を使って論理的に組み合わせることができることを覚えておいてください。

セット操作

innot in を使って、A in ["str1", "str2"] のようなセット操作を実現することができます。

2つの文字列フィールドの比較

関係演算子を使用して、2 つの文字列フィールドの値を比較することができます。このような関係演算子には、==,!=,>,>=,<,<= があります。詳細については、関係演算子を参照してください。

文字列フィールドは、他のデータ型のフィールドではなく、他の文字列フィールドとしか比較できないことに注意してください。例えば、VARCHAR型のフィールドをBoolean型やinteger型のフィールドと比較することはできません。

フィールドと定数値の比較

== または!= を使用して、フィールドの値が定数値と等しいかどうかを検証できます。

単一の範囲でフィールドをフィルタする

>,>=,<,<= を使用して、A > "str1" のような単一の範囲を持つ文字列フィールドをフィルタリングできます。

接頭辞マッチング

前述したように、Milvus 2.1では、A like "prefix%" のような接頭辞マッチングのための演算子like が追加されました。

次のリリース

Milvus 2.1の正式リリースに伴い、新機能を紹介する一連のブログを用意しました。このブログシリーズの続きを読む

Like the article? Spread the word

続けて読む