![]() ![]() ![]() ![]() ![]() ![]() | ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
第6章
この章では、クエリプロセス、およびexteNd Director検索アプリケーションでクエリを実装する方法について説明します。
この章では、次のトピックについて説明します。
クエリは、データソースからコンテンツを検索する場合に使用できる構造化された式です。exteNd DirectorのAutonomyベース検索機能では、データの各タイプに対して個々のクエリを作成することなく、「単一のクエリ式を使用」してコンテンツおよびメタデータの両方でクエリを実行できます。
メタデータのクエリ exteNd Directorでは、次の2種類のメタデータをクエリできます。
「標準(基本)メタデータ」は、すべてのドキュメントに自動的に追加されるコンテンツの記述的な情報です。標準メタデータの例には、タイトル、著者、および作成日があります。
「カスタム(拡張)メタデータ」は、ドキュメントタイプのフィールドとしてCM (Content Management)サブシステムで定義するコンテンツについてのアプリケーション固有情報です。
コンテンツのクエリ コンテンツは発行されている場合だけクエリできます。
exteNd Directorに装備されているデータフェッチャでは、exteNd Director CMリポジトリに保存されているコンテンツやメタデータに対してAutonomyベース検索を排他的に実行できます。
CMリポジトリをクエリするには、CMサブシステムをSearchサブシステムと併用します。CM APIは、CMリポジトリのクエリの実装で説明されているように、CMリポジトリに関連付けられた関連検索機能をラッパするクラスを提供します。
Autonomy技術をexteNd Directorで使用してCMリポジトリ以外のデータソースを検索するには、Autonomy, Inc.の別売りデータフェッチャを購入する必要があります。
カスタムデータソースをクエリするには、Search APIクラスを使用し、カスタムデータソースのクエリの実装で説明されているようにクエリオブジェクトのインスタンスを生成して、使用ライセンスのある他のデータソースに対してクエリを実行する必要があります。
また、カスタムデータをCMリポジトリにインポートして、Autonomyベース概念クエリを実装するためにCMラッパクラスを使用することもできます。
exteNd Director Searchサブシステムでサポートされているクエリのタイプは、次のとおりです。
各クエリタイプを指定する方法を示す構文定義やコード例など、クエリの各タイプの詳細については、を参照してください。
Autonomyベースの概念検索およびキーワード検索をexteNd Directorアプリケーションで実装するには、関連Search APIをラッパするCM API機能を使用します。
CMクラス |
説明 |
対象の検索クラス |
---|---|---|
com.sssw.cm.api.EbiContentMgmtDelegate.runQuery() |
ラッパ |
com.sssw.search.api.EbiQueryEngineDelegate.runQuery() |
com.sssw.cm.api.EbiQueryResult |
拡張 |
com.sssw.search.api.EbiQueryResult |
このラッパクラスはCMリポジトリに存在し、exteNd Director DRE (Dynamic Reasoning Engine)によりインデックスが作成されているコンテンツやメタデータでクエリを構築および実行するメソッドを提供します。
また、で説明されているように、環境を設定して、ドキュメントフェッチおよびクエリのプロセスを管理できます。
CMリポジトリのクエリの主なクラスおよびインタフェースは、次のとおりです。
この節では、exteNd DirectorアプリケーションでCMリポジトリをクエリする場合に使用できるCM APIメソッドについて説明します。
コンテンツマネージャ委任を取得するメソッドは、次のとおりです。
com.sssw.cm.client.EboFactory.getDefaultContentMgmtDelegate()
このメソッドは、デフォルトのCMリポジトリに関連するコンテンツマネージャ委任を返します。コンテンツマネージャ委任は、Autonomyベースクエリをこのリポジトリのドキュメントコンテンツおよびメタデータで実行するメソッドを提供します。
委任を使用する理由については、プログラムを使用した例を参照してください。
Autonomyベースクエリは、Search APIにあるEbiQueryインタフェースに基づいています。CMサブシステムのコンテンツおよびメタデータを検索するには、このインタフェースを実装し、CMリポジトリと関連付けられたクエリオブジェクトのインスタンスを生成する必要があります。CM APIは、使用する次のメソッドを提供します。
com.sssw.cm.factory.EboFactory.getQuery()
このクエリオブジェクトを使用すると、CMリポジトリのクエリの構築で説明されているように、Search APIメソッドを呼び出して、Autonomyベースクエリを構築し、検索結果を調整できます。
CMリポジトリのクエリを構築する主なメソッドは、次のとおりです。
注記: 同じメソッドを使用して、カスタムデータソースのAutonomyベースクエリを構築します。ただし、カスタムデータソースのクエリの実装で説明されているように、Search APIのファクトリからインスタンス生成されるクエリオブジェクトでこれらのメソッドを呼び出すという点が異なります。
CMリポジトリをクエリするメソッドは、次のとおりです。
com.sssw.cm.api.EbiContentMgmtDelegate.runQuery()
このメソッドは、com.sssw.search.api.EbiQueryインタフェースを使用して構築するクエリを実行します。また、com.sssw.cm.api.EbiQueryResultインタフェースを実装するオブジェクトのコレクションとして結果を返します。
クエリオブジェクトのインスタンスを生成し、Defaultと呼ばれるデフォルトのCMリポジトリにクエリを実行するコードセグメントの例は、次のとおりです。
... public void getComponentData( EbiPortalContext context, java.util.Map params ) throws com.sssw.fw.exception.EboUnrecoverableSystemException { //Declare a string buffer StringBuffer sb = new StringBuffer(); //Set the query string String queryString = 典he+effect+of+the+recession+on+consumer+spending\x94 ; try { //Create a blank query object com.sssw.search.api.EbiQuery query = com.sssw.cm.factory.EboFactory.getQuery(); //Set query type to text query.setQueryType(query.QUERY_TYPE_TEXT); //Specify the query string; this is a conceptual query query.setText(queryString); //Ask for a maximum of 50 results query.setMaxNumResults(50); //Ask for results that are at least 80% relevant query.setRelevanceCut(80); //Ask to return all available document properties in the results query.selectAll(); //Get the content manager delegate EbiContentMgmtDelegate contentMgr = com.sssw.cm.client.EboFactory.getDefaultContentMgmtDelegate(); //Run the query //The boolean argument in runQuery indicates whether results should be filtered Iterator iterResults = contentMgr.runQuery(context, query, true).iterator(); //Process the results while (iterResults.hasNext()) { com.sssw.cm.api.EbiQueryResult res = (com.sssw.cm.api.EbiQueryResult)iterResults.next(); //Get document metadata String docTitle = res.getTitle(); java.sql.Timestamp dateCreated = res.getDateCreated(); //Get document content String docAbstract = res.getAbstract(); //Add query result to the string buffer returned by the component sb.append(貼n\x94 ).append(docTitle).append(dateCreated).append(docAbstract).append(貼n\x94 ); } } catch (Exception _E) { System.out.println (轍uery failed\x94 ); _E.printStackTrace(); } //Set content type context.setContentType( com.sssw.portal.api.EbiComponentConstants.MIME_TYPE_HTML_UTF8 ); //Place the content into the context context.setComponentContent(sb.toString()); } ...
上の例で示されているように、このコンポーネントは、クエリ結果からドキュメントタイトルと作成日の両方のメタデータ、およびコンテンツを取得します。デフォルトでは、exteNd Director DREは、両方のタイプの情報にインデックスを作成するように設定されています。この動作は、CMサブシステム設定ファイルでデフォルトで有効にされている2つの検索オプションで制御されます。
com.sssw.cm.fetch.process.content.repository name
ドキュメントコンテンツのインデックス作成の説明を参照してください。
c
om.sssw.cm.fetch.process.metadata.repository name
標準ドキュメントメタデータのインデックス作成の説明を参照してください。
CMサブシステムは、で説明されているように、検索環境をカスタマイズする場合に設定できるその他の多くのオプションを提供しています。
exteNd Director Search APIは、CMリポジトリ以外のデータリソースのコンテンツに対してクエリを実行する場合のメソッドを提供するAutonomy APIに対してラッパクラスを提供します。
重要: Autonomy技術をexteNd Directorで使用してその他のデータソースを検索するには、Autonomy, Inc.の別売りデータフェッチャを購入する必要があります。
カスタムデータソースをクエリする主なクラスおよびインタフェースは、次のとおりです。
この節では、exteNd Directorアプリケーションでカスタムデータソースをクエリする場合に使用できるSearch APIメソッドについて説明します。
クエリエンジン委任を取得するメソッドは、次のとおりです。
com.sssw.search.client.EboFactory.getQueryEngineDelegate()
このメソッドは、EbiQueryEngineDelegateインタフェースを実装するオブジェクトを返します。このオブジェクトのメソッドは、クエリエンジンを設定して、クエリを実行する場合に使用できます。
委任を使用する理由については、プログラムを使用した例を参照してください。
Autonomyベースクエリは、SearchサブシステムAPIにあるEbiQueryインタフェースに基づいています。カスタムデータソースのコンテンツおよびメタデータを検索するには、このインタフェースを実装するクエリオブジェクトのインスタンスを生成する必要があります。使用するメソッドは、次のとおりです。
com.sssw.search.factory.EboFactory.getQuery()
このクエリオブジェクトを使用すると、Search APIメソッドを呼び出して、Autonomyベースクエリを構築し、検索結果を調整できます。
カスタムデータソースのAutonomyベースクエリを構築する主なメソッドは、次のとおりです。
注記: 同じメソッドを使用して、CMリポジトリのAutonomyベースクエリを構築します。ただし、CMリポジトリのクエリの実装で説明されているように、CM APIのファクトリからインスタンス生成されるクエリオブジェクトでこれらのメソッドを呼び出すという点が異なります。
クエリを発行するメソッドは、次のとおりです。
com.sssw.search.api.EbiQueryEngineDelegate.runQuery()
このメソッドは、com.sssw.search.api.EbiQueryインタフェースを使用して構築するクエリを実行します。また、com.sssw.search.api.EbiQueryResultインタフェースを実装するオブジェクトのコレクションとして結果を返します。
次のコードセグメントは、Autonomyベース概念クエリをカスタムデータソースに発行するためのロジックを実装するexteNd DirectorコンポーネントのgetComponentData()メソッドを示します。
... public void getComponentData( EbiPortalContext context, java.util.Map params ) throws com.sssw.fw.exception.EboUnrecoverableSystemException { //Declare a string buffer StringBuffer sb = new StringBuffer(); //Set the query string, using syntax for a conceptual query String queryString = 菟hysician+specialty+orthopaedics\x94 ; try { //Create a blank query object com.sssw.search.api.EbiQuery query = com.sssw.search.factory.EboFactory.getQuery(); //Set query type to text query.setQueryType(query.QUERY_TYPE_TEXT); //Specify the query string; this is a conceptual query query.setText(queryString); //Ask for a maximum of 50 results query.setMaxNumResults(50); //Ask for results that are at least 80% relevant query.setRelevanceCut(80); //Ask to return all available document properties in the results query.selectAll(); //Get the query engine delegate EbiQueryEngineDelegate qe = com.sssw.search.factory.EboFactory.getQueryEngineDelegate(); //Run the query Iterator iterResults = qe.runQuery(context, query, null, true).iterator(); //Process the results while (iterResults.hasNext()) { com.sssw.search.api.EbiQueryResult res = (com.sssw.search.api.EbiQueryResult)iterResults.next(); //Get document metadata String docTitle = res.getTitle(); java.sql.Timestamp dateCreated = res.getDateCreated(); //Get document abstract String docAbstract = res.getAbstract(); //Add query result to the string buffer returned by the component sb.append(貼n\x94 ).append(docTitle).append("\n").append(dateCreated).append("\n").append(docAbstract).append(貼n\x94 ); } } catch (Exception _E) { System.out.println (轍uery failed\x94 ); if (m_log.isError()) m_log.error(_E); } //Set content type context.setContentType( com.sssw.portal.api.EbiComponentConstants.MIME_TYPE_HTML_UTF8 ); //Place the content into the context context.setComponentContent(sb.toString()); } ...
検索クエリオブジェクトの初期化に使用できるXMLファイルとして検索クエリ記述子を構築できます。検索クエリ定義のXMLは、search-query-def_4_0.dtdで指定されたルールに準拠する必要があります。これは、exteNd DirectorプロジェクトlibraryフォルダのSearchService.jar内にあるDTDフォルダにあるファイルです。
XMLクエリ記述子からクエリオブジェクトをプログラムで初期化する利点をいくつか示します。
すべての検索クエリ定義には、クエリタイプを指定する要素があります。
<!ELEMENT search-query-def (text-query | fuzzy-query | get-all-query | suggest-query | name-search-query)>
各クエリタイプ要素は、クエリを調整するプロパティを提供します。たとえば、次のテキストクエリ要素を考慮します。
<!ELEMENT text-query (query-text?, field-spec?, query-options?, selected-props?)>
この定義では、query-textで定義されているテキストを検索するメタデータを示すfield-specプロパティでフィールド指定子リストを定義して、フィールドクエリを構築できます。
他のクエリタイプのXML定義は、次のとおりです。
<!ELEMENT fuzzy-query (query-text?, field-spec?, query-options?, selected-props?)>
<!ELEMENT get-all-query (field-spec?, query-options?, selected-props?)>
<!ELEMENT suggest-query (doc-list, suggest-options?, field-spec?, query-options?, selected-props?)>
<!ELEMENT name-search-query (query-text?, field-spec?, query-options?, selected-props?)>
Search APIは、ランタイム時にクエリタイプを設定するメソッドsetQueryType()を提供します。このメソッドは、EbiQueryオブジェクトで呼び出します。
各クエリタイプを指定する方法を示す構文定義やコード例など、クエリの各タイプの詳細については、を参照してください。
各クエリタイプには、クエリ動作を調整できるquery-optionsプロパティが含まれます。query-optionsのXML定義は、次のとおりです。
<!ELEMENT query-options ( batch-options?, date-range?, exclusions?, generate-quick-summary?, thesaurus-options?, max-num-results?, relevance-cut?, sort-by-date?, sort-by-relevance?, use-abs-weight? )>
これらの各オプションに対して、Search APIは、ランタイム時に個別にオプションを設定するためにEbiQueryオブジェクトで呼び出すことができるメソッドを提供します。各オプションの説明は、次のとおりです。
クエリタイプのselected-propsプロパティでは、クエリ結果で返されるドキュメントプロパティを指定できます。selected-propsのXML定義は、次のとおりです。
<!ELEMENT selected-props (prop-name* | select-all)>
この定義を使用して、個々のドキュメントプロパティ、または使用可能なすべてのドキュメントプロパティが返されるようにクエリを指定できます。
また、EbiQueryオブジェクトで次のSearch APIメソッドを呼び出して、ドキュメントプロパティをランタイム時に指定できます。
メソッド |
説明 |
---|---|
select() |
クエリ結果で返される指定ドキュメントプロパティを選択します。 |
selectAll() |
クエリ結果で使用できるすべてのドキュメントプロパティを返します。 |
selectAlways() |
クエリ結果の指定ドキュメントプロパティを常に返します。 |
removeSelect() |
Selectedプロパティのリストから指定プロパティを削除します。 |
XMLで定義されるテキストクエリの例は、次のとおりです。
<search-query-def> <text-query> <query-text><![CDATA[clinical+trials+diabetes+research]]></query-text> <field-spec> <field-spec-list><![CDATA[fnameTITLE=*report*+fnameCountry=*USA*]]></field-spec-list> <field-boolean-expr><![CDATA[fnameTITLE+AND+fnameCountry]]></field-boolean-expr> </field-spec> <query-options> <date-range> <date-from><![CDATA[11/01/2002]]></date-from> <date-to><![CDATA[11/02/2002]]></date-to> <date-pattern><![CDATA[dd/MM/yyyy]]></date-pattern> </date-range> <generate-quick-summary/> <max-num-results><![CDATA[50]]></max-num-results> <relevance-cut><![CDATA[70]]></relevance-cut> <sort-by-date/> <sort-by-relevance/> </query-options> <selected-props> <prop-name><![CDATA[AUTHOR]]></prop-name> <prop-name><![CDATA[TITLE]]></prop-name> <prop-name><![CDATA[CREATED]]></prop-name> </selected-props> </text-query> </search-query-def>
この定義から、このクエリは、単純なテキストクエリ(キーワード検索)ではなく、次のような特徴を持ったクエリであると言えます。
このサンプルXMLクエリ定義は、search-query-def_4_0_sample.xmlにあります。また、このファイルは、exteNd DirectorプロジェクトのlibraryフォルダのSearchService.jar内のDTDフォルダにあります。
クエリオブジェクトをXMLクエリ記述子から初期化するサンプルコードは、次のとおりです。
... //Instantiate a blank query object com.sssw.search.api.EbiQuery query = com.sssw.search.factory.EboFactory.getQuery(); //Read in your query XML descriptor Document queryDesc = com.sssw.fw.util.EboXmlHelper.getDocumentFromString(myInputStream); //Initialize the blank query object with data from the XML //descriptor query.fromXML(queryDesc.getDocumentElement()); ...
getDocumentFromString()メソッドは、DOMドキュメントを返します。これは、XMLドキュメントを表す文字列、この場合、入力引数myInputStreamから変換されます。
この節では、Autonomyベース概念クエリの結果をソートする方法について説明します。
日付または関連度、あるいはその両方でクエリ結果をソートできます。両方のプロパティでソートする場合、結果は、日付、関連度の順でソートされます。
com.sssw.search.api.EbiQueryオブジェクトを定義します。
ソートファクタ |
内容 |
コール |
---|---|---|
関連度 |
関連度によるソートを「有効」にする |
setSortByRelevance(true) |
関連度によるソートを「無効」にする |
setSortByRelevance(false) |
|
日付 |
日付によるソートを「有効」にする |
setSortByDate(true) |
日付によるソートを「無効」にする |
setSortByDate(false) |
フィールドクエリの結果は、1つのパラメータで昇順または降順にソートすることもできます。パラメータは、標準メタデータフィールドまたはカスタムメタデータフィールドの値にすることができます。
注記: 標準メタデータフィールド名は、exteNd Directorインストールディレクトリのautonomy\\engineにある、DRE環境設定ファイルDirectorDRE.cfgの[フィールド]セクションに一覧表示されています。
フィールドクエリを発行する前に、で説明されているように、検索するメタデータのタイプ(標準メタデータまたはカスタムメタデータ、あるいはその両方)を指定するように検索環境が設定されているか確認してください。
[Server]セクションのパラメータFIELDSORT=1を設定して、フィールドソートを有効にします。
注記: このパラメータがない場合は、ファイルに追加してください。
DREのリセットで説明されているように、DREをリセットします。
プログラムを使用した例で説明されているように、データのインデックスを再作成します。
フィールドクエリに作成したフィールド指定子リストに、次のいずれかの式を追加して、ソートパラメータを指定します。
ソート式 |
説明 |
---|---|
&fsort=FIELDNAME |
フィールドFIELDNAMEの値で昇順にソートします。 |
&fsort=-FIELDNAME |
フィールドFIELDNAMEの値で降順にソートします。 |
たとえば、CMリポジトリで、Collegesと呼ばれるドキュメントタイプおよびRankingとLocationの2つのカスタムフィールドを定義しているとします。Massachusettsにあるすべての大学を検出し、結果をランクにより降順にソートする場合、フィールド指定子は次のようになります。
... String fieldSpecList = "fnameDOCTYPENAME=*Colleges*+fnameLocation=*Massachusetts*+ &fsort=-Ranking"; String fieldBooleanExpr = "fnameDOCTYPENAME+AND+fnameLocation"; query.setFieldSpecList(fieldSpecList, fieldBooleanExpr); ...
フィールドクエリの構築および実装の詳細については、フィールドクエリを参照してください。
Copyright © 2004 Novell, Inc. All rights reserved. Copyright © 1997, 1998, 1999, 2000, 2001, 2002, 2003 SilverStream Software, LLC. All rights reserved. more ...