MeCabのサポート終了
v12以降,4DはオープンソースのMeCabライブラリを使用して日本語テキストをキーワードのリストに分解することができます。20 R9では,この機能が廃止予定となりました。20 R10以降,4DのインストーラーにMeCabは含まれないようになります。
MeCabは,広く使用されている日本語形態素解析ライブラリです。4Dは,キーワード分解にICUライブラリのワードバウンダリー処理を使用しますが,わかち書きをしない日本語だけはICUの代わりにMeCabを使用しました。初期のICUは,カナと漢字の切り替えなど,単純なルールでテキストを分解することしかできませんでしたが,現在はMeCabに匹敵する形態素レベルの分解ができるため,今後,日本語の処理にMeCabを使用する必要はないと判断しました。
Windows版は,インストール時に日本語版を選択した場合にのみ,MeCabがインストールされます。macOS版は,常にMeCabがインストールされます。4D 20 R10以降,MeCabが含まれないことにより,アプリケーションのサイズを約80 MB節約できます。
MeCabは下記の条件が満たされている場合に使用されます。
- “現在のデータ言語“が”日本語”に設定されている
- “非文字・非数字のみをキーワード区切り文字とする“が選択されている
- MeCabがアプリケーションのリソースフォルダーにインストールされている
いずれかの条件が満たされない場合,キーワード関連の処理には,一貫してICUライブラリが使用されます。20 R10以降,常にこの動作となります。
- テキスト・文字列・オブジェクト型フィールドにキーワードインデックスを設定した場合
- クエリおよび文字列比較にキーワード (
%
) 演算子を使用した場合 GET TEXT KEYWORDS
- キーワードインデックスが設定されたテキストまたは文字列フィールドに対して
DISTINCT VALUES
を使用した場合
GET PICTURE KEYWORDS
はMeCabを使用しません。
以下の表は,それぞれのアルゴリズムによって日本語の文章がどのようにキーワード分解されるのかを示しています。
Algorithm | Keywords |
---|---|
MeCab | キーワードインデックス,使用,しています |
非文字・非数字のみをキーワード区切り文字とする | キーワードインデックスを使用していますか |
ICU | キーワード,インデックス,を,使用,し,てい,ます,か |
4Dは,MeCabの形態素分解に基づき,連続する特定の品詞を結合したり,特定の品詞を除外することにより,自然な検索に適したキーワードリストを独自に作成するようになっています。
MeCabのサポート終了までにできること
まず,アプリケーションがMeCabを使用しているかどうかを確かめてください。データ言語が日本語ではない場合、あるいはデータベースにキーワードインデックスが設定されていない場合,インデックス構築にMeCabは使用されていません。ただし,文字列比較には使用されている可能性があります。
If (Get database localization(Internal 4D localization)#"ja")
return //データ言語が日本語以外なのでmecabは使用されていない
End if
$keywordsIndexedFields:=[]
For each ($dataClassName; ds)
$dataClass:=ds[$dataClassName]
For each ($attributeName; $dataClass)
$attribute:=$dataClass[$attributeName]
If ($attribute.kind="storage") && ($attribute.keywordIndexed)
$keywordsIndexedFields.push($attribute)
End if
End for each
End for each
%
演算子を使用したクエリを実装している場合,キーワード検索がMeCabの有無に左右されないようにしてください。たとえば,下記のコードは,検索文字列がキーワードであるという前提で書かれているため,MeCabの有無によって動作したりしなかったりする恐れがあります。
$source:="キーワードインデックス"
$selection:=ds.Table_1.query("Field_2 % :1"; $source)
//MeCabではOK・ICUではNG
データベースエンジンと同じアルゴリズムを使用して検索文字列を事前にキーワード分解することにより,ライブラリの切り替えに備えることができます。
$source:="キーワードインデックス"
ARRAY TEXT($array; 0)
GET TEXT KEYWORDS($source; $array)
$keywords:=[]
ARRAY TO COLLECTION($keywords; $array)
$queryParams:={parameters: {}; arguments: {}}
$criteria:=[]
For each ($keyword; $keywords)
$queryParams.parameters[$keyword]:=$keyword
$criteria.push("Field_2 % :"+$keyword)
End for each
$selection:=ds.Table_1.query($criteria.join(" and "); $queryParams)
//どちらのモードでもOK
開発中に20 R8から20 R10の間を頻繁に行き来することが予想されるのであれば,その都度,大量のキーワードインデックスを再構築することがないよう,カレントデータファイルの容量に注意すると良いでしょう。
運用中のデータベースを20 R10に切り替えるときは,キーワードインデックスの再構築が必然的に発生するため,時間に余裕を持って移行の計画を立てるようにしてください。