2017年12月19日火曜日

FESSインデックスと圧縮

FESSのメインインデックスは、油断すると数百GBになってきます。
SSDを増やすにも限度があるので、圧縮することにしました。

fess.yyyymmddインデックスを新しく作るときに、"index"以下に下記の設定を加えました。

    "codec": "best_compression"

低速ですが高圧縮なアルゴリズムに切り替わります。

古いelasticsearchのドキュメントだと、「elasticsearch.ymlに記述する」と書いてありますが、今のelasticsearchではインデックスの設定で記述します。

staticな要素のため、インデックスの作成時か、クローズしたインデックスで指定しなさい、と公式ドキュメントにありますね。

僕は1か月ごとぐらいに_reindexで内容を詰めなおすので、新しく作ったfess.yyyymmddに指定しました。

2017年12月18日月曜日

サムネールを一度断念します

FESSにはサイトのサムネールを表示する機能があります。

サムネールはローカルのファイルシステム上に保存されますが、これが予想以上で…。
まず、サムネールの総容量が100GBを超えてきます。
それから、膨大な数のディレクトリと画像ファイルが生成されます。

サムネールなので「そういうもの」なのですが、今はWebインデックスに注力することにします。

1TBのSSDが楽々アサインできるぐらい儲かったら、再挑戦します。

2017年12月17日日曜日

勝手に解説:FESSの設定ファイル

あまりに情報が無いので、自分で調べた物を勝手に書くことにしました。

FESSの設定は、ローカルに保存されるものと、elasticsearch(以下es)に保存されるものがあります。

■esに保存されるもの

  • ユーザー情報とパスワード
  • Web、ファイルなどのクロール設定
  • 形態素解析の辞書設定
  • サジェスト設定

同じクラスタに参加しているFESSは、ユーザー情報を共有しています。
デフォルトのadminアカウントは、削除するか、すぐにパスワードを変更して、権限をGuestに落とすと良いでしょう。

以下はローカルに保存されるものです。

■メインの設定ファイル
/etc/fess/fess_config.properties
FESSのメイン部分です。

# JVM options
クローラーやSuggestインデクサの設定です。
通常なら変える必要はありません。
数千万URLをターゲットにするなら、クローラーの割り当てメモリを増やします。
「-Xmx512m\n\」の部分です。

# common
FESSの基本的な挙動を設定します。
特段、変える必要はないと思います。

# html
Webクローリングの挙動を設定します。
crawler.document.html.pruned.tags
で、無視するタグを追加できます。

# cache
キャッシュ機能の挙動を設定します。
crawler.document.cache.enabled=false
キャッシュ機能が不要なら、上をfalseにします。

# boost
検索結果の評価値を変更するときに使います。
デフォルトでまずまずの結果が返ってきます。

# search page
ここも特に変える必要が無いのですが、thumbnailsだけ気を付けます。
thumbnail.html.image.format=png
サムネールの画像フォーマットを指定します。
pngとjpgが指定できるのかな?調査中です。
thumbnail.crawler.enabled=false
サムネールが不要、または該当のサーバーで生成させないときはfalseにします。

#  Scheduler
scheduler.target.name=
複数のサーバーでFESSクラスタを作っているときに、クローラー名を設定できます。
node-0とかcrawler-0とか、管理しやすい名前を付けると良いでしょう。
FESSのUIの「システム」→「スケジューラー」で「対象」を指定できます。
デフォルトはallで、全てのクラスタでクローラーが動作します。
「Suggest Indexerはnode-2にやらせよう」みたいに、特定のノードに仕事をさせたいときは、上で設定したクローラー名を入力します。
複数のノードを指定するときはコンマで区切ります。

■クローラーの設定
/usr/share/fess/app/WEB-INF/crawler/resources/app.xml
中身はxmlです。
FESSは汎用検索エンジンのため、fileTypeHelperに大量のMIMEタイプが記述されています。
自分のシステムに不要な部分は、コメントアウトしても大丈夫です。

/usr/share/fess/app/WEB-INF/classes/crawler/contentlength.xml
クローラーで読み込む最大サイズを記述します。

■サムネールの保存先
/var/lib/fess/thumbnails/
サムネールは、サーバーのローカルに保存されます。
うっかり、大量のサムネールが生成されてストレージを圧迫することもあります。
ものすごい数のディレクトリが作成されるので、削除するときは大変です。

■ログの保存先
/var/log/fess/
ログは普通の場所に保存されます。

2017年12月16日土曜日

FESSのインデックスを勝手に分類する

FESSはオンラインの文献が少ないので、手探りで動かしています。
何回かシステムを吹き飛ばしながら、勝手にレベル分けしてみました。
勝手に書いているので、あとで怒られそうです(笑)

レプリカシャードを多重化すべきもの、二重化でよいもの、飛んだら作り直せばいいや、の3つに分けてみました。

■飛ばしてはいけないインデックス(多重化)

  • fess_log
  • .configsync
  • .fess_config
  • .fess_user


■飛んでもUIから復旧できるインデックス(二重化)

  • .suggest
  • .suggest_analyzer
  • .suggest_array
  • .suggest_badword
  • .suggest_elevate

■飛んでも再クロールで何とかなるインデックス
  • fess.yyyymmdd
  • .crawler
  • fess.suggest.yyyymmddhhmmss

特に「fess.suggest.yyyymmddhhmmss」は、Suggest Indexerが走るたびに生成されるので、使い捨てで構わないでしょう。
「.crawler」は使い捨てと言いづらいですが、数十万件のインデックスなら再巡回すればよいかと思います。

メインのインデックス「fess.yyyymmdd」は難しい所です。本当は多重化したいのですが、数百GBになるので、ストレージの確保が大変ですね。
僕は割り切って、「二重化+S3スナップショット」で運用しています。

elasticsearchベースのFESSは、最初に2基のクラスタで動かしておけば、容易に拡張できるようになっています。小さく始められるのがいいですね。

2017年12月15日金曜日

今週も終わりました。もうすぐ今年も終わりです

なんとか今週もつつがなく終えることができました。
思えば、旧Nyafoo!を作ったのが半年前。
ガタピシさせながらFESSを体当たりで動かして、数百GBのインデックスを安定して動かすコツがわかって来たように思います。

仕事を持ちながら、elasticsearchとFESSを学ぶ事になり、時間の確保に追われがちですが、楽しいと何とかなるものですね。

来年は「当たる」検索エンジンの開発を目指して頑張りたいと思います。

2017年12月14日木曜日

(たぶん)最後の引越し、知禅になりました。

こんばんは。流浪の検索エンジン、知禅です。
諸事情により、ojizoから「知禅」に再リブランドしました。

ojizoで突き進もうと考えており、商標の出願を検討しておりました。
あ。
出願されておった。。。

ここはスパッと諦め、別の名前を考えることにしました。

候補はいくつかありましたが、漢字で意味がすぐ伝わる「知禅」で落ち着きました。
考えている時、お茶の本で知った茶禅を参考に作った単語です。

中国語だと「禅を知る」という意味にもなるようで、悪くないかなと思っています。

今回は諸々出遅れないように準備したので、知禅で突き進もうと思います。