以下の簡単な例では、2 番目のパラメータにより、ディクショナリ 1 つのみの適用が指定されていますが、複数のディクショナリも %List の要素として指定できます。3 番目のパラメータが既定の 1 に設定されています。つまり、任意のディクショナリ項目の単独一致により、包含するためのソースを選択しています。これをさらに高く設定して、ディクショナリの項目が膨大にあることにより、または膨大なテキストを含むソースのクエリにより、単一のディクショナリ一致が意味のあるものではなく、偶然の産物となる可能性があるソース選択を避ける必要性が生じる場合もあります。4 番目のパラメータは既定値 (-1) を採用することで、最大一致数制限をなくしています。最大パラメータが最少パラメータより小さい場合、ディクショナリ一致に関係なく、すべてのソースがフィルタにより選択されます。5 番目のパラメータも既定値を採用していますが、マッチングは一致スコアではなく、一致の数に基づいています。6 番目のパラメータは ensureMatched フラグです。ここでは ensureMatched=2 なので、フィルタのインスタンス化により、フィルタ呼び出しのたびに使用される静的な一致結果を生成します。これを使用することをお勧めします。フィルタのインスタンス化後にディクショナリが変更された場合、ensureMatched を 1 に設定する必要があります。ensureMatched=1 では、毎回フィルタが呼び出される前にマッチングを行うことで、ディクショナリ・コンテンツの変更が考慮されます。ただし、ensureMatched=1 を使用すると処理速度が大幅に落ちてしまうおそれがあります。
DomainCreateOrOpen
SET dname="mydomain"
IF (##class(%iKnow.Domain).NameIndexExists(dname))
{ SET domoref=##class(%iKnow.Domain).NameIndexOpen(dname)
GOTO DeleteOldData }
ELSE { SET domoref=##class(%iKnow.Domain).%New(dname)
DO domoref.%Save()
GOTO SetEnvironment }
DeleteOldData
SET stat=domoref.DropData()
IF stat { GOTO SetEnvironment }
ELSE { WRITE "DropData error ",$System.Status.DisplayError(stat)
QUIT}
SetEnvironment
SET domId=domoref.Id
ListerAndLoader
SET domId=domoref.Id
SET flister=##class(%iKnow.Source.SQL.Lister).%New(domId)
SET myloader=##class(%iKnow.Source.Loader).%New(domId)
QueryBuild
SET myquery="SELECT TOP 50 ID AS UniqueVal,Type,NarrativeFull FROM Aviation.Event"
SET idfld="UniqueVal"
SET grpfld="Type"
SET dataflds=$LB("NarrativeFull")
UseListerAndLoader
SET stat=flister.AddListToBatch(myquery,idfld,grpfld,dataflds)
IF stat '= 1 {WRITE "The lister failed: ",$System.Status.DisplayError(stat) QUIT }
SET stat=myloader.ProcessBatch()
IF stat '= 1 {WRITE "The loader failed: ",$System.Status.DisplayError(stat) QUIT }
CreateDictionary
SET dictname="EngineTerms"
SET dictdesc="A dictionary of aviation engine terms"
SET dictId=##class(%iKnow.Matching.DictionaryAPI).CreateDictionary(domId,dictname,dictdesc)
IF dictId=-1 {WRITE "Dictionary ",dictname," already exists",!
GOTO ResetForNextTime }
ELSE {WRITE "created dictionary ",dictId,!}
PopulateDictionaryItem1
SET itemId=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryItem(domId,dictId,
"engine parts",domId_dictId_1)
SET term1Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(domId,itemId,
"piston")
SET term2Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(domId,itemId,
"cylinder")
SET term2Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(domId,itemId,
"crankshaft")
SET term2Id=##class(%iKnow.Matching.DictionaryAPI).CreateDictionaryTerm(domId,itemId,
"camshaft")
DefineAFilter
SET filt=##class(%iKnow.Filters.DictionaryMatchFilter).%New(domId,$LB(dictId),1,,,2)
SourceCountQuery
SET numSrcD=##class(%iKnow.Queries.SourceAPI).GetCountByDomain(domId)
WRITE "The ",dname," domain contains ",numSrcD," sources",!
SourcesFilteredByDictionaryMatch
SET numSrcFD=##class(%iKnow.Queries.SourceAPI).GetCountByDomain(domId,filt)
WRITE "Of these ",numSrcD,", ",numSrcFD," match the ",dictname," dictionary:",!!
DO ##class(%iKnow.Queries.SourceAPI).GetByDomain(.result,domId,1,50,filt)
SET i=1
WHILE $DATA(result(i)) {
SET intId = $LISTGET(result(i),1)
SET extId = $LISTGET(result(i),2)
WRITE "dictionary matches ",intId," ",extId,!
SET i=i+1 }
WRITE !,i-1," sources included by dictionary match",!
ResetForNextTime
IF dictId = -1 {
SET dictId=##class(%iKnow.Matching.DictionaryAPI).GetDictionaryId(domId,dictname)}
SET stat=##class(%iKnow.Matching.DictionaryAPI).DropDictionary(domId,dictId)
IF stat {WRITE "deleted dictionary ",dictId,! }
ELSE { WRITE "DropDictionary error ",$System.Status.DisplayError(stat) }