演習 5: ベクトルの使用
演習 5: Solr でのベクトルの使用
この演習では、演習 4 で既に見た Films の例を使用します。
準備
tutorial-films.adoc#restart-solrの手順に従って、Solr が実行されていることを確認してください。次に、次のセクションに進みます。
ベクトルデータの準備
$ bin/solr create -c films
コレクション作成時に ConfigSet を指定しなかったため、_default
ConfigSet を使用します。
まず、ベクトルフィールドタイプ、ベクトル値を保持するフィールド、およびいくつかのサポートフィールドを追加するために、スキーマを更新する必要があります。
$ curl https://127.0.0.1:8983/solr/films/schema -X POST -H 'Content-type:application/json' --data-binary '{
"add-field-type" : {
"name":"knn_vector_10",
"class":"solr.DenseVectorField",
"vectorDimension":10,
"similarityFunction":"cosine",
"knnAlgorithm":"hnsw"
},
"add-field" : [
{
"name":"film_vector",
"type":"knn_vector_10",
"indexed":true,
"stored":true
},
{
"name":"name",
"type":"text_general",
"multiValued":false,
"stored":true
},
{
"name":"initial_release_date",
"type":"pdate",
"stored":true
}
]
}'
ベクトルを使用して Films データをインデックス作成します
ベクトルは films.json
ファイルに埋め込まれているため、新しく定義したスキーマフィールドを利用して、そのデータをインデックス作成しましょう。
Linux/Mac
$ bin/solr post -c films example/films/films.json
Windows
$ bin/solr post -c films example\films\films.json
ベクトル検索を実行してみましょう
クエリを実行する前に、例としてターゲットベクトルを定義します。これは、*ファインディング・ニモ*、*ビー・ムービー*、*ハリー・ポッターと秘密の部屋*の 3 つの映画を見た人をシミュレートしたものです。各映画のベクトルを取得し、結果の平均ベクトルを計算します。これは、後続の例クエリすべてへの入力ベクトルとして使用されます。
[-0.1784, 0.0096, -0.1455, 0.4167, -0.1148, -0.0053, -0.0651, -0.0415, 0.0859, -0.1789]
Solr のストリーミング機能を使用してベクトルを計算することに興味がありますか?Solr Admin ストリームUIを介して実行できるストリーミング式の例を以下に示します。
出力は次のとおりです。
|
前に計算したターゲットベクトルに最も類似した上位 10 個の映画を検索します(推奨事項のための KNN クエリ)。
'https://127.0.0.1:8983/solr/films/query?q={%21knn%20f=film_vector%20topK=10}[-0.1784,0.0096,-0.1455,0.4167,-0.1148,-0.0053,-0.0651,-0.0415,0.0859,-0.1789]'
-
結果の中に、*キュリアス・ジョージ*や*バンビ*などのアニメーションファミリー映画が含まれていることに注目してください。これは、ターゲットベクトルが他の 2 つのアニメーションファミリー映画(*ファインディング・ニモ*と*ビー・ムービー*)を使用して作成されたためです。
-
また、結果の中に、その人が既に見た 2 つの映画があることに注目してください。次の例では、それらを除外します。
既に見た映画を除外して、結果のベクトルに最も類似した上位 10 個の映画を検索します(フィルタクエリを使用した KNN クエリ)。
https://127.0.0.1:8983/solr/films/query?q={!knn%20f=film_vector%20topK=10}[-0.1784,0.0096,-0.1455,0.4167,-0.1148,-0.0053,-0.0651,-0.0415,0.0859,-0.1789]&fq=-id:("%2Fen%2Ffinding_nemo"%20"%2Fen%2Fbee_movie"%20"%2Fen%2Fharry_potter_and_the_chamber_of_secrets_2002")
-
名前の中に「シンデレラ」を含む映画を、ターゲットベクトルに最も類似した上位 50 個の映画の中から検索します(フィルタクエリとしての KNN)。
https://127.0.0.1:8983/solr/films/query?q=name:cinderella&fq={!knn%20f=film_vector%20topK=50}[-0.1784,0.0096,-0.1455,0.4167,-0.1148,-0.0053,-0.0651,-0.0415,0.0859,-0.1789]
-
インデックスには 3 つの「シンデレラ」映画がありますが、ターゲットベクトルに最も類似した上位 50 個の中に含まれているのは 1 つだけです(*シンデレラIII: 時の試練*)。
-
-
ジャンルに「アニメーション」が含まれている映画を検索し、元のクエリスコアにターゲットベクトルとの類似度を 2 倍 (2x) 加算 (合計) して、上位 5 つのドキュメントを再ランキングします (再ランキングを使用した KNN)。
https://127.0.0.1:8983/solr/films/query?q=genre:animation&rqq={!knn%20f=film_vector%20topK=10000}[-0.1784,0.0096,-0.1455,0.4167,-0.1148,-0.0053,-0.0651,-0.0415,0.0859,-0.1789]&rq={!rerank%20reRankQuery=$rqq%20reRankDocs=5%20reRankWeight=2}
-
全ての映画に対してベクトル類似度スコアを計算することを保証するために、ドキュメントの総数(1100)よりも大きい数値である
topK=10000
を設定しました。 -
サブクエリ、関数クエリ、およびパラメータデリファレンシングのSolr機能を使用して、ベクトル類似度スコアを他のスコアと組み合わせることが可能です。
-
-
"harry potter"の映画を検索し、語彙的クエリスコアではなくターゲットベクトルとの類似度に基づいて結果をランク付けします。
q
パラメータに加えて、全ての映画間の類似度スコアを計算する(topK=10000
を設定しているので)、q_vector
という名前の「サブクエリ」を定義します。次に、ベクトル類似度スコアに従って降順でランク付けしたいことを指定するために、サブクエリパラメータ名をsort
の入力として使用します(sort=$q_vector desc
)。https://127.0.0.1:8983/solr/films/query?q=name:"harry%20potter"&q_vector={!knn%20f=film_vector%20topK=10000}[-0.1784,0.0096,-0.1455,0.4167,-0.1148,-0.0053,-0.0651,-0.0415,0.0859,-0.1789]&sort=$q_vector%20desc
-
名前に"the"を含む映画を検索し、元の語彙的クエリランキングを維持しますが、ターゲットベクトルとの類似度が0.8以上の映画のみを返します。前述のように、サブクエリ
q_vector
を定義しますが、今回はfrange
フィルタの入力として使用し、ベクトル類似度スコアが少なくとも0.8のドキュメントを要求します。https://127.0.0.1:8983/solr/films/query?q=name:the&q_vector={!knn%20f=film_vector%20topK=10000}[-0.1784,0.0096,-0.1455,0.4167,-0.1148,-0.0053,-0.0651,-0.0415,0.0859,-0.1789]&fq={!frange%20l=0.8}$q_vector
-
"batman"の映画を検索し、元の語彙的クエリスコアの70%とターゲットベクトルとの類似度の30%を組み合わせて結果をランク付けします。メインクエリ
q
とサブクエリq_vector
に加えて、メインq
クエリの語彙的スコアを保持するq_lexical
クエリも指定します。次に、score_combined
というパラメータ変数を指定し、語彙的スコアと類似度スコアをスケーリングし、0.7と0.3の重みを適用して、その結果を合計します。sort
パラメータを組み合わせたスコアに従ってソートするように設定し、fl
パラメータも設定して、レスポンスで中間スコアと組み合わせたスコアの値を表示できるようにします。https://127.0.0.1:8983/solr/films/query?q=name:batman&q_lexical={!edismax%20v=$q}&q_vector={!knn%20f=film_vector%20topK=10000}[-0.1784,0.0096,-0.1455,0.4167,-0.1148,-0.0053,-0.0651,-0.0415,0.0859,-0.1789]&score_combined=sum(mul(scale($q_lexical,0,1),0.7),mul(scale($q_vector,0,1),0.3))&sort=$score_combined%20desc&fl=name,score,$q_lexical,$q_vector,$score_combined