くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2016年11月

Redmineの全文検索をFESSでやる

タイトル通り。

Redmine使ってると全文検索をしたくなる。もちろん添付ファイルの中身も含めて。チケットとかWikiとかとか。

で、今回はチケットは検索対象には入れずにやる。その代り、ナレッジベースDMSFとWikiの検索をやる。

Redmine単体ではちょっときつそうなので、プラグインを作るかどうにかするしかない。色々見てたら、FESSがよさそうなので、これを使ってやってみる。Fessが何かはインターネットにおまかせ。

まず、準備。必要なものはFess本体とJDK。JDKはてきとーにオラクルから落としてきてインストール。Fessは「Fess」でググれば配布元のページ出てくるからそこから落とす。

そしたら、下の感じでJavaのPath通しと環境変数を設定。あー、環境はWindows7っす。

sample01
sample02
sample03

JAVA_HOMEっていうシステム変数が必要らしい。ElasticSearchっていう、検索エンジンが使うっぽ。っていうかこのエンジン使って色々やりたくなるよね。。。今度いじってみよう。

そしたら、FessのZipを展開して好きなところに置いておく。

で、Fessの「bin\fess.bat」で起動する。そしたらプロンプト上がって動き出すので、ブラウザで「http://localhost:8080」につなげる。つなぐと下の感じ。

sample04
タイトルはFessのロゴが出ると思うけど、ちょっと変えてるのでモザイク。。。

とりあえず、これで動きました。なんだけど、ポートが8080で割とアレ。ポート変える。

ポート変えるの見てたら、公式のドキュメントちょっと間違ってて少しはまった。とゆーか10.2あたりから、起動の仕方全然変えてるっぽいのね。ドキュメント間に合ってなさそう。えらいこっちゃ。

ポート変えるときは「fess.in.bat」を修正。下感じでやる。

set FESS_JAVA_OPTS=%FESS_JAVA_OPTS% -Dfess.port=8080
↑のポート番号を変える。

あと、はまったのがElasticSearchのポート番号が全然わかんなかった。いちをデフォルトだと9200っぽいんだけど9200だとつながらない。

「netstat /oan」でListenしてるポート確認したら、「9201」っぽい。なる。。。

なんで、知りたいかとゆーと、クロールした結果をチャラにしたい場合、Fess側の管理メニューにそれらしきモノがないので、ElasticSearch側のインデックスを消す必要があるので。

ただ、試しに全消しやってみたら、Fessのダッシュボード動かなくなった。なんか設定でも入ってたのかしら。 要調査。

まーとりあえず、これでFessが動くようになったので、あとはクロールの設定をしていくけど、それはまた今度。眠くなってまいりましたとさ。。。

2016/12/18追記
試した中でちょっと危険な部分があったので、ちゃんと書く前に追記。

RedmineみたいなMVC構成のアプリをクロールする場合、アクションが実行される可能性があるので、 クロールの対象から除外するURLは色々やっておかないとマジで危険。

Redmine丸ごとクロールとかすると、DMSFのファイル丸ごと消えるから注意した方が吉。

C# Jsonをいじる

C#でJsonいじる場合、定番のライブラリがあるけど、.netの機能のみでやる。

Jsonにするクラスの定義。

using System.Runtime.Serialization.Json;
[System.Runtime.Serialization.DataContract]
public class JsonItem
{
    [System.Runtime.Serialization.DataMember()]
    public string itemkey { get; set; }
    [System.Runtime.Serialization.DataMember()]
    public string itemval { get; set; }
}

書き込み

DataContractJsonSerializer dcs = new DataContractJsonSerializer(typeof(List));
MemoryStream outms = new MemoryStream();
dcs.WriteObject(outms, newList);
outms.Position = 0;
StreamReader sr = new StreamReader(outms);
string jsonStr= sr.ReadToEnd();

読み込み

DataContractJsonSerializer dcs = new DataContractJsonSerializer(typeof(List));
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(jsonobject_string));
List readObj = (List)dcs.ReadObject(ms);

ちょっと試したいことが色々あったんだけど、また今度。

問合せ