プロジェクト

全般

プロフィール

プラグインXapian search pluginの検索エンジンをHyper Estraierへ替える » 履歴 » バージョン 3

Masanori Machii, 2011/10/27 16:23

1 1 Masanori Machii
h1. プラグインXapian search pluginの検索エンジンをHyper Estraierへ替える
2
3
Xapian search pluginは,チケットの添付ファイル内のテキストを検索するプラグインです.これもまたその名が示すように,Xapianを使っており,そのままでは日本語に対応できません.
4
5 3 Masanori Machii
加えて,改造はDMSFよりも厄介です.プラグインの名称に,大胆にも Xapian という文字列を使っていることから想像されるように,モジュール名,変数名,メソッド名に現れる xapian を
6
すべて estraier に書き換えると,動きません!それを一部ずつ修正しても,かえってバグを混入させてしまいます.
7 1 Masanori Machii
8 3 Masanori Machii
なので,修正のポリシーは“[[プラグインDMSFの検索エンジンをHyper Estraierへ替える]]”とは同様にならず,少し複雑です.
9 1 Masanori Machii
10 3 Masanori Machii
まず,同様な方から示すと,
11
12
# Web画面に "Xapian" 由来の設定などがあれば,それはそのままにし,削除しない.(stem,languageらは機能しないまま残る)
13 1 Masanori Machii
# Web画面に Estraier に対応するものがあれば,それは "Estraier" へと修正する.(現バージョンではない)
14
# エラーメッセージなどに "Xapian" という文字列があれば,それは "Estraier" へと上書きする.
15
# ソースコード中 "Xapian" を呼び出す部分は削除する.(ロジックの変更)
16 3 Masanori Machii
# ソースコード中 "Xapian" という変数名を "Estraier" へと置き換える部分を極力少なくする.
17
# ソースコード中 "xapian" というラベル名称や,"redmine_xapian" のようにプラグインの由来の変数名があれば,そのまま利用する.
18 1 Masanori Machii
19
20 3 Masanori Machii
次に複雑な方を示します.
21
# 何らの理由により "Estraier" 検索環境が整備できない場合でも,添付ファイルの「タイトルのみ」検索はできるようにする.
22
# "Xapian search plugin" に,その仕掛けから生じたと思われる,添付ファイル検索の権限に関する外部仕様がある.「文書」と関連するこれを独立させた.
23
プラグインDMSFの場合は,アップロードしたファイルは,$REDMINE/files よりも一つ下へ下げたディレクトリ dmsf へファイルを置きましたが,添付ファイルはこの files 下へ置かれます.そのインデックスファイルはどこに置かれるべきか?と考えた場合,もちろん files 下へは置けません.なので,一つ上のディレクトリ $REDMINE へ置くことになります.そういうわけで,インデックス・ファイルの名称は files_index になります.
24
# 検索用インデックスのディレクトリは言語毎に分けない.
25
# バージョンは,日本語版であることを示すため,1.yy.zz-JP とする. 
26 1 Masanori Machii
27 3 Masanori Machii
28
さて,変更するファイルは次の6つです.
29
30
# config/locales/ja.yml
31
# init.rb
32
# app/controllers/search_controller.rb
33
# app/views/search/index.rhtml
34
# lib/acts_as_searchable.rb
35
# lib/xapian_search.rb
36
37
38
h2. config/locales/ja.yml
39
40
奇妙ですが,DMSFの方は最初から ja.yml がありました.ですが,さすがに当該プラグインにはそれはありません.なので,ja.yml は新たに(en.ymlを基にして)作ります.
41
42
<pre>
43
@@ -0,0 +1,29 @@
44
+ja:
45
+
46
+    label_enable_redmine_xapian: "hyper estraier による添付ファイル検索を可能にする"
47
+    label_index_database: "hyper estraier 検索インデックスディレクトリ"
48
+    label_stemming_text: "set the stemming language, the default is 'english'.
49
+                           Possible values: danish dutch english finnish french
50
+                           german german2 hungarian italian kraaij_pohlmann
51
+                           lovins norwegian porter portuguese romanian russian
52
+                           spanish swedish turkish (pass 'none' to disable
53
+                           stemming)"
54
+    label_search2: "Extended Search"
55
+    text_search1: "This plugin does same redmine search plus searches into attachment. To enable xapian you have to build database with omindex utility and configure index database on plugin settings page"
56
+    label_document: "ドキュメント"
57
+    label_issue: "チケット"
58
+    label_wiki: "Wiki"
59
+    label_message: "メッセージ"
60
+    label_article: "Article"
61
+    label_article_plural: "Articles"
62
+    label_stemming_lang: "Stemming Language(注:estraier版では未使用)"
63
+    label_enable_xapian_on_search: "検索画面でhyper estraier使用可"
64
+    label_search_languages: "Stemming languages on search screen(注:estraier版では未使用)"
65
+    label_stemming_strategy: "Stemming strategy(注:estraier版では未使用)"
66
+    label_stem_none: "Stem none"
67
+    label_stem_some: "Stem some"
68
+    label_stem_all:  "Stem all"
69
+    label_default_stemming_lang: "Set default stemming lang(注:estraier版では未使用)"
70
+    label_default_stemming_strategy: "Set default stemming strategy(注:estraier版では未使用)"
71
+    label_database_error: "検索インデックスエラー。Hyper Estraier利用環境を構築してください。"
72
+
73
</pre>
74
75
76
h2. init.rb
77
78
ライブラリ名称を xapian から estraier に変更します.加えて,先の ya.yml に対応する警告のラベルと一致させます.
79
80
<pre>
81
@ -7,10 +7,10 @@
82
83
84
begin
85
-    require 'xapian'
86
+    require 'estraier'
87
    $xapian_bindings_available = true
88
rescue LoadError
89
-    Rails.logger.info "REDMAIN_XAPIAN ERROR: No Ruby bindings for Xapian installed !!. PLEASE install Xapian search engine interface for Ruby."
90
+    Rails.logger.info "REDMAIN_XAPIAN ERROR: No Ruby bindings for Hyper Estraier installed !!. PLEASE install Hyper Estraier search engine interface for Ruby."
91
    $xapian_bindings_available = false
92
else
93
    require 'redmine'
94
@@ -28,7 +28,7 @@
95
       author_url 'http://undefinederror.org'
96
97
       description 'With this plugin you will be able to do searches by file name and by strings inside your documents'
98
-       version '1.2.1'
99
+       version '1.2.1-JP'
100
       requires_redmine :version_or_higher => '1.0.0'
101
102
       settings :partial => 'settings/redmine_xapian_settings',
103
</pre>
104
105
h2. app/controllers/search_controller.rb
106
107
検索エンジンが利用できない場合は,警告メッセージを出力する.なお,「タイトルのみ」検索の場合はこの限りではない.
108
109
<pre>
110
@@ -96,6 +96,7 @@
111
	end
112
	
113
     end
114
+      flash[:warning] = "warning: #{l(:label_database_error)}" unless @titles_only || $xapian_bindings_available
115
     @results = @results.sort {|a,b| b.event_datetime <=> a.event_datetime}
116
     if params[:previous].nil?
117
       @pagination_previous_date = @results[0].event_datetime if offset && @results[0]
118
</pre>
119
120
121
h2. app/views/search/index.rhtml
122
123
h2. lib/acts_as_searchable.rb
124
125
h2. lib/xapian_search.rb