ベクトル演算
このセクションでは、ベクトル演算とベクトル操作関数について説明します。
配列
配列は、`array`関数を使用して作成できます。
たとえば、以下の式は3つの要素を持つ数値配列を作成します
array(1, 2, 3)
この式を`/stream`ハンドラに送信すると、JSON配列で応答します
{
"result-set": {
"docs": [
{
"return-value": [
1,
2,
3
]
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
可視化
`zplot`関数を使用して、Zeppelin-Solrを使用してベクトルを可視化できます。
最初に、配列関数をテーブルとして可視化するとどうなるかを見てみましょう。

コンマ区切りの値のリストを持つ1行として表示されます。この出力は、どのプロットツールを使用していても可視化できないことがわかります。
配列をプロットするには、`zplot`関数が必要です。最初に、`zplot`の出力がJSON形式でどのように見えるかを見てみましょう。
zplot(x=array(1, 2, 3))
この式を`/stream`ハンドラに送信すると、JSON配列で応答します
{
"result-set": {
"docs": [
{
"x": 1
},
{
"x": 2
},
{
"x": 3
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
`zplot`は、配列をフィールド`x`を持つ3つのタプルに変換しました。
別の配列を追加してみましょう
zplot(x=array(1, 2, 3), y=array(10, 20, 30))
この式を`/stream`ハンドラに送信すると、JSON配列で応答します
{
"result-set": {
"docs": [
{
"x": 1,
"y": 10
},
{
"x": 2,
"y": 20
},
{
"x": 3,
"y": 30
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
これで、`x`と`y`フィールドを持つ3つのタプルができました。
Zeppelin-Solrがこの出力をテーブル形式でどのように処理するかを見てみましょう

これで`x`と`y`の列が定義されたので、線チャートの1つに切り替えて、チャート設定を使用してプロットするフィールドをプラグインするだけです

各チャートには設定があり、**設定**をクリックすることで確認できます。
さまざまなタイプの可視化のために、チャートタイプを切り替えることができます。棒グラフの例を以下に示します

配列操作
配列は、配列を操作する関数にパラメータとして渡すことができます。
たとえば、配列は`rev`関数を使用して反転できます
rev(array(1, 2, 3))
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": [
3,
2,
1
]
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
別の例は、配列の長さを返す`length`関数です
length(array(1, 2, 3))
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": 3
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
配列のスライスは、開始範囲と終了範囲から配列の要素をコピーする`copyOfRange`関数を使用して取得できます。
copyOfRange(array(1,2,3,4,5,6), 1, 4)
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": [
2,
3,
4
]
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
配列の要素は、`ltrim`(左トリミング)関数と`rtrim`(右トリミング)関数を使用してトリミングできます。 `ltrim`関数と`rtrim`関数は、配列の左または右から指定された数の要素を削除します。
以下の例は、`ltrim`関数を使用して配列の最初の2つの要素をトリミングする方法を示しています。
ltrim(array(0,1,2,3,4,5,6), 2)
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": [
2,
3,
4,
5,
6,
]
},
{
"EOF": true,
"RESPONSE_TIME": 1
}
]
}
}
インデックスによる値の取得
ベクトルからの値は、`valueAt`関数を使用してインデックスによって取得できます。
valueAt(array(0,1,2,3,4,5,6), 2)
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": 2
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
シーケンス
`sequence`関数は、配列として数値のシーケンスを生成するために使用できます。以下の例では、0から開始し、2のステップで10個の数値のシーケンスを返します。
sequence(10, 0, 2)
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": [
0,
2,
4,
6,
8,
10,
12,
14,
16,
18
]
},
{
"EOF": true,
"RESPONSE_TIME": 7
}
]
}
}
`natural`関数は、ゼロから始まる**自然数**のシーケンスを作成するために使用できます。自然数は正の整数です。
以下の例では、ゼロから始まり、10までの(10は含まない)すべての自然数を含むシーケンスを作成します。
natural(10)
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": [
0,
1,
2,
3,
4,
5,
6,
7,
8,
9
]
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
ベクトルのソート
配列は、`asc`関数を使用して自然な昇順でソートできます。
以下の例は、`asc`関数を使用して配列をソートする方法を示しています。
asc(array(10,1,2,3,4,5,6))
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": [
1,
2,
3,
4,
5,
6,
10
]
},
{
"EOF": true,
"RESPONSE_TIME": 1
}
]
}
}
ベクトルの集計とノルム
配列の集計を実行し、ノルムを返す関数のセットがあります。これらの関数は配列全体を操作し、単一の値を返します。次のベクトル集計およびノルム関数が使用可能です:`mult`、`add`、`sumSq`、`mean`、`l1norm`、`l2norm`、`linfnorm`。
以下の例は、配列のすべての値を乗算する`mult`関数を示しています。
mult(array(2,4,8))
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": 64
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
ベクトルノルム関数は、ベクトルの大きさを計算するためのさまざまな公式を提供します。
以下の例は、配列の`l2norm`を計算します。
l2norm(array(2,4,8))
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": 9.16515138991168
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
スカラーベクトル演算
スカラーベクトル演算関数は、スカラー値をベクトルのすべての値に加算、減算、乗算、または除算します。これらの操作を実行する関数は次のとおりです:`scalarAdd`、`scalarSubtract`、`scalarMultiply`、`scalarDivide`。
以下は、スカラー値`3`を配列のすべての値に乗算する`scalarMultiply`関数の例です。
scalarMultiply(3, array(1,2,3))
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": [
3,
6,
9
]
},
{
"EOF": true,
"RESPONSE_TIME": 0
}
]
}
}
要素ごとのベクトル演算
2つのベクトルは、要素ごとのベクトル演算関数を使用して加算、減算、乗算、除算できます。使用可能な要素ごとのベクトル演算関数は次のとおりです:`ebeAdd`、`ebeSubtract`、`ebeMultiply`、`ebeDivide`。
以下の式は、2つの配列の要素ごとの減算を実行します。
ebeSubtract(array(10, 15, 20), array(1,2,3))
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": [
9,
13,
17
]
},
{
"EOF": true,
"RESPONSE_TIME": 5
}
]
}
}
ドット積とコサイン類似度
`dotProduct`関数と`cosineSimilarity`関数は、多くの場合、2つの疎ベクトル間の類似度尺度として使用されます。 `dotProduct`は角度と大きさの両方の尺度ですが、`cosineSimilarity`は角度のみの尺度です。
以下は、`dotProduct`関数の例です。
dotProduct(array(2,3,0,0,0,1), array(2,0,1,0,0,3))
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": 7
},
{
"EOF": true,
"RESPONSE_TIME": 15
}
]
}
}
以下は、`cosineSimilarity`関数の例です。
cosineSimilarity(array(2,3,0,0,0,1), array(2,0,1,0,0,3))
この式を`/stream`ハンドラに送信すると、次のようになります。
{
"result-set": {
"docs": [
{
"return-value": 0.5
},
{
"EOF": true,
"RESPONSE_TIME": 7
}
]
}
}