Xpagesで、以下のことを実現させましたが、質問があります。
①会社名と会社の情報の入った文書の一覧がある(5000件ほど)
②①がSelCompanyW_Vビューに表示されている
③①とは別の文書で、会社名の一部を入れて検索ボタンをクリックするとダイアログで該当する会社名を
持つ文書が一覧で表示される。このときあいまい検索をする
上記のことを実現するため、③で表示されるダイアログの値に検索結果が表示されるよう
以下のコードをssjs1で書きました。
//関数
function countLength(str) {
var r = 0;
for (var i = 0; i < str.length; i++) {
var c = str.charCodeAt(i);
if ( (c >= 0x0 && c < 0x81) || (c == 0xf8f0) || (c >= 0xff61 && c < 0xffa0) || (c >= 0xf8f1 && c < 0xf8f4)) {
r += 1;
} else {
r += 2;
}
}
return r;
}
//検索キーワードを変数にセット
var key = @Trim(getComponent("CNameKey").getValue());
if(key==""||key==null){
return ;
}
if(key.indexOf("\"")!=-1){
return;
}
key = key.replace(/[A-Za-z0-9]/g, function(s) {
return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
}); //全角
key = key.toUpperCase(); //大文字
//検索結果(あいまい検索)を取得し、キーワード選択ダイアログを表示する
var v:NotesView = database.getView("SelCompanyW_V");
var vc:NotesViewEntryCollection = v.getAllEntries();
//キーワードの先頭1文字を全半角に変換し、変換できればキーワードの前に“*”(アスタリスク)を追加する
//対象は英数字のみ
var key_left = key.left(1);
var key_left8 = key_left.replace(/[A-Za-z0-9]/g, function(s) {
return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
}); //半角
if(countLength(key_left)!=countLength(key_left8)){
if (key_left.match(/[^A-Za-z0-9]+/)||key_left8.match(/[^A-Za-z0-9]+/)) {
key ="*"+key
}
}
//キーワードの最後1文字を全半角に変換し、変換できればキーワードの後ろに“*”(アスタリスク)を追加する
//対象は英数字のみ
var key_right = key.right(1);
var key_right8 = key_right.replace(/[A-Za-z0-9]/g, function(s) {
return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
}); //半角
if(countLength(key_right)!=countLength(key_right8)){
if (key_right.match(/[^A-Za-z0-9]+/)||key_right8.match(/[^A-Za-z0-9]+/)) {
key =key+"*"
}
}
database.updateFTIndex(true);
if(v.FTSearch( key, vc.getCount() )>0){
vdoc = v.getFirstDocument();
KeyList = [];
key=key.replace( /\*/g , ".*" ) ;
while (vdoc != null){
mStr =vdoc.getItemValueString("CompanyName");
W_MAKRNM = mStr.replace(/[A-Za-z0-9]/g, function(s) {
return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
}); //全角
W_MAKRNM= W_MAKRNM.toUpperCase(); //大文字
var re = new RegExp(key);
if(W_MAKRNM.match(re)){
makr_str = vdoc.getItemValueString("CompanyName")+"◆"+vdoc.getItemValueString("CompanyNameKana")+
"("+vdoc.getItemValueString("CompanyAddress")+")";
KeyList.push(makr_str);
}
var vdoc = v.getNextDocument(vdoc);
}
}else{
KeyList = ""
}
v.clear() //全文検索をクリア
return KeyList
やっとの思いで書いたコードなのですが、反応が遅かったり、ボタンを押しても反応しなかったりします。
検索対象の文書が少ないと反応もよく、反応しないということはありませんでした。
このコードをもっと効率よく書く方法はありますでしょうか?
説明がうまくなくて申し訳ないです。説明の足りないところがありましたらご指摘ください。
よろしくお願い致します。