Clojarsの検索APIでライブラリ登録日によるフィルタリング

結論

以下のように、

https://clojars.org/search?q=at%3A%5B1496275200000+TO+1496361600000%5D&format=json

検索クエリとして at:[<検索開始日> TO <検索終了日>] の形式で検索する日付の期間を指定してやればよい (日付はどちらも1970/1/1 00:00:00 GMTからの経過ミリ秒)。

経緯

ClojarsのJSON (or XML) Search APIのドキュメント)には、 基本的なライブラリの名前での検索方法は書いてあっても、その他のフィールドによる検索、たとえばライブラリが登録された日付による 検索の仕方は載っていない。

今とある用件でClojarsで公開されているライブラリのアップデートを検知する仕組みを作ることを検討中なのだけど、これがAPI経由で 取得できないとなると、1時間に1回作り直されるというPOMファイルのリストやJARのリストを クローリングしてdiffを取り、そこからJARをダウンロードするなり、改めて該当するライブラリの情報をAPIでとってくるというようなことを やらないといけないけど、それはわりと面倒。

幸い、別のドキュメントによれば、Clojarsが 内部で使っているLuceneの検索クエリがそのまま使えるようなのでいろいろ試してみる。

しかし、そのためにはライブラリの登録日がLucene上でどこにどういう形式で保存されているのか分からないといけない。 Clojarsの公開されているコードを読んでいると、このあたりに ライブラリ登録日がLucene上で at という名前で保存されているのを発見。

そこで、おもむろにat:[2017-01-01 TO *]みたいなクエリを試してみたがうまくいかず。その周辺にあったその他のフィールド(group-idとか versionとか)での検索は通っているみたいなので、値のレンジの指定方法が間違っていることに気づく。

そこから、時間まで含めて指定してみたりタイムゾーンも必要かと思ってやっていたけれど埒が明かず。再度改めてコードを見直していると このあたりatを数値として 比較しているのを発見。なるほど、UNIX時間か!(正確にはUNIX時間ではなく、Javaでより取得しやすいエポックタイムからの経過ミリ秒だった)

あとは、値のレンジ指定で使えるはずの*が(URLエンコードされたクエリをうまくデコードできていないせいか(未検証))機能していないのもあって、両端ともちゃんと値を 指定してやれば期待した検索結果が得られたという顛末。

しかし、結局そうやって得られた検索結果も、実はClojarsの検索APIがページネーションをしてくれてないせいで、高々24件までしか 取得できない(ちなみに、この件数はClojarsの検索結果を表示するページのレイアウトの都合ということらしい)。Clojureのライブラリは そこまで高頻度に登録されないので、本来やりたいこと(ライブラリ登録の検知)に対しては1時間おきにでもポーリングしてやれば24件を 超えることはないだろうからそれで十分だけど、まぁ暇があったら検索APIでページネーションできるようプルリクエストもしておきたい。

そんなお話。

updatedupdated2017-06-032017-06-03