前回の記事に書いたように、compositeIdによるドキュメントルーティングを採用した場合、compositeIdのハッシュ値のどの範囲をどのシャードが担当するのかはSolrの管理画面で確認することができます。ただし、実際のハッシュ値を知ることは実はできません。
簡単なテストプログラムを書いて、compositeIdのハッシュ値がどのように計算されるのかを確認してみました。
まずは単独のIDでハッシュを計算してみます。
$ java -cp .:solr-solrj-8.1.0.jar CompositeIdTest '1234' id = 1234 hash = 721c5dc3 $ java -cp .:solr-solrj-8.1.0.jar CompositeIdTest '中央区' id = 中央区 hash = a812f493 $ java -cp .:solr-solrj-8.1.0.jar CompositeIdTest '公園' id = 公園 hash = eb2b06c4
IDを組み合わせてみます。
$ java -cp .:solr-solrj-8.1.0.jar CompositeIdTest '中央区!1234' id = 中央区!1234 hash = a8125dc3 $ java -cp .:solr-solrj-8.1.0.jar CompositeIdTest '中央区!公園!1234' id = 中央区!公園!1234 hash = a82b5dc3
8ビットで16進数2桁、16ビットで16進数4桁です。
「中央区!1234」の場合は16ビット:16ビットになるので
「中央区(a812f493)」の上位4桁
「1234(721c5dc3)」の下位4桁
でa8125dc3になっていることが分かります。
「中央区!公園!1234」の場合は8ビット:8ビット:16ビットなので
「中央区(a812f493)」の上位2桁
「公園(eb2b06c4)」の3桁目と4桁目
「1234(721c5dc3)」の下位4桁
でa82b5dc3となります。
さらにビット数を指定してみます。
$ java -cp .:solr-solrj-8.1.0.jar CompositeIdTest '中央区/4!公園/4!1234' id = 中央区/4!公園/4!1234 hash = ab1c5dc3 $ java -cp .:solr-solrj-8.1.0.jar CompositeIdTest '中央区/4!公園!1234' id = 中央区/4!公園!1234 hash = ab2c5dc3
「中央区/4!公園/4!1234」の場合は4ビット:4ビット:24ビットなので
「中央区(a812f493)」の上位1桁
「公園(eb2b06c4)」の2桁目
「1234(721c5dc3)」の3桁目以降
でab1c5dc3となります。
「中央区/4!公園!1234」の場合に無指定の「公園」の扱いがどうなるか興味があったのですが、2階層の場合はデフォルト8ビットなので「中央区/4!公園/8!1234」と同じになるようです。
「中央区(a812f493)」の上位1桁
「公園(eb2b06c4)」の2,3桁目
「1234(721c5dc3)」の4桁目以降
でab2c5dc3となります。
簡単なプログラムではありますが、特定のレコードがどのシャードに配置されているのかを確認したい場合に便利に使えそうです。