ホーム > 使った

Hyper Estraier リビルド

Windowsから全文検索エンジンであるHyper Estraier(以下HE)をリビルドした際のメモ。といっても基本的には以下のWebページの内容とほぼ同じである。おまけとしてHE以外の最近の全文検索ソフトウェアについても調べてみたので、その覚え書きもまとめておく。

Hyper EstraierのMinGW上での再ビルド - めも日記

ちなみにHEをリビルドしたのは標準だと私の使用しているメーラ(Sylpheed)のメールをインデックスしてくれないからである。これはSylpheedのメールファイルが数字のみの連番で拡張子を持たないためであり、対応させるにはソースの修正が必要となる。

なお、全体の流れとしては先にMinGWとmsys 1.0でPOSIX環境を構築し、HEが必要とするqdbmを先にビルドしてからHEをビルドする。OSはWindows10 Pro x64 1903 Build 18362.900である。

MinGWとmsysのインストール

MinGW-Get Version 0.6.3 (Beta) Windows をダウンロードして実行し C:\bin\MinGW などにインストールする。パッケージは以下を選択する。

Basic Setup
  • mingw-developer-toolkit-bin
  • mingw32-base-bin
  • mingw32-gcc-g++-bin
  • msys-base-bin
All Packages
  • msys-zip-bin

パッケージを選択したらメニューの[Installation]-[Apply Changes]で[Apply]するが、デフォルトだとインストールが完了しても通知してくれるわけではないので自分で閉じる必要がある。(MinGW-Getはあくまでもパッケージマネージャでしかないため。パッケージ管理という面ではpacmanを使えるmsys2の方が便利といえるが、今回の専用環境ということであればmsysでよいと思う。)

この状態で<MinGWのインストールディレクトリ>\msys\1.0\msys.batを実行するとシェルが起動する。ちなみにMinGWではmsys\1.0が/usrに置き換えられるので、/usr/local/の実体はmsys\1.0\local\になる。一応この時点でgccが使えるか確認する。

$ gcc --version
gcc.exe (MinGW.org GCC Build-2) 9.2.0

しかしながら、これだけだと以下のパッケージが足りないので手動で追加する。

regex

MinGW - Minimalist GNU for Windows - Browse /MSYS/Base/regex/regex-1.20090805-2 at SourceForge.netからlibregex-1.20090805-2-msys-1.0.13-dev.tar.lzmaをダウンロードして/home/<ユーザ名>/で解凍したら、include/とlib/にあるファイルをそれぞれ/usr/local/includeと/usr/local/libに移動する。

pthreadGC2

pthreadはパッケージマネージャにあるものではなくpthreadGC2を使う。MinGW - Minimalist GNU for Windows - Browse /MinGW/Base/pthreads-w32/pthreads-w32-2.9.1 at SourceForge.net から pthreads-w32-2.9.1-1-mingw32-dev.tar.lzma と pthreads-w32-2.9.1-1-mingw32-dll.tar.lzma をダウンロードして配置する。

zlib

同じくMinGW - Minimalist GNU for Windows - Browse /MinGW/Extension/zlib/zlib-1.2.3-1-mingw32 at SourceForge.netからlibz-1.2.3-1-mingw32-dll-1.tar.gz と libz-1.2.3-1-mingw32-dev.tar.gz をダウンロードして配置する。

まとめると以下のコマンドを実行する。

$ cd ~
$ tar Jxf libregex-1.20090805-2-msys-1.0.13-dev.tar.lzma
$ tar Jxf pthreads-w32-2.9.1-1-mingw32-dll.tar.lzma
$ tar Jxf pthreads-w32-2.9.1-1-mingw32-dev.tar.lzma
$ tar -zxvf libz-1.2.3-1-mingw32-dll-1.tar.gz
$ tar -zxvf libz-1.2.3-1-mingw32-dev.tar.gz
$ mv ./bin/* /usr/local/bin/
$ rmdir ./bin
$ mv ./include/* /usr/local/include/
$ rmdir ./include
$ mv ./lib/* /usr/local/lib/
$ rmdir ./lib

これでインストール準備完了となる。

qdbmのビルド

/home/<ユーザ名>/以下に QDBM: Quick DataBase Manager からダウンロードしたqdbm-1.8.78.tar.gzを展開する。なお、前記したサイトではconfigure内にある圧縮ライブラリのリンクオプションを-lzから-lzdllに変更しないと本家版で作成したインデックスが使用できないとあり、お好みでよいと思うが私は行わなかった。もっとも、そのままだとビルドできないので、Makefile.inに以下の変更を行った。

  • CPPFLAGSに「-I/usr/include」を追加
  • mingwセクションにあるgccの「-mno-cygwin」オプションを削除
  • mingwセクションにあるLIBLDFLAGSとLDFLAGSに「-L/usr/local/lib」を追加

後は以下のコマンドでインストールまで行う。

$ tar -zxvf qdbm-1.8.78.tar.gz
$ cd qdbm-1.8.78
$ ./configure --enable-zlib --enable-iconv
$ make mingw
$ make install-win

Hyper Estraierのビルド

同じく/home/<ユーザ名>/以下に 全文検索システム Hyper Estraier からダウンロードしたhyperestraier-1.4.13.tar.gzを展開する。

また、HEがテキスト抽出に使うxdoc2txtをd2txt152.zipでダウンロードする。後述するdesktopHEに含まれるxdoc2txtは古く、不正なPDFで処理が正常終了しない場合があるため最新版を使用する。zipを解凍したら含まれるファイルを<MinGWのインストールディレクトリ>\msys\1.0\local\xdoc2txt\ 以下にコピーする。

その上でconfigureを修正する。

  • LIBSに与えている-lzを-lzdllに変更(2箇所)
  • LIBSに与えている-lpthreadを-lpthreadGC2に変更(2箇所)

同じくMakefile.inを修正する。

  • winセクションにあるgccの「-mno-cygwin」オプションを削除
  • winセクションのCPPFLAGSに「-DHAVE_STRUCT_TIMESPEC」を追加(pthread.hのstruct timespecがtime.hと競合するため)
  • winセクションのLIBSの「-lz」を「-lzdll」に変更
  • winpkgセクションを以下のように修正(不要な言語対応を除外しライブラリパスを修正)
winpkg :
	make win && strip *.exe
#	cd javanative && ./configure && make win
#	cd javapure && ./configure && make
#	cd rubypure && ./configure && make
	cd windows && make
	rm -rf $(PACKAGE)
	mkdir -p $(PACKAGE)
	cp -Rf estraier.dll libestraier.dll.a estraier.h estmtdb.h \
	  estcmd.exe estmttest.exe estmaster.exe estmaster-sv.exe estbutler.exe \
	  estcall.exe estwaver.exe estload.exe \
	  estseek.cgi estfraud.cgi estproxy.cgi estscout.cgi estsupt.cgi \
	  $(MYCONFS) doc $(PACKAGE)
	rm -rf $(PACKAGE)/filter
#	cp -Rf /bin/mgwz.dll /bin/libiconv-2.dll /bin/regex.dll \
#	  /usr/local/bin/qdbm.dll $(PACKAGE)
#	cp -Rf /bin/pthreadGC2.dll /lib/mingw/libpthreadGC2.a $(PACKAGE)
	cp -Rf /usr/local/include/depot.h /usr/local/include/curia.h \
	  /usr/local/include/cabin.h /usr/local/include/villa.h $(PACKAGE)
#	cp -Rf /usr/include/mingw/pthread.h /usr/include/mingw/sched.h \
#	  /usr/include/mingw/semaphore.h $(PACKAGE)
	cp -Rf /usr/local/xdoc2txt/* $(PACKAGE)
#	cp -Rf javanative/estraier.jar javanative/jestraier.dll $(PACKAGE)
#	cp -Rf javapure/estraierpure.jar $(PACKAGE)
#	cp -Rf rubypure/estraierpure.rb rubypure/estcall.rb $(PACKAGE)
	cp -Rf windows/*.exe windows/*.bat windows/*.txt $(PACKAGE)
# append start (libiconv-2.dllはMinGWインストールディレクトリのパスに変更)
	cp -Rf /usr/local/bin/libz-1.dll /c/bin/MinGW/bin/libiconv-2.dll \
	  /usr/local/bin/qdbm.dll $(PACKAGE)
	cp -Rf /usr/local/lib/pthreadGC2.dll /usr/local/lib/libpthreadGC2.a \
	  $(PACKAGE)
	cp -Rf /usr/local/include/pthread.h /usr/local/include/sched.h \
	  /usr/local/include/semaphore.h $(PACKAGE)
# append end
	zip -r $(PACKAGEDIR)-win32.zip $(PACKAGE)
	mv -f $(PACKAGEDIR)-win32.zip ..

windows/Makefileも余計なオプションを消す。

  • gccオプションの「-mno-cygwin」を削除

また、ソースの以下を修正する。

myconf.h の #elif defined(_SYS_MINGW_) 内にある #include <winsock2.h> をコメントアウト。詳細不明だが、CFLAGSで-DWIN32_LEAN_AND_MEAN、-D_WINSOCKAPI_などしても効果がなかった。

cf. MinGW-w64 - for 32 and 64 bit Windows / Wiki2 / winsock2.h include order

#elif defined(_SYS_MINGW_)

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <utime.h>
#include <dirent.h>
#include <windows.h>
#include <io.h>
//#include <winsock2.h>

これでようやくSylpheed対応のためにestcmd.cでインデックス対象ファイルの識別を行っている箇所(3785行目あたり)を以下のように修正する。

  // modify for sylpheed
  if(NULL != cbstrstrkmp(path, "Mailboxes")){fmt = FF_MIME;}
  else if(g_filefmt == FF_NONE && !xcmd){return TRUE;}

後は以下のコマンドでインストールまで行うと/home/hyperestraier-1.4.13-win32.zipができる。

$ tar -zxvf hyperestraier-1.4.13.tar.gz
$ cd hyperestraier-1.4.13
$ ./configure
$ make winpkg

需要はないと思われるが参考までに上記でビルドしたSylpeed対応版estcmd.exeを置いておく。

DesktopHEのインストール

先にJDKが必要だが最新だとdesktopHEが動かないので Java Archive Downloads - Java SE 5から jdk-1_5_0_22-windows-i586-p.exeをダウンロードしてインストールする(Oracleアカウントが必要、特に環境変数JAVA_HOMEなどの設定は不要)。

それから DesktopHE -Hyper Estraierを使用したWindows用デスクトップ検索ツール- よりDesktopHE_1_8_1a.zipをダウンロードしてC:\bin\desktopHEなどに展開する。そしてdesktopHE内のHyper Estraier関係のファイルをリビルドしたもので上書きする。

というか今回であればestcmd.exeとxdoc2txt.exeだけ差し替えればよい。これでSylpeedに対応した全文検索が可能になる。

Windows用デスクトップ全文検索ソフトウェアについて(2020/7)

個人レベルで使うデスクトップ全文検索ソフトウェアには久しくお世話になっている。古くはNamazuに始まり、SearchX、ConceptSearchといった商用ソフト、その後はHyperEstraier(DesktopHE)を使用してきたが、考えてみれば最近はEverythingによるファイル名での検索が便利なので、それほど活用していなかった。(ちなみにGoogleデスクトップ検索はサイズの大きなファイルを扱えず、Windows Searchはそもそも使っていない。)が、やはり増え続けるファイルのフォルダでの整理には限界があり、私のようなものぐさ人間には全文検索が楽でいい。どうせならSylpheedのメールデータも...と思ったので今回の作業を行う前に今どきのものもいくつか試用してみた。しかしながら私の用途ではいずれも一長一短だったため、今回のリビルド対応を行った。

なお、インデックス対象はローカルHDDのメールで約10万ファイル、メール以外で約20万ファイル、DAS上に約400万ファイルである。

以下は各ツールごとの寸評。別案として自前でテキスト抽出を行いMySQLに突っ込み FULLTEXT検索でよいかもしれないし、対象が限られていればgrepなりKWIC Finderでもよいと思われる。また、上述した通りファイル名検索ならEverythingが便利。特にオプションでキャッシュを有効にしておけば接続していない外部ドライブも含めた検索が可能である。

Fess

本命だったのだが最新版を手順通りインストールしたつもりなのにElasticSearchとの連携に失敗したので詳細を検証できていない。サーバタイプでありクライアントはWebブラウザを用いる。LinuxならDocker一発でOKのようだ。

dtSearch Desktop

英文ドキュメントが主であればありだと思う。良いところといまいちなところはは以下の通り。

Pros
  • 検索オプション(除外ワードなど)が豊富
  • zipファイル内もインデックスしてくれる
  • SylpeedのメールデータもOK
Cons
  • 日本語非対応(日本語は英語のように単語境界がないのでわかち書きなどが必要。オプションでCJK用にインデックスを一文字単位にできるが、この場合は当然ながら「京都」で検索すると「東京都」がヒットする)
  • UIも英語のみ
  • 有償で高め
  • Sylpheed\uidlディレクトリでインデックスを更新しようとするとOut of Memoryになる(UNIXライクなドットで始まるファイルは駄目らしい)
  • 広範にインデックス化を行ってくれるが逆にいうと除外しないと英次郎の辞書ファイルなども追加してしまう

SAVVY

普通に個人が使うのであればバランスが良く、これでいいような気がします。

Pros
  • フリー(メールウェアで90日以上使用する場合はレポートが必要らしい)
  • UIはシンプルだが必要十分
  • ファイル名でも検索できる
  • dtSearchほど何でも読み込まないが、その分インデックス作成時間とサイズも小さい
Cons
  • メールはeml形式のみ対応(Sylpheed非対応)
  • 検索結果からファイルのプレビューができない
  • インデックス作成中の検索ができない

全文検索くんPro(Search++)

シェアウェア。アーカイブを開くと自身がJVMとLuceneを含んでおり、要はWindows用Luceneフロントエンドになっている。データ量が少なければこちらでもよいと思われる。

Pros
  • desktopHEのように古くなく64bit版もある
  • ファイル名でも検索できる
  • 検索結果のプレビューができる
Cons
  • 作成したインデックスの詳細を知ることができない
  • なぜかインデックス作成中に何度か落ちてしまった。Butterfly Searchというソフトでも同様だった