SolrのStream APIのメモ。
基本的に公式ドキュメントから掻い摘んで持ってきただけです。
/stream
Handler
ストリーミングAPIは、SolrCloud用の拡張可能な並列コンピューティングフレームワークです。
/stream
というリクエストハンドラにストリーミングリクエストを投げると、タプルをJSONストリームとして返すことができます。
この/stream
ハンドラはSolr6以降から使用可能です。
通常の検索のように検索結果の上位N件を返すのではなく、全データを返すことを想定して作られています。
このデータを返す部分は/export
ハンドラでサポートされています。
ストリーミングリクエストとレスポンス
Streaming Expressions | Apache Solr Reference Guide 6.6の例でいうと
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
※ Streaming Expressions | Apache Solr Reference Guide 7.2
ストリーミング関数はワーカコレクション全体で並列化することができます。
/search
パラメータ名 | 概要 |
---|---|
collection |
(必須)検索対象のコレクション。上記の例でいうとenron_emails
|
q |
(必須)solr indexで実行するクエリ |
fl |
(必須)レスポンスに含めるリスト |
sort |
(必須)ソートの指定 |
qt |
使用するクエリタイプ or リクエストハンドラの指定。レスポンスサイズが大きい場合は/export を指定する。defaultは/select
|
DocValuesを使った場合のソートのパフォーマンス - Qiita
Lucene/Solr DocValuesについて調べたことをまとめてみた - YOMON8.NET
/export
数百万件のレコードのsortとexportを処理するために設計されたレスポンスライタ(レスポンスの形式を整形してくれる機能)とランククエリパーサが存在し、それを使って処理することが出来る。
数ミリ秒以内にデータの先頭から送信を開始して、全ての検索結果がsortおよびexportされるまで結果をストリーミングし続けます。
/export
ハンドラを使うためには以下の条件があります。
- ソートするフィールドのdocvaluesがtrue
- エクスポートする全てのフィールドのdocvaluesがtrue
- flとsortの指定が必須