Lotus Notes XPages Tips (2) 検索

今回は、ノーツの検索についてです。

■XPageで全文検索方法

XPage作成例
・XPageに編集ボックスを配置し、セッション変数にバインドさせ、変数名に"key"を指定する
・ボタンを配置し、ラベルを"検索"にし、ボタンの種類を"送信"にする
・ビューを配置し、 data >search プロパティに sessionScope.key を指定する

これでビューで全文検索が行われるようになります。
画面イメージです。
?

ただし、検索された文書のコレクションは「適合スコア」という順番でソートされてしまいます。
これを、もとのビューの順番で表示させる方法が無いそうです。(IBMさんから)

しかし、検索結果をソート出来ないと非常に困るので、下記の方法で回避できないか試行錯誤中です。

・ビューのデータソースの指定を削除する
・ビューのvalueプロパティに次の処理を記述する
データベースを全文検索し文書コレクションを作成する
作成した文書データコレクションをソートする
ソートした文書コレクションを返す

◆2010/11/30 追記

なんとか、検索結果をソートできるようになりました。 苦労しました。

仕組みですが...

全文検索で作成した文書コレクションの他に、別な空の文書コレクションを作っておきます。
ビューを順番に見ていき、文書コレクションに存在するか文書があれば、空の文書コレクションに追加していきます。

そうすると、別な文書コレクションは、ビューの順番に文書が並んだ状態になります。

<サンプル>
・ビュー”MainView”を元にソートさせる
・検索する文字を入力する編集ボックスをsessionScope.keyにバインドしておく
・ソート結果は文書コレクションのDc2に作成される
・下記のソースを、ビューのvalueプロパティに張り付ける

var Dc1 = database.FTSearch(sessionScope.key);
var Dc2 = database.FTSearch(""); //空の文書コレクション
var nav = database.getView("MainView").createViewNav();
nav.gotoFirstDocument();
for(i = 0 ; i < nav.getCount() ; i++){
	var entry = nav.getCurrent();
	var doc = Dc1.getDocument(entry.getDocument());
	if(doc!==null){Dc2.addDocument(doc);}
	nav.gotoNextDocument();
}
return Dc2;

■検索書式

ノーツの検索書式は結構、癖があります。ヘルプも難解です。

例)

 database.FTSearch(検索書式);

◆フィールド指定無しの検索

 yamamoto        '「yamamoto」という単語を含む文書が検索されます
 yamamoto and akiba   '「yamamoto」および「akiba」いう単語を含む文書が検索されます
 yamamoto or akiba    '「yamamoto」または「akiba」という単語を含む文書が検索されます
 "yamamoto or akiba"   '「yamamoto or akiba」という句を含む文書が検索されます

◆フィールド指定有りの検索

 [name] = yamamoto     '[name]フィールドに「yamamoto」という単語を含む文書が検索されます
 field name = yamamoto   '以下は同じ文書を検索する方法です。
 FIELD name = yamamoto

 [name] CONTAINS yamamoto
 field name CONTAINS yamamoto
 FIELD name CONTAINS yamamoto

 ※= の代わりに CONTAINS が使えます。
    小文字の"field"は使用しないほうが良いようです。私の環境では問題ないのですが、機能しないケースがあるらしいです。
  問題報告番号 ASHH8C7D97 (APAR 番号 LO57119) 

 [name] = ya and ki    '[name]フィールドに「ya」および「ki」という単語を含む文書が検索されます
 [name] = ya or ki     '[name]フィールドに「ya」または「ki」という単語を含む文書が検索されます

 ※and の代わりに AND & + が使えます
 ※or の代わりに OR | ACCRUE ,(カンマ) が使えます
 not [name] = ya and ki   '[name]フィールドに「ya」および「ki」という単語を含まない文書が検索されます
 [name] = ya and not ki   '[name]フィールドに「ya」は含み、「ki」は含まない文書が検索されます

 ※not の代わりに NOT ! が使えます

 [name] = "ya or ki"   '[name]フィールドに「ya or ki」という句を含む文書が検索されます
 [name] = ya??     '[name]フィールドが「yama」「yari」などの4文字の単語が検索されます
 [name] = ya*     '[name]フィールドが「yamamoto」「yagami」などの「ya」で始まる単語が検索されます

 [date1] < 12/25/98   '[date1]フィールドに「12/25/98」より前の日付が含まれる文書が検索されます。

 ※そのほかに、以下の演算子がありますが、興味のある方はヘルプを見てください

  TERMWEIGHT termweight : 単語の優先順位
  EXACTCASE exactcase : 大文字、小文字の区別
  -(ハイフン) : 単語の連結?

Lotus Notes XPages Tips (2) 検索” への2件のフィードバック

  1. はじめまして、松下と申します。Xpagesで検索処理作成中でわからないことが多々あり調べてた頃、こちらの記事にたどり着きました。もしよろしければおしえてください。
    記事にあるXPage作成例をつくり検索で絞込を行いたいのですが、指定フィールド内で検索するには、どのようにコーディングすればよいのかわからず困っています。どうか教えてください。よろしくお願いいたします。

  2. 試してないので自信がないのですが下記のようにすればいけると思います
    var Dc1 = database.FTSearch([name]=sessionScope.key);

    tips(6)のサンプルDBもお試しください

ohishi へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です