プロジェクト

全般

プロフィール

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

リビジョン 2 (Masanori Machii, 2011/10/25 17:59) → リビジョン 3/9 (Masanori Machii, 2011/10/27 16:23)

h1. プラグインXapian search pluginの検索エンジンをHyper Estraierへ替える 

 Xapian search pluginは,チケットの添付ファイル内のテキストを検索するプラグインです.これもまたその名が示すように,Xapianを使っており,そのままでは日本語に対応できません. 

 加えて,改造はDMSFよりも厄介です.プラグインの名称に,大胆にも Xapian という文字列を使っていることから想像されるように,モジュール名,変数名,メソッド名に現れる xapian を 
 すべて estraier に書き換えると,動きません!それを一部ずつ修正しても,かえってバグを混入させてしまいます. プラグインDMSFの場合は,アップロードしたファイルは,$REDMINE/files よりも一つ下へ下げたディレクトリ dmsf へファイルを置きましたが,添付ファイルはこの files 下へ置かれます.そのインデックスファイルはどこに置かれるべきか?と考えた場合,もちろん files 下へは置けません.なので,一つ上のディレクトリ $REDMINE へ置くことになります.そういうわけで,インデックス・ファイルの名称は files_index になります. 

 なので,修正のポリシーは“[[プラグインDMSFの検索エンジンをHyper Estraierへ替える]]”とは同様にならず,少し複雑です. 修正のポリシーは“[[プラグインDMSFの検索エンジンをHyper Estraierへ替える]]”と同様です.すなわち, 

 まず,同様な方から示すと, 

 # Web画面に "Xapian" 由来の設定などがあれば,それはそのままにし,削除しない.(stem,languageらは機能しないまま残る) 由来の設定などがあれば,それはそのままにし,削除しない. 
 # Web画面に Estraier に対応するものがあれば,それは "Estraier" へと修正する.(現バージョンではない) 
 # エラーメッセージなどに "Xapian" という文字列があれば,それは "Estraier" へと上書きする. 
 # ソースコード中 "Xapian" を呼び出す部分は削除する.(ロジックの変更) 
 # ソースコード中 "Xapian" という変数名を という変数名がそのまま "Estraier" へと置き換える部分を極力少なくする. 
 # へと置き換えられる部分は "Estraier" へと修正する. 

 ただし,このプラグインの名称に "Xapian" が使われていますので, 

 6. ソースコード中 "xapian" というラベル名称や,"redmine_xapian" のようにプラグインの由来の変数名があれば,そのまま利用する. 


 次に複雑な方を示します. 
 # 何らの理由により "Estraier" 検索環境が整備できない場合でも,添付ファイルの「タイトルのみ」検索はできるようにする. 
 # "Xapian search plugin" に,その仕掛けから生じたと思われる,添付ファイル検索の権限に関する外部仕様がある.「文書」と関連するこれを独立させた. 
 プラグインDMSFの場合は,アップロードしたファイルは,$REDMINE/files よりも一つ下へ下げたディレクトリ dmsf へファイルを置きましたが,添付ファイルはこの files 下へ置かれます.そのインデックスファイルはどこに置かれるべきか?と考えた場合,もちろん files 下へは置けません.なので,一つ上のディレクトリ $REDMINE へ置くことになります.そういうわけで,インデックス・ファイルの名称は files_index になります. 
 # 検索用インデックスのディレクトリは言語毎に分けない. 
 # バージョンは,日本語版であることを示すため,1.yy.zz-JP とする.  


 さて,変更するファイルは次の6つです. 

 # config/locales/ja.yml 
 # init.rb 
 # app/controllers/search_controller.rb 
 # app/views/search/index.rhtml 
 # lib/acts_as_searchable.rb 
 # lib/xapian_search.rb 


 h2. config/locales/ja.yml ということになります.プラグインの名称はそのままにします.一から書き起こした場合は,この限りではありません. 

 奇妙ですが,DMSFの方は最初から ja.yml がありました.ですが,さすがに当該プラグインにはそれはありません.なので,ja.yml は新たに(en.ymlを基にして)作ります. 

 <pre> 
 @@ -0,0 +1,29 @@ 
 +ja: 
 + 
 +      label_enable_redmine_xapian: "hyper estraier による添付ファイル検索を可能にする" 
 +      label_index_database: "hyper estraier 検索インデックスディレクトリ" 
 +      label_stemming_text: "set the stemming language, the default is 'english'. 
 +                             Possible values: danish dutch english finnish french 
 +                             german german2 hungarian italian kraaij_pohlmann 
 +                             lovins norwegian porter portuguese romanian russian 
 +                             spanish swedish turkish (pass 'none' to disable 
 +                             stemming)" 
 +      label_search2: "Extended Search" 
 +      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" 
 +      label_document: "ドキュメント" 
 +      label_issue: "チケット" 
 +      label_wiki: "Wiki" 
 +      label_message: "メッセージ" 
 +      label_article: "Article" 
 +      label_article_plural: "Articles" 
 +      label_stemming_lang: "Stemming Language(注:estraier版では未使用)" 
 +      label_enable_xapian_on_search: "検索画面でhyper estraier使用可" 
 +      label_search_languages: "Stemming languages on search screen(注:estraier版では未使用)" 
 +      label_stemming_strategy: "Stemming strategy(注:estraier版では未使用)" 
 +      label_stem_none: "Stem none" 
 +      label_stem_some: "Stem some" 
 +      label_stem_all:    "Stem all" 
 +      label_default_stemming_lang: "Set default stemming lang(注:estraier版では未使用)" 
 +      label_default_stemming_strategy: "Set default stemming strategy(注:estraier版では未使用)" 
 +      label_database_error: "検索インデックスエラー。Hyper Estraier利用環境を構築してください。" 
 + 
 </pre> 


 h2. init.rb 

 ライブラリ名称を xapian から estraier に変更します.加えて,先の ya.yml に対応する警告のラベルと一致させます. 

 <pre> 
 @ -7,10 +7,10 @@ 


 begin 
 -      require 'xapian' 
 +      require 'estraier' 
     $xapian_bindings_available = true 
 rescue LoadError 
 -      Rails.logger.info "REDMAIN_XAPIAN ERROR: No Ruby bindings for Xapian installed !!. PLEASE install Xapian search engine interface for Ruby." 
 +      Rails.logger.info "REDMAIN_XAPIAN ERROR: No Ruby bindings for Hyper Estraier installed !!. PLEASE install Hyper Estraier search engine interface for Ruby." 
     $xapian_bindings_available = false 
 else 
     require 'redmine' 
 @@ -28,7 +28,7 @@ 
        author_url 'http://undefinederror.org' 

        description 'With this plugin you will be able to do searches by file name and by strings inside your documents' 
 -         version '1.2.1' 
 +         version '1.2.1-JP' 
        requires_redmine :version_or_higher => '1.0.0' 

        settings :partial => 'settings/redmine_xapian_settings', 
 </pre> 

 h2. app/controllers/search_controller.rb 

 検索エンジンが利用できない場合は,警告メッセージを出力する.なお,「タイトルのみ」検索の場合はこの限りではない. 

 <pre> 
 @@ -96,6 +96,7 @@ 
	 end 
	
      end 
 +        flash[:warning] = "warning: #{l(:label_database_error)}" unless @titles_only || $xapian_bindings_available 
      @results = @results.sort {|a,b| b.event_datetime <=> a.event_datetime} 
      if params[:previous].nil? 
        @pagination_previous_date = @results[0].event_datetime if offset && @results[0] 
 </pre> 


 h2. app/views/search/index.rhtml 

 h2. lib/acts_as_searchable.rb 

 h2. lib/xapian_search.rb