Domino Query Language の利用

Domino Query Language

Domino Query Language(DQL)は Domino 10 以降に実装されている機能で、さまざまな条件の検索を、簡潔なクエリー構文を使用して検索することができます。詳細なコードを記述することなく、既存の設計要素を拡張できます。

目次

はじめに

Domino Query Language (DQL)を使用する前に、クエリ要求が処理される各データベースに対し、デザインカタログを作成します。デザインカタログはデータベース内に表示されない文書として格納され、データを高速に検索するメカニズムを提供します。

DQL の構文

DQL は、 LotusScript または Java の Query メソッド (Database クラス) または domino-db node.js APIで実行できます。

シンプルなクエリの例

シンプルなクエリの例をいくつか示します。

値のデータ型

Domino は、あらゆるタイプのデータをあらゆるフィールドに保存できるタイプレスデータモデルを特徴としています。DQL クエリでは、検索されるデータの種類は、クエリ用語で指定されたデータの種類によって定義されます。

論理演算

以下に、単純なクエリと論理演算を組み合わせた例をいくつか示します。

優先順位

DQL には自然な優先順位 (処理順序) があり、AND 演算された用語は OR 演算された用語より前に処理されます。

in All

all "キーワードは、包括的な "in " 演算子を修正し、指定された値のリスト以外のすべてを除外します。

contains

Domino 11 の新機能: NSF スキャンとビュー索引の利用に加えて、DQL は全文索引に対するクエリを処理する演算子を提供します。この方法で処理するには、データベースに全文索引が必要です。

式言語

HCL Domino 12以降、Domino Query Language (DQL) 検索用語で数式言語を使用できるようになりました。

文字列値

文字列値の評価では、大文字と小文字とアクセントは区別されません。DQL 処理で引数を日付/時刻や数値ではなくテキストとして強制的に解釈するには、一重引用符 (') を使用します。

日付と時刻の値

DQL は、日付/時刻文字列の RFC3339 標準形式をサポートしています。

代替変数

代替変数を使用して特定の用語の値によってのみ変化する DQL クエリを実行できます。ただし、文字列構築を使用して DQL クエリを構築すると、セキュリティが脆弱になる可能性があります。DQL は構文で代替変数をサポートしているため、クエリを変更せずに、異なる値を指定することができます。

列を検索する

DQL 処理には、特定の要件を満たす必要があるビューアクセス用の一次ソート列が必要です。

スキャン制限

DQL 処理エンジンはシステムリソースを効率的に利用する処理を行っていますが、それでもクエリが過度の負荷を与える可能性があります。それを防ぐために、3 つの制限設定が用意されています。

パフォーマンスとリソースの使用

DQL 処理はメモリ、ディスク、CPU リソースを消費します。これらのリソースを保持し、クエリ処理を高速化するには、クエリを可能な限り最適化します。

クエリ分析のための Domino 統計

DQL が Domino サーバーにデプロイされている場合は、show stat queryコマンドを使用して DQL に関する統計をレポートできます。

デザインカタログ

ビューおよびビュー列に関する内部情報に高速にアクセスするために、DQL 処理では、ビュー ノートから抽出された設計データを含む設計カタログが使用されます。updall コマンドを使用して、デザイン カタログを個々のデータベースに追加し、デザイン カタログを最新の状態に保ちます。

DomQuery ユーティリティ

DomQuery コマンドラインユーティリティはDomino サーバーに同梱されており、クエリの作成と調整に使用されます。explain(-e) フラグを指定して実行すると、DQL 構文とクエリの処理方法を理解するのに役立ちます。

explain

DQL 構文がどのように処理されているかを理解するために Explain を使用することができます。Explain は、DominoQuery クラス (Java) および NotesDominoQuery クラス (LotusScript) のメソッドとして、またDomQuery ユーティリティーで -e フラグを付与して使用します。

全文検索

Domino 14 の新機能: HCL Domino® 14 以降では、Domino Query Language (DQL) 検索語に全文構文クエリを入力できるようになりました。

 

 

はじめに


Domino Query Language (DQL) を使用する前に、クエリ要求が処理される各データベースに対し、デザインカタログを作成します。
デザインカタログはデータベース内に表示されない文書として格納され、データを高速に検索するメカニズムを提供します。

このタスクについて

DQL は、デザインカタログ内の最適化されたデータを使用して、クエリを効率的に処理します。

手順

デザインカタログをデータベースに追加するには、次のupdall コマンドを使用します。

load updall <mydb.nsf> -e

次に

updall を使用してデザインカタログを最新の状態に保つなど、デザインカタログの詳細については、「デザインカタログ」の項目を参照してください。

 

 

DQL 構文


DQL は、LotusScript の NotesDatabase クラスと Java の Database クラスの  Query メソッド、や AppDevPack の domino-db API 等で実行できます。

DQL の構文は、次のとおりです。1つ以上の項で構成します。複数の項を論理演算子で連ねることもできます。

1つの項

[識別子] 比較演算子 [値]

複数の項

項 論理演算子 項 [論理演算子 ...]

 

構成要素

論理演算子

and | or | and not | or not

 

識別子

フィールド名 | 'ビューまたはフォルダ名'.列名 | @関数

 

比較演算子

= | > | >= | < | <= | in [all]

 

'引用符で囲まれた文字列値' | @dt('日時値') | 数値| 値リスト

 

@関数

@All | @ModifiedInThisFile |@DocumentUniqueID | @Created など

 

値リスト

'値 1' [ ,'値 2' ... ]

 

DQL にはさまざまな関数と演算子があり、同じ結果を様々な方法で得ることができます。DQL のパフォーマンスとリソースの使用状況を理解すると、検索を最適化するのに役立ちます。これを実践するには、 DomQuery ユーティリティ(または Java および LotusScript クラスの DominoQuery.explain() メソッド) を介してDQL のExplain機能を使用します。

 

 

シンプルなクエリの例


シンプルなクエリの例をいくつか示します。

order_no フィールドの値が 146751 より大きく 150111 以下の文書を検索します。

order_no > 146751 and order_no <= 150111

 

括弧内の 4 つの値のいずれかが sales_person フィールドに入っている文書を検索します。

sales_person in ('Chad Keighley', 'Jeff Chantel', 'Louis Cawlfield', 'Mariel Nathanson')

 

sales_person フィールドに「Chad」、「Chant」で始まる単語、または「C」で始まり、任意の 2 文字を含み「field」で終わる単語が含まれるすべての文書を検索します。

sales_person contains ('Chad', 'Chant*', 'C??field')

 

date_origin が、2018 年 10 月 10 日 10:00.00 EST より新しいすべての文書を検索します。

date_origin > @dt('2018-10-10T10:00:00+0500')

 

Orders ビューの order_type 列の値が「Phone」である文書を検索します。

'Orders'.order_type = 'Phone'

 

指定したビューおよびフォルダ内の文書を検索します。

in ('Orders', 'Special orders folder 1', 'Old_orders 2')

 

名前付きの文書コレクション、ビュー、フォルダ内の文書を検索します。

in ('TrudisDocs', 'Orders', 'Special orders folder 1', 'Old_orders 2')

 

 

値のデータ型


DQL クエリでは、検索されるデータの種類は、クエリで指定されたデータの種類によって定義されます。

 

 

論理演算


以下に、単純なクエリと論理処理を組み合わせた例をいくつか示します。

order_origin フィールドの値が「London」、「LA」、または「Tokyo」のいずれか、かつ date_origin が 2016 年 5 月 11 日よりも古い、または partno が 388388 の文書を検索します。

Order_origin in ('London', 'LA', 'Tokyo') AND date_origin > @dt('20160511') OR partno = 388388

 

「Soon to be special」ビューの「Status」列に「Shipping」という値があり、かつ order_origin が「LA」であるか、または Chad Keighley、Jeff Chantel、Louis Cawlfield、Mariel Nathanson のいずれかが販売した文書を検索します。

'Soon to be special'.Status = 'Shipping'

AND ( order_origin = 'LA' OR sales_person in ('Chad Keighley', 'Jeff Chantel', 'Louis Cawlfield', 'Mariel Nathanson'))**

 

「Soon to be special」ビューの「Status」列に「Inventory」の値を持ち、かつ order_origin が「Detroit」であるか、 Harold Cunningham、Julie Leach、Gordon Smith、Terence Henry のいずれかによって販売されていない文書を検索します。

'Soon to be special'.Status = 'Inventory' AND

( order_origin = 'Detroit' OR NOT sales_person in ('Harold Cunningham', 'Julie Leach', 'Gordon Smith', 'Terence Henry'))

 

注記:

DQL は NOT 単体での利用をサポートしません。「AND NOT」と「OR NOT」は演算子とみなされます。

有効な構文は次のとおりです。

Field1 = Value1 AND NOT Field2 = Value2

 

以下は無効な構文であり、エラーが発生します。

Field1 = Value1 AND (NOT Field2 = Value2)

 

 

優先順位


DQL には優先順位 (処理順序) があり、AND 演算された項は OR 演算された項より前に処理されます。

次の例では、order_origin と date_origin の項が AND 演算され、その結果と partno の項が OR 演算されます。

partno = 388388 or order_origin in ('London', 'LA', 'Tokyo') AND

date_origin > @dt('20160511')

 

優先順位をオーバーライドするには、括弧を使用します。次の例では、括弧で囲まれた date_origin の項と partno の項が OR 演算され、その結果が order_origin の項と AND 演算されます。

order_origin in ('London', 'LA', 'Tokyo') AND

(date_origin > @dt('20160511') OR

partno = 388388)

 

 

in All


このキーワードは、指定された値をすべて含む文書を返します。

次の例では、389、27883、388388、および 587992 のすべてが含まれる文書のみを検索します。

part_no in all ( 389, 27883, 388388, 587992 )

 

次の例では、'Orders' ビュー、'Special orders folder 1' フォルダ、および 'Old_orders 2' ビューに含まれる文書のみを検索します。

in all ('Orders', 'Special orders folder 1', 'Old_orders 2')

 

次の例では、「TrudisDocs」、「Orders」、「Special orders folder 1」、および「Old_orders 2」に含まれる文書のみを検索します。

in all ('TrudisDocs', 'Orders', 'Special orders folder 1', 'Old_orders 2')

 

 

contains


Domino 11 の新機能: NSF スキャンとビュー索引の使用に加えて、DQL は全文索引に対するクエリを処理する演算子を提供します。この演算子を処理するには、データベースに全文索引が必要です。

contains は、文書内の特定のフィールドまたはすべてのフィールドで文字列を検索するために使用します。

次の 2 つの例では、特定のフィールドで文字列を検索します。

Sales_person contains ('Trudi', 'Jack*')

Order_description contains all ('diagonal', 'brushed nickel', 'cap*')

 

次の 2 つの例では、フィールド名を省略し、文書内のすべてのテキストフィールドで文字列を検索します。

contains ('Mercury', 'spinning wildly', 'orbit*')

contains all ('Tiger Lily', 'Pete*', 'Lost boy?')

 

all は、指定した文字列をすべて含む文書のみを検索する場合に使用します。

ワイルドカード (*) を使用して、複数の文字と一致させます。単一の文字と一致させるには、(?) ワイルドカードを使用します。

ワイルドカードは、非ワイルドカード文字を含む文字列の一部である必要があります。独立したワイルドカードはサポートされていません。

たとえば、次のクエリを使用できます。

 

short_description contains ('??????hold*')

thresholdと や thresholding にヒットします。

 

short_description contains ('hold?n*')

holding、holdon、または holden にヒットします。

 

ただし、次のクエリには独立したワイルドカードがあり、何も返しません。

short_description contains ('*')

short_description contains ('hold *')

 

半角スペースは無視されます。たとえば、次のクエリは同じ結果を返します。

short_description contains ('hold')

short_description contains (' hold   ')

 

ダッシュ '-' は、検索可能な 2 つの「単語」の間にある通常の空白スペースのように扱われます。

この例では、「hold」という単語を含み、 その後に「a」で始まる任意の単語が続く項目を返します。

short_description contains ('hold-a*')

 

この例では、単語「hold」を含みその後に <*> が続く項目を返します。ただし、単独の '*' は何も返さないため、これら 2 つの結果セットは文書が返されません。

short_description contains ('hold-*')

 

追加情報

sales_person contains ('Trudi')

sales_person = 'Trudi'

 

トラブルシューティングの方法

contains クエリは「(フィールド contains 値)」という全文検索のクエリに変換されます。クライアント検索バーや C-API と同等の全文検索の処理が行われます。
予期しない結果が返された場合は、FTSearch またはクライアント検索バーを直接使用してクエリをテストすることを検討してください。「演算子を使用して検索クエリを絞り込む方法」を参照してください 。

「?」演算子は、任意の1文字を表すワイルドカードです。(単語内の他の文字に付いている場合)。

「*」演算子は、任意の長さの文字を表すことができるワイルドカードです。(単語内の他の文字に付いている場合)。

 

 

式言語


HCL Domino 12 以降、Domino Query Language (DQL) で式言語を使用できるようになりました。

様々な @関数を使用して、複雑な検索を実現できます。

@FL (または @FORMULA、大文字と小文字は区別しません) というキーワードを使用して、DQL 用語内に式言語を使った構文を記述します。

次の 3 つの例では、DQL 用語で式言語を使用し、論理演算子を使用して複数の項を組み合わせています。

in ('f14') and @formula('@doclength < 2500') and @formula('@length(title) > 15')

@fl('@Select(@Month(dob); "January"; "February"; "March";  "April"; "May"; "June"; "July"; "August";  "September"; "October"; "November"; "December")') = 'September'

@formula('@Matches(customer_responses;"reaction *": "belong *")') OR company_name contains ('Acme', 'Consolidated', 'Tool*')

 

代替変数を @fl 句の外側で使用すると、クエリテキストの再利用が可能になります。次に例を示します。

@fl('@doclength') > ?doclengthval and body contains (?bodyval)

@fl('@Select(@Month(dob); "January"; "February"; "March";  "April"; "May"; "June"; "July"; "August";  "September"; "October"; "November"; "December")') = ?monthstring

 

複数の項を AND や OR で組み合わせると、1 回のクエリですべての検索条件を満たすことができます。NSF スキャンを使用しない用語は組み合わせることができません。

次の数式言語の制限事項に注意してください。

次の @関数と構文コンポーネントが許可されます。

@Abs

@Accessed

@ACos

@Adjust

@Ascii

@ASin

@ATan

@ATan2

@AttachmentLengths

@AttachmentModifiedTimes

@AttachmentNames

@Attachments

@Author

@Begins

@BrowserInfo

@BusinessDays

@Certificate

@Char

@ClientType

@Compare

@ConfigFile

@Contains

@Cos

@Count

@Created

@Date

@Day

@DbColumn

@DbExists

@DbLookup

@DbName

@DbTitle

DEFAULT

@DocFields

@DocLength

@DocOmmittedLength

@DocumentUniqueID

@Elements

@Ends

@Exp

@FileDir

@FloatEq

@FontList

@GetAddressBooks

@GetCurrentTimeZone

@GetHTTPHeader

@GetPortsList

@HashPassword

@Hour

@Implode

@Integer

@IsAppInstalled

@IsAvailable

@IsDocTruncated

@IsInCompositeApp

@IsMember

@IsModalHelp

@IsNotMember

@IsNull

@IsNumber

@IsResponseDoc

@IsText

@IsTime

@IsUnavailable

@Keywords

@LanguagePreference

@LDAPServer

@Left

@LeftBack

@Length

@Like

@Ln

@Locale

@Log

@LowerCase

@MailDbName

@MailEncryptSavedPreference

@MailEncryptSentPreference

@MailSavePreference

@MailSignPreference

@Matches

@Max

@Member

@Middle

@MiddleBack

@Min

@Minute

@Modified

@Modulo

@Month

@Name

@Narrow

@NoteID

@Now

@OptimizeMailAddress

@OrgDir

@Pi

@Platform

@Power

@ProperCase

@Random

REM

@Repeat

@Replace

@ReplaceSubstring

@ReplicaID

@Right

@RightBack

@Round

@Second

@Select

@ServerAccess

@ServerName

@Set

@Sign

@Sin

@Sort

@Soundex

@Sqrt

@Subset

@Sum

@Tan

@TemplateVersion

@Text

@TextToNumber

@TextToTime

@Time

@TimeMerge

@TimeToTextInZone

@TimeZoneToText

@Today

@Tomorrow

@ToNumber

@ToTime

@Transform

@Trim

@Unique

@UpperCase

@URLDecode

@URLEncode

@URLGetHeader

@URLHistory

@UrlQueryString

@UserAccess

@UserName

@UserNameLanguage

@UserNamesList

@UserRoles

@ValidateInternetAddress

@VerifyPassword

@Version

@WebDbName

@Weekday

@WhichFolders

@Wide

@Word

@Year

@Yesterday

@Zone

 

 

文字列値


文字列値の評価では、大文字と小文字とアクセントは区別されません。DQL 処理で引数を日付/時刻や数値ではなく文字列として強制的に解釈させるには、一重引用符 (') を使用します。

文字列に引用符が含まれる場合は、隣接する一重引用符を使用して、それが文字列であることを示します。たとえば、O'Malley's dog's collar を検索するには、 O''Malley''s dog''s collar を指定します。

 

 

日付と時刻の値


DQL は、RFC3339 標準形式の日付/時刻文字列をサポートしています。

日付時刻で許可される値は以下になります。

@dt('2019-08-06T02:09:52Z')

@dt('2019-08-06T02:09:52.6800+04:00')

@dt('2019-08-06')

@dt('02:09:52')

@dt('02:09:52.6800')

@dt('02:09:52.6800+05:00')

 

日付/時刻値に対して比較演算子を使用できます。また、@created および @modifiedinthisfile などの日時を処理する関数の識別子では @dt('') 値が使用されます。部分的な日付は、指定された部分に従った値と一致します。1 日の場合はその日、1 日内の 1 秒 (または 1 秒未満) の場合はその秒です。タイムゾーン修飾子 (+ または - hh:mm 接尾辞) がない場合、すべての時刻は UTC 値 (GMT) として扱われます。現地時間を指定するには、タイムゾーン接尾辞修飾子を使用します。

注:ビュー検索を使用して部分的な日付値を見つけることはできません。たとえば、次のクエリは評価エラーを返します。

'myview'.datefield < @dt('2018-09-01')

'myview'.datefield = @dt('02:09:52')

 

日付は検索したいが時刻は重要ではない場合にビュー検索と部分的な日付値を使用するには、次のように値全体を指定します。

'myview'datefield < @dt('2018-09-01T00:00:00.000Z')

 

データベースに全文索引がある場合、次のような日付のみの検索語で索引が検索されます。

datefield <= @dt('2019-08-06')

 

 

代替変数


代替変数を使用して特定の用語の値によってのみ変化する DQL クエリを実行できます。ただし、文字列構築を使用して DQL クエリを構築すると、セキュリティが脆弱になる可能性があります。DQL は構文で代替変数をサポートしているため、クエリを変更せずに、異なる値を指定することができます。

文字列構築を使用して構築された Java クエリの例は次のとおりです。ここで order_num、 と order_origination は、外部から提供される値を持つフィールドです。

String query = "order_no = " + order_num + " and order_origin = '" + order_origination + "'";

この手法を使用してクエリを作成すると、セキュリティ上の問題が発生します。ユーザーまたは外部マルウェアは、クエリの結果を変更する合法的な DQL を入力することでクエリ構文を変更し、さらに多くの文書 (おそらくデータベース内のすべての文書) を検索できてしまうことがあります。たとえば、 order_num に次の値が含まれている場合、クエリのその部分はデータベース内のすべてのドキュメントを検索します。いわゆる SQL インジェクションの問題です。

"32890 or order_origin <= ''"

この弱点を解消するために、DQL は構文で代替変数をサポートしています。代替変数を使用すると、クエリを変更せずに、異なる値を指定して、さまざまな結果を生成することができます。代替変数には、位置置換変数と 名前付き代替変数の 2 種類があります。

位置置換変数は、クエリ内に疑問符が含まれます。次の例では、値は 1 ベースの割り当てを介して指定されます。order_no は変数 1 であり、order_origin は、変数 2 です。

String query = "order_no = ?  and order_origin = ?";

名前付き代替変数では、疑問符の後に、名前を構成する 1 ~ 15 バイトの英数字と特殊文字のテキスト名が続きます。値は、疑問符に続くテキストのみを使用して指定されます。以下は、名前付き代替変数を使用した同じクエリです。

String query = "order_no = ?order_num  and order_origin = ?order_origin";

Domino Java および LotusScript クラスは、名前付き代替変数のみをサポートします。

使用している言語でこれらの変数値を設定する方法の詳細については、Domino Designer のマニュアルを参照してください。

 

 

列値を検索する


列値を検索する DQL の処理には、特定の要件を満たすビューアクセス用の一次ソート列が必要です。

ビュー列は、次の照合ルールのいずれかに準拠する必要があります。

または

Notes クライアントでは、これらの要件のいずれかを満たしている列には、ユーザーが列名の上にマウスを置くとキャレットが表示されます。次に例を示します。

さらに、「<フィールド名> <演算子> <値>」というDQL 処理の構文を使用するには、ビュー列に次の 3 つの属性も必要です。

必要なビュー索引が見つからない場合は<フィールド名> <演算子> <値>、NSF スキャンが使用されます。

この構文を使用する場合の<'ビューまたはフォルダ名'>.<列名> の唯一の追加要件は、ビューの選択式として Select @All を使用する必要があることです。<'ビューまたはフォルダ名'>.<列名> が使用されており、照合要件とこの要件が満たされていない場合 、クエリは失敗し、戻りコードが返されます。

注: <'View or folder name'>.<Columnname>用語は、文書の結果セット、ビュー選択式、およびクエリ自体に対して 2 つのレベルのフィルタリングを適用します。

 

 

スキャン制限


DQL 処理エンジンはシステムリソースの利用を軽減する措置を講じていますが、それでも過度な負荷を与えるクエリを作成して実行する可能性はあります。それを防ぐために、3 つの制限設定が用意されています。

次のサーバーのnotes.ini設定を使用して、DQL処理のデフォルトを変更できます。

DQL エンジンへの API インターフェイスのいずれかを使用して、これらの設定を変更することもできます。

 

 

パフォーマンスとリソースの使用


DQL 処理はメモリ、ディスク、CPU リソースを消費します。クエリ処理を高速化するには、クエリを可能な限り最適化します。

DQL でクエリ用語を処理するには、次の 3 つの方法があります。

一般に、全文索引を使用するのが最も効率的で、次にビューエントリと NSF のサマリーアイテムのスキャンを使用しますが、データの量、ビューの構造、結果のサイズによって異なります。少数または中程度の数の文書の検索は、ビューを使用すると特に高速になります。したがって、DQL エンジンが全文索引とビューを使用するためのアクセスをどのように最適化するかを知ることが重要になります。次の表は、DQL の実行の側面を示しています。

表1 :DQL の実行側面

実行の側面

名前付き結果セット

全文検索

View スキャン

NSF スキャン

相対速度1

1

2

3

4

実行順序

1

1

2

3

サポートされている操作

in、in all

contains、ワイルドカード

数値および日付のみの用語の場合: =、>、>=、<、<=

=、>、>=、<、<=、IN、'ビュー名'.column

=、>、>=、<、<=、IN

統合

該当なし

AND で結合された用語

AND の範囲で結合された用語

同じ階層の要素に対して一緒に処理される

1相対速度。1 が最も速く、4 が最も遅くなります。

統合の場合、DQL は複数の用語を組み合わせて、最適なときに単一のスキャンまたはインデックス検索操作を実行します。DQL はまた、前の用語の結果を後続の用語に「フィード」し、全体のコストを大幅に制限します。たとえば、term1 によって削除されたドキュメントは、その用語が term2 と AND 演算されている場合には検索されません。

DQL 処理は、 Domino サーバー上の運用トラフィックが混在する環境でも非常にうまく機能しますが、全く負荷がないわけではありません。NSF のサマリーデータへのアクセスと同様に、読み取り専用の表示アクセスも増加します。この処理はサーバーにとってよくあることですが、関連する処理の低下を避けるためにその影響を調査する必要があります。

ビューまたはフォルダの索引を使用するには、そのインデックスにいくつかの特別なプロパティが必要です。

 

 

クエリを分析するための Domino 統計値


DQL が Domino サーバーにデプロイされている場合は、show stat query コマンドを使用して DQL に関する統計情報を確認できます。

この機能は Domino 11.0.1 で導入されました。

show stat クエリの出力例 :

  QUERY.AllQueries.Count = 265

  QUERY.AllQueries.MAX.Msecs = 1889

  QUERY.AllQueries.Msecs = 81889

  QUERY.AllQueries.Terms = 586

  QUERY.FT.AVG.DocsFound = 927

  QUERY.FT.AVG.Msecs = 8

  QUERY.FT.DocsFound = 204036

  QUERY.FT.MAX.DocsFound = 14371

  QUERY.FT.MAX.Msecs = 181

  QUERY.FT.Msecs = 1861

  QUERY.FT.TermCount = 220

  QUERY.INVIEW.AVG.DocsFound = 1976

  QUERY.INVIEW.AVG.Msecs = 48

  QUERY.INVIEW.DocsFound = 100800

  QUERY.INVIEW.MAX.DocsFound = 14700

  QUERY.INVIEW.MAX.Msecs = 424

  QUERY.INVIEW.Msecs = 2462

  QUERY.INVIEW.TermCount = 51

  QUERY.NSF.AVG.DocsFound = 558

  QUERY.NSF.AVG.Msecs = 135

  QUERY.NSF.AVG.ScannedDocs|Entries = 7576

  QUERY.NSF.DocsFound = 139660

  QUERY.NSF.MAX.DocsFound = 20741

  QUERY.NSF.MAX.Msecs = 986

  QUERY.NSF.MAX.ScannedDocs|Entries = 83479

 

 

デザインカタログ


ビューおよびビュー列に関する内部情報に高速にアクセスするために、DQL 処理では、ビューから抽出された設計データを含む設計カタログが使用されます。updall コマンドを使用して、デザインカタログを個々のデータベースに追加し、デザインカタログを最新の状態に保ちます。

デザインカタログなしで DQL クエリを実施すると、<'View or folder name'>.<Columnname> 構文が失敗します。他の構文は機能しますが、効率的なアクセスではなく、NSF スキャンを利用して条件を満たします。

 

DQL 処理は、デザインカタログを個々のデータベースに追加することによって大幅に強化されます。データベース内にデザインカタログを作成するには、次のコマンドを使用します。

load updall <database path> -e

<database path> を省略した場合、デザインカタログはデータディレクトリ下のすべてのデータベースに追加されますが、必要なデータベースにだけデザインカタログを生成することをお勧めします。

 

ビューの設計を変更するか、ビューを追加する場合は、次のコマンドを実行してデザイン カタログを更新し、変更を DQL に表示できるようにします。

load updall <database path> -d

注:これら 2 つの updall コマンドは常に手動で実行されます。

 

 

DomQuery ユーティリティ


DomQuery コマンド ライン ユーティリティはDomino サーバーに同梱されており、クエリの作成とテストに使用されます。explain (-e) フラグを指定して実行すると、DQL 構文とクエリの処理方法を理解して最適化するのに役立ちます。

DomQuery は、NSF ファイル内のデータを取得したり更新したりしません。これは、クエリの作成と最適化にのみ役立ちます。

DomQuery を使用するには、load domqueryサーバー コンソールで次のフラグを指定してコマンドを使用します。( Linux およびAIX の domquery では小文字である必要があります)。

注:クエリで DBCS 文字を使用する domquery は、Domino サーバー OS での DOS プロンプトまたは UNIX シェル文字セットのサポートが原因で機能しない可能性があります。DBCS クエリには -z (クエリを含むファイル) を使用することをお勧めします。

 

 

Explain


DQL 構文がどのように処理されるかを確認するために、Explain を使用することができます。Explain は、DominoQuery クラス (Java) および NotesDominoQuery クラス (LotusScript) のメソッドもしくは、DomQuery ユーティリティーで -e フラグを指定します。

次のクエリを確認します。

date_origin >= @dt('2016-07-01) and date_origin < @dt('2017-01-01') and

           sales_person contains ('Trudi Ayton') and 'all'.ord_status = ('shipping') and order_origin = 'Detroit'

次の図は、explain の出力を示しています。

Graphic depiction of explain output with descriptions

このクエリの例では、複数の項を AND 演算子で連結しています。各項は、全文検索、ビュー処理、または NSF スキャン操作のいずれかによって処理されます。エントリ (ビュー) または ScannedDocs (NSF スキャン) の数は、各項を満たすために行われた相対的な作業を示します。Prep と Exec という 2 つのミリ秒のタイミングがあり、Prep は、項のコンパイル、検証、準備にかかった時間、Exec は項の実行にかかる時間です。FoundDocs 値は、項の条件を満たした文書の合計を示します。

すべてのカウントとタイミングは親ノードにロールアップされ、クエリの合計コストが表示されます。

explainクエリが複雑になると、出力もより複雑になります。ただし、パフォーマンスの最適化には、次の同じチューニング手法が効果的です。

一般に、中間結果もできるだけ小さく抑えることが成功です。その点で、用語の AND 演算は結果を縮小しますが、用語の OR 演算は結果を拡大します。もちろん、アプリケーションロジックには要件がありますが、結果のサイズも考慮する必要があります。

 

 

全文検索


Domino 14 の新機能: HCL Domino 14 以降では、Domino Query Language (DQL) 検索語に全文検索クエリを入力できるようになりました。

全文検索は Domino 全体で一般的に使用されており、 @FTSearch('<QUERY>')または @FTS('<QUERY>')の形式のスタンドアロン用語を介して DQL クエリに直接統合できるようになりました。

全文検索のクエリでは、DQL の構文処理の一部として、括弧とそれを囲む一重引用符を記述する必要があります。関数名では大文字と小文字が区別されません。

@FTSearch()は、指定された全文クエリに一致するドキュメントのセットを返すスタンドアロンの項です。つまり、その後に演算子を使用することはできず、論理演算子のみを使用できます。

例えば:

このクエリは、@FTSearch()通常の日付用語と AND 演算された用語を示します。

@FTSearch('[TextField1] = (hello)') AND DateField1 > @dt('2023-06-12T04:17:31-04:00')

 

このクエリは、IN を使った項と OR 演算された @FTSearch() の項を示しています。

IN ALL ('view1', 'view2') OR @FTS('[name] < (b)')

 

@FTSearch は常に文書セットを返し、それ以外は何も返さないため、次のような演算子を使用しないでください。これは無効な構文です。

@FTSearch('[NumberField1] = (120)') >= 100

 

クエリ文字列の最大サイズは 256 バイトです。DQL は、全文検索エンジン自体によって処理されるクエリ構文を検証しません。

全文クエリの構文規則は、 LotusScript/Java クラスおよび C API の FTSearch() 関数と同じです。「演算子を使用して検索クエリを絞り込む方法」を参照してください。