Solr StreamAPI

SolrのStream APIのメモ。
基本的に公式ドキュメントから掻い摘んで持ってきただけです。



# `/stream` Handler
ストリーミングAPIは、SolrCloud用の拡張可能な並列コンピューティングフレームワークです。
`/stream`というリクエストハンドラにストリーミングリクエストを投げると、タプルをJSONストリームとして返すことができます。
この`/stream`ハンドラはSolr6以降から使用可能です。

通常の検索のように検索結果の上位N件を返すのではなく、全データを返すことを想定して作られています。
このデータを返す部分は`/export`ハンドラでサポートされています。

## ストリーミングリクエストとレスポンス
<a href="https://lucene.apache.org/solr/guide/6_6/streaming-expressions.html#streaming-expressions">Streaming Expressions | Apache Solr Reference Guide 6.6</a>の例でいうと

```
curl --data-urlencode 'expr=search(enron_emails,
                                   q="from:1800flowers*",
                                   fl="from, to",
                                   sort="from asc",
                                   qt="/export")' http://localhost:8983/solr/enron_emails/stream
```
のようにリクエストをすると以下のようなJSONを1行（1object）ごとに順次返してくれます。

```
{"result-set":{"docs":[
   {"from":"1800flowers.133139412@s2u2.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers.93690065@s2u2.com","to":"jtholt@ect.enron.com"},
   {"from":"1800flowers.96749439@s2u2.com","to":"alewis@enron.com"},
   {"from":"1800flowers@1800flowers.flonetwork.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers@shop2u.com","to":"lcampbel@enron.com"},
   {"from":"1800flowers@shop2u.com","to":"ebass@enron.com"},
   {"EOF":true,"RESPONSE_TIME":33}]}
}
```
ストリーミングでデータが返ってくるといつ全てのデータが返ってきたのかがわからないのでデータの終端には`{"EOF":true,"RESPONSE_TIME":33}]}`のようなデータが返ってくるようになっています。

このようにデータが順次返ってくるので、返ってくるたびに処理が行え、レスポンス待ちが軽減されます。また、全データをメモリに載せる必要もなくなります。

## ストリーミング式
`expr`: ストリーミング式を指定するために使用されるもの
`search()`: `/stream`ハンドラに引き渡す関数を指定する。

ストリームは以下のようなライブラリと組み合わせることができる
>- Request/response stream processing
- Batch stream processing
- Fast interactive MapReduce
- Aggregations (Both pushed down faceted and shuffling MapReduce)
- Parallel relational algebra (distributed joins, intersections, unions, complements)
- Publish/subscribe messaging
- Distributed graph traversal
- Machine learning and parallel iterative model training
- Anomaly detection
- Recommendation systems
- Retrieve and rank services
- Text classification and feature extraction
- Streaming NLP
- Statistical Programming

※ <a href="https://lucene.apache.org/solr/guide/7_2/streaming-expressions.html#streaming-expressions">Streaming Expressions | Apache Solr Reference Guide 7.2</a>

ストリーミング関数はワーカコレクション全体で並列化することができます。

## `/search`

| パラメータ名      | 概要 |  
|:-----------------|:------------------|
| `collection` |（必須）検索対象のコレクション。上記の例でいうと`enron_emails`| 
| `q` | （必須）solr indexで実行するクエリ | 
| `fl` |（必須）レスポンスに含めるリスト| 
| `sort`|（必須）ソートの指定 |
| `qt` |使用するクエリタイプ or リクエストハンドラの指定。レスポンスサイズが大きい場合は`/export`を指定する。defaultは`/select`  | 

<a href="https://qiita.com/tkondo/items/0ae89121fe3465910344">DocValuesを使った場合のソートのパフォーマンス - Qiita</a>
<a href="https://yomon.hatenablog.com/entry/2017/08/01/234336#DocValues%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">Lucene/Solr DocValuesについて調べたことをまとめてみた - YOMON8.NET</a>

## `/export`
数百万件のレコードのsortとexportを処理するために設計されたレスポンスライタ(レスポンスの形式を整形してくれる機能)とランククエリパーサが存在し、それを使って処理することが出来る。

数ミリ秒以内にデータの先頭から送信を開始して、全ての検索結果がsortおよびexportされるまで結果をストリーミングし続けます。


`/export`ハンドラを使うためには以下の条件があります。

- ソートするフィールドのdocvaluesがtrue
- エクスポートする全てのフィールドのdocvaluesがtrue
- flとsortの指定が必須

<a href="https://lucene.apache.org/solr/guide/7_2/exporting-result-sets.html#exporting-result-sets">Exporting Result Sets | Apache Solr Reference Guide 7.2</a>