全文検索エンジンHyperEstraierの.NETバインディングをC#から使う方法

C#.NETでローカルファイルの全文検索ツールを作るとき、どのエンジンを使ったら楽なのかなーと思って色々調べてたら、最終的にはHyperEstraier(以下HE)が良さそうということになりました。
HEを選んだ理由としては、簡単に使えて、しかも配布性が高かったからです。
配布性ってどういうことかっていうと、

  • 独自のDBエンジンを持っており、外部のDBを別途インストールする必要は無い
  • HEのDLLを一緒に配布するだけで簡単に使える

って感じです。
他にも有名どころでLuceneも.NETバインディングがありますが、LuceneMeCabを使っており、そしてそのMeCabは別途インストールが必要な設計になっていて、割と配布しづらい。

準備

Visual C# 2008 Express Edition を使用しました。

  1. Hyper Estrair のサイト(http://hyperestraier.sourceforge.net/)から Windows バイナリをダウンロード、「*.dll」「localeディレクトリ」をプロジェクトディレクトリ直下に追加
  2. Hyper Estraier Binding for .NET Framework | ぷろじぇくと、みすじら。 から .NET バインディングのzipをダウンロードし、HyperEstraier.dll とHyperEstraier.xml をプロジェクトディレクトリ直下に追加
  3. プロジェクトの「参照設定」でHyperEstraier.dllを追加
  4. プロジェクトのプロパティで、デバッグの実行時ディレクトリにプロジェクトディレクトリを指定(unmanaged dllにPATHを通すため)

ドキュメントのインデックスをDBに登録

Database db = new Database("db", DatabaseModes.Writer | DatabaseModes.Create);

Document doc = new Document();
doc.Attributes.Add("@uri", "http://yahoo.co.jp/"); // @uri 属性は必須
doc.AddText("こんにちはこんにちは!!");
doc.AddText("世界平和");

bool result = db.PutDocument(doc, PutDocumentOptions.None);
Console.WriteLine("result = " + result.ToString());

コンストラクタで指定してる「db」ってのはHEのデータベースが作られるディレクトリ名。存在しなければ勝手に作ってくれる。

ドキュメントを検索

Database db = new Database("db", DatabaseModes.Reader);

Condition cond = new Condition();
cond.Phrase = "平和"; // 検索フレーズ

Result result = db.Search(cond);

for (int i = 0; i < result.DocumentNumber; i++)
{
    Document doc = db.GetDocument(result.GetDocumentId(i));
    Console.WriteLine(doc.Attributes["@uri"]); // 検索がヒットしたドキュメントのURI
}

こんな感じで簡単に使えました。たいへん素晴らしいと思います。