2019年6月30日日曜日

主人が検索エンジンを作り始めて2年が経ちました

旧Nyafoo!時代を含め、検索エンジンを構築し始めて2年が経ちました。

スタートすぐは、アクセスが少し集中したらダウン。
メンテしたらダウン。
とにかくダウン。安定して動く構成に仕上げるだけで一苦労でした。

1年たった時は、elasticsearchクラスタや、FESSのフロント系、FESSのクローラ系、nginxのリバースプロキシ、ロードバランサ、クラウドフロントを揃え、スケールしやすい構成にまとめました。

そして2年が過ぎた今年。URLリストは5万件近くになりました。
新聞、雑誌、書籍、オンラインメディア、上場企業、大学、高専、高校など、政府、官公庁、地方自治体、公益法人等、グルメ、ホテル、レジャー設備、交通公共機関、音楽レーベル、音楽事務所、俳優・歌手等公式ページ、辞書。
これぐらいはクロール対象になりました。
インデックスは数千万件で収まるようにしています。

2年過ぎた知禅ですが「やっぱり当たらない検索エンジン」。時々近いものが出てくるけれど、昔のグーグルのズバズバ感には程遠い。実力はまだまだです。

3年目は、「当たる検索エンジン」を目指したいと思います。
石の上にも3年の知禅の発展をお楽しみに!

2019年6月19日水曜日

エクストリーム・FESS・クローリング

こんばんは。
現在、知禅は1日に100万URLをクロールして処理する能力があります。

このあたりになると、意外なLimitに足を引っ張られるので、僕の解決策を書くことにしました。

きっちりソースを読んでいないのでアレですが、FESSは検索エンジンにかかわるデータをelasticsearchに保存しています。
※各インスタンス(サーバ)に依存する部分は/etcや/usr/share/fessの設定ファイルに書き込んでいます。
この時はBulk APIを多用しているみたいです。

通常のクロール速度だと問題ないのですが、クロール速度を上げるとelasticsearchのbulk数の上限に当たるようになります。
/etc/elasticsearch/elasticsearch.ymlでbulk上限を1000まで引き上げてみてください。
普通はこれで大丈夫だと思います。

さて、ここからがエクストリーム。
FESSのクローラは、.crawler.data、.crawler.filter、.crawler.queueの3つのindexを作ります。
この中で、.crawler.filterがクロール対象を制御しているようです。
100万件/dayぐらいになると、buik limitを1000に引き上げても、まだ足りずにbulk queueからあふれることがあります。

こうなると、クローラーがelasticsearchから.crawler.filterを読もうとしても、elasticsearchがデータを返してくれません。
クローラーは処理を続けてしまうので、クロール対象を正しく読み取れず、意図しないサイトをクロールしてしまうようなのです。

もし、FESSで100万URL/dayを超えるようなクロールを目指すなら、.cralwer.filterは別のノードに置いて、bulk queueからあふれても読み出せるようにインデックスを配置しないとならないでしょう。