SolrCloudのシャーディングとドキュメントルーティング(その2)

はじめに

前回はドキュメントルーターとして”compositeId”を選んだときの挙動を説明しました。今回取り上げるのはもう一つのドキュメントルーター”implicit”です。

implicitルーターの準備

$ cd server/solr/configsets
$ cp -r _default shard_test2
$ ../../scripts/cloud-scripts/zkcli.sh -zkhost localhost:9983 -cmd upconfig -confdir shard_test2/conf -confname shard_test2
$ ../../scripts/cloud-scripts/zkcli.sh -zkhost localhost:9983 -cmd upconfig -confdir shard_test2/conf -confname shard_test2
$ curl 'http://localhost:8983/solr/admin/collections?action=CREATE&router.name=implicit&name=shard_test2&shards=shard1,shard2,shard3,shard4&maxShardsPerNode=8&replicationFactor=1&collection.configName=shard_test2&wt=xml'

compositeIdのときはnumShardsでシャードの数を指定しますが、implicitではshardsパラメータで各シャードの名前を1個ずつ指定します。

データ投入

前回と同じデータを、シャードの指定なしで投入してみます。

$ curl 'http://localhost:8983/solr/shard_test2/update?commit=true&indent=true' --data-binary @data.json -H 'Content-Type: application/json'

どういうシャード分けされたかを確認。

$ for i in {1..4}; do curl -s "http://localhost:8983/solr/shard_test2/select?q=*:*&rows=0&shards=shard${i}"|jq '.response.numFound'; done
0
9236
0
0

分散されずに特定のシャードにすべてのデータが投入されていました。

シャードを指定してのデータ投入

一旦削除して作り直し。

$ curl 'http://localhost:8983/solr/admin/collections?action=DELETE&name=shard_test2'
$ curl 'http://localhost:8983/solr/admin/collections?action=CREATE&router.name=implicit&name=shard_test2&shards=shard1,shard2,shard3,shard4&maxShardsPerNode=8&replicationFactor=1&collection.configName=shard_test2&router.field=area&wt=xml'

投入時にシャードを指定するには、_route_パラメータを利用します。

$ cat d.json
[
{"id":"1","type":"官公庁","area":"住之江区","name":"軽自動車検査協会大阪主管事務所","address":"住之江区南港東3-4-62"}
]
$ curl 'http://localhost:8983/solr/shard_test2/update?commit=true&indent=true&_route_=shard1' --data-binary @d.json -H 'Content-Type: application/json'

d.json は1件だけのデータです。指定したshard1に入ったことを確認します。

$ for i in {1..4}; do curl -s "http://localhost:8983/solr/shard_test2/select?q=*:*&rows=0&shards=shard${i}"|jq '.response.numFound'; done
1
0
0
0

shard2に1件追加

$ cat d.json
[
{"id":"2","type":"官公庁","area":"住之江区","name":"軽自動車検査協会大阪主管事務所","address":"住之江区南港東3-4-62"}
]
$ curl 'http://localhost:8983/solr/shard_test2/update?commit=true&indent=true&_route_=shard2' --data-binary @d.json -H 'Content-Type: application/json'
$ for i in {1..4}; do curl -s "http://localhost:8983/solr/shard_test2/select?q=*:*&rows=0&shards=shard${i}"|jq '.response.numFound'; done
1
1
0
0

shard3に1件追加

$ cat d.json
[
{"id":"3","type":"官公庁","area":"住之江区","name":"軽自動車検査協会大阪主管事務所","address":"住之江区南港東3-4-62"}
]
$ curl 'http://localhost:8983/solr/shard_test2/update?commit=true&indent=true&_route_=shard3' --data-binary @d.json -H 'Content-Type: application/json'
$ for i in {1..4}; do curl -s "http://localhost:8983/solr/shard_test2/select?q=*:*&rows=0&shards=shard${i}"|jq '.response.numFound'; done
1
1
1
0

shard4に1件追加

$ cat d.json
[
{"id":"4","type":"官公庁","area":"住之江区","name":"軽自動車検査協会大阪主管事務所","address":"住之江区南港東3-4-62"}
]
$ curl 'http://localhost:8983/solr/shard_test2/update?commit=true&indent=true&_route_=shard4' --data-binary @d.json -H 'Content-Type: application/json'
$ for i in {1..4}; do curl -s "http://localhost:8983/solr/shard_test2/select?q=*:*&rows=0&shards=shard${i}"|jq '.response.numFound'; done
1
1
1
1

検索

特に指定しなければ、全シャードを対象にした検索になります。

$ curl -s 'http://localhost:8983/solr/shard_test2/select?q=*:*'{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":15,
    "params":{
      "q":"*:*"}},
  "response":{"numFound":4,"start":0,"maxScore":1.0,"docs":[
      {
        "id":"1",
        "type":["官公庁"],
        "area":["住之江区"],
        "name":["軽自動車検査協会大阪主管事務所"],
        "address":["住之江区南港東3-4-62"],
        "_version_":1634782971384823808},
      {
        "id":"2",
        "type":["官公庁"],
        "area":["住之江区"],
        "name":["軽自動車検査協会大阪主管事務所"],
        "address":["住之江区南港東3-4-62"],
        "_version_":1634782988669550592},
      {
        "id":"3",
        "type":["官公庁"],
        "area":["住之江区"],
        "name":["軽自動車検査協会大阪主管事務所"],
        "address":["住之江区南港東3-4-62"],
        "_version_":1634782999227662336},
      {
        "id":"4",
        "type":["官公庁"],
        "area":["住之江区"],
        "name":["軽自動車検査協会大阪主管事務所"],
        "address":["住之江区南港東3-4-62"],
        "_version_":1634783009317060608}]
  }}

シャードを指定しての検索。

$ curl -s 'http://localhost:8983/solr/shard_test2/select?q=*:*&shards=shard4'
{
  "responseHeader":{
    "zkConnected":true,
    "status":0,
    "QTime":4,
    "params":{
      "q":"*:*",
      "shards":"shard4"}},
  "response":{"numFound":1,"start":0,"maxScore":1.0,"docs":[
      {
        "id":"4",
        "type":["官公庁"],
        "area":["住之江区"],
        "name":["軽自動車検査協会大阪主管事務所"],
        "address":["住之江区南港東3-4-62"],
        "_version_":1634783009317060608}]
  }}

implicitルーターが向くデータ

ここまで見てきたように、compositeIdルーターは自動で程よく分散検索を実現させてくれるルーター、implicitルーターは自分で手動で制御したいときに向いたルーターです。今回使ったデータはcompositeIdルーターに向いたデータと言えるでしょう。

implicitルーターに向いているのは、たとえばログデータです。月単位でシャードを分けてシャードを指定しつつデータを投入、新しい月が来たらシャードを追加、といった使い方ができます。

コメント