問合せでのコレクションの使用

問合せの状態ではコレクションを指定できます。

StateタイプのCollectionName要素では、問合せで使用するコレクションの名前を指定できます。状態ごとに最大1つのコレクションを指定できます。ただし、問合せでは複数の状態を使用でき、各状態で必要に応じてコレクション名を指定できます。

コレクションを状態に関連付けた場合、その状態によって実行される操作は、そのコレクションを参照します。たとえば、状態でコレクション名を指定したレコード検索では、そのコレクション内でのみレコードが検索されます。ただし、コレクションに1つ以上のフィルタ・ルールが構成されている場合は、SelectionFilterまたはSelectedRefinementFilterの問合せによってそのフィルタ・ルールがトリガーされ、そのターゲット・コレクション内のレコードが使用されます。フィルタ・ルールの詳細は、「フィルタ・ルール」を参照してください。

コレクション名を指定するための問合せ構文は、次のとおりです。
<Request>
   ...
   <State>
      <Name>?</Name>
      <CollectionName>?<CollectionName>
      ...
   </State>
   ...
</Request>
変数の意味は次のとおりです。

名前付きの状態がある場合は、問合せ内のContentElementConfigにその状態を指定できます。

問合せでのコレクションの使用の例

この問合せには、Salesコレクションを指定する1つ目の状態(SalesRecs)と、Resellersコレクションに関連付けられた2つ目の状態(Resellers)が含まれています。また、ソース・コレクションとしてSalesコレクション、ターゲット・コレクションとしてResellersコレクションを含むフィルタ・ルールがあります。RecordCountConfigタイプは、SalesRecs状態に関連付けられており、問合せからレコード数をリストします。
<Request xmlns="http://www.endeca.com/MDEX/conversation/3/0">
   <Language>en</Language>
   <State>
      <Name>SalesRecs</Name>
      <CollectionName>Sales</CollectionName>
      <SelectionFilter Id="SalesFltr">
         <filterString>FactSales_SalesAmount > 1000</filterString>
      </SelectionFilter>
   </State>
   <State>
      <Name>ResellerRecs</Name>
      <CollectionName>Resellers</CollectionName>
   </State>
   <RecordListConfig Id="Results">
      <StateName>SalesRecs</StateName>
   </RecordCountConfig>
</Request>
問合せの結果は、次の省略された例のようになります。
<cs:Results ...>
   <State ...>
      <Name>SalesRecs</Name>
      <CollectionName>Sales</CollectionName>
      <DataSourceFilter>
         <filterString>"FactSales_ProductKey" IS NOT NULL</filterString>
      </DataSourceFilter>
      <SelectionFilter Id="SalesFltr">
         <filterString>FactSales_SalesAmount > 1000</filterString>
      </SelectionFilter>
   </State>
   <State ...>
      <Name>ResellerRecs</Name>
      <CollectionName>Resellers</CollectionName>
      <DataSourceFilter>
         <filterString>"DimReseller_ResellerKey" IS NOT NULL</filterString>
      </DataSourceFilter>
      <SelectionFilter>
         <filterString>"DimReseller_AnnualSales" > 1000</filterString>
         <AppliedFilterRule>
            <Source FilterId="SalesFltr">
               <StateName>SalesRecs</StateName>
            </Source>
            <TargetPropertyKey>DimReseller_AnnualSales</TargetPropertyKey>
         </AppliedFilterRule>
      </SelectionFilter>
   </State>
   <cs:RecordCount Id="Results">
      <cs:NumRecords>115</cs:NumRecords>
   </cs:RecordCount>
</cs:Results>

レスポンスでは、Resellersコレクションに対して暗黙的なSelectionFilterフィルタが実行されたことがResellerRecs状態に示されていることに注意してください。AppliedFilterRule要素には、暗黙的なフィルタのソース(フィルタIDと状態)がリストされています。

存在しないコレクションを指定した場合は、次のフォルト文字列が返されて問合せが失敗することに注意してください。
<Fault>
   <faultcode>env:Server</faultcode>
   <faultstring>OES-000190: Collection 'Producs' does not exist.</faultstring>
   <detail>
      <Fault xmlns:ns2="http://www.endeca.com/MDEX/eql_parser/types" 
             xmlns:ns3="http://www.endeca.com/MDEX/conversation/3/0"/>
   </detail>
 </Fault>

データ・ソース・フィルタの自動追加

問合せの処理中に、Endeca Serverは、コレクション名を提供するすべての状態に対してDataSourceFilterを自動的に作成して追加します。このフィルタは、前述の例のようになります。
<cs:Results ...>
   <State ...>
      <Name>ResellerRecs</Name>
      <CollectionName>Resellers</CollectionName>
      <DataSourceFilter>
         <filterString>"DimReseller_ResellerKey" IS NOT NULL</filterString>
      </DataSourceFilter>
      <SelectionFilter>
         <filterString>"DimReseller_AnnualSales" > 1000</filterString>
         <AppliedFilterRule>
            <Source FilterId="SalesFltr">
               <StateName>SalesRecs</StateName>
            </Source>
            <TargetPropertyKey>DimReseller_AnnualSales</TargetPropertyKey>
         </AppliedFilterRule>
      </SelectionFilter>
   </State>
   ...
</cs:Results>

コレクションの一意のプロパティ・キー(この例ではProductKey)を使用してDataSourceFilterを追加する目的は、コレクション内のレコードに検索範囲を限定することにあります。

EQLConfigの問合せでのコレクションの使用

EQL問合せ内のFROM句では、コレクションは直接参照できませんが状態は参照できます。ただし、状態でコレクション名を指定している場合は、状態を介してコレクションを使用できます。

この単純なEQL問合せでは、EQLConfigタイプを使用しています。
<Request>
   <Language>en</Language>
   <State>
      <Name>TotalSales</Name>
      <CollectionName>Sales</CollectionName>
   </State>
   <ns:EQLConfig Id="EQLQuery">
      <StateName>TotalSales</StateName>
      <EQLQueryString>
         RETURN Results AS
         SELECT ARB(FactSales_SalesAmount) AS totalAmount
         FROM TotalSales
         GROUP BY FactSales_OrderQuantity
      </EQLQueryString>
   </EQLConfig>
</Request>

FROM句では、ソースとしてTotalSales状態を指定しています。TotalSales状態はSalesコレクションを指定しているため、そのコレクションのレコードが使用されます。