IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Information Management | SOA and Web services  >

IBM OmniFind Yahoo! Edition REST API を使う

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

サンプルコード

原文はこちら

原文はこちら


レベル: 初級

Arthur Choi (achoi@us.ibm.com), Technical Sales Consultant, IBM

2007年 4月 19日

無償でダウンロードできる検索エンジンである IBM® OmniFind™ Yahoo! Edition (この記事では単に OmniFind と呼びます) に、皆さんのカスタム・アプリケーション簡単にアクセスできる方法を学んでください。OmniFind には、Representational State Transfer (REST) Web サービスが用意されており、これを介して、検索 API と文書プッシュ API または文書削除 API を他のアプリケーションに公開できます。この API を使用すれば、カスタムの検索アプリケーションを作成し、独自のルック・アンド・フィールを備えた個人専用の検索ページを作成することができます。また、カスタムのクローラー・アプリケーションを作成すれば、現在 OmniFind でサポートされている Web およびファイル・システムのリポジトリーに加えて、他のコンテンツ・リポジトリーを対象とした文書のプッシュおよび削除を行うこともできます。

はじめに

他のいくつかの検索エンジンと同様に OmniFind にも、その機能を公開するための REST API が用意されています。Web ベースのアプリケーションおよびサービスの多くで、サービス配信メカニズムとして REST が広く使用される理由は数多くあります。

たいていのコンピューティング・プラットフォームに付属しているソケット・インターフェースおよび XML パーサーは別として、その他の余分なソフトウェアは REST クライアントには必要ありません。対照的に、SOAP リモート・プロシージャー・コール (RPC) クライアントでは、追加のメッセージ層およびトランスポートの処理用として、特別なランタイム・ライブラリーをインストールする必要があります。したがって、REST クライアントのほうが、ソフトウェアへの依存性が低くなります。REST には、それ以外にも多数の利点があることにお気付きになるでしょう。REST のアーキテクチャー・スタイルおよび利点の詳細は、ウィキペディアの Web サイトの「REST」の項を参照してください。

以下の説明では、簡潔なサンプル・コード・セグメントを示しながら、OmniFind REST API に用意された各サービスにアクセスする方法に焦点をあてています。この記事で示されているサンプル・コード・セグメントは、「IBM OmniFind Yahoo! Edition Programming Guide and API reference」の補足としてインプリメントされたものです。このプログラミング・ガイドとサンプル・コードを参考にすれば、カスタム・アプリケーションの作成をすぐに開始することができます。したがって、IBM OmniFind Yahoo! Editionをまだダウンロードしていない方は、すぐにダウンロードして、OmniFind REST API を使用して皆さん独自のカスタム・アプリケーションの作成に取り掛かってください。




上に戻る


OmniFind REST API の概要

OmniFind API により公開されるサービスには、索引の検索、索引への文書の追加、および索引からの文書の削除などがあります。以下に、OmniFind REST API の概要を示してあります。この概要には、サービス・エンドポイント URL、HTTP メソッドの種類、必須のパラメーター、およびサービスの簡単な説明などが含まれています。

エンドポイント URLHTTP メソッド必須パラメーター説明
http://host:port/api/searchGETindex=Default, query検索を行い、検索結果を Atom フィードまたは HTML スニペットとして返します
http://host:port/api/documentPOSTindex=Default, action=addDocument, docType, docIdデフォルト索引に文書を追加します
http://host:port/api/documentDELETEindex=Default, action=deleteDocument, docIdデフォルト索引から文書を削除します

検索 API のエンドポイント URL は http://host:port/api/search です。検索 API は HTTP GET メソッドを使用して、クエリーを送信し、検索結果を受信します。検索用の各種パラメーターは HTTP GET URL として渡されます。文書 API のエンドポイント URL は http://host:port/api/document です。文書追加 API は、HTTP POST メソッドを使用します。文書追加アクション用の各種パラメーターは、HTTP 要求ヘッダーとして渡され、実際の文書コンテンツは、HTTP POST 本体として渡されます。文書削除 API は、HTTP DELETE メソッドを使用します。文書削除アクション用の各種パラメーターは、HTTP 要求ヘッダーとして渡されます。

どの OmniFind API にも必須の index パラメーターがありますが、現在 OmniFind でサポートされているのは、唯一の事前定義の索引としての Default のみであることに注意してください。したがって、index パラメーターの値は常に Default でなければなりません。文書プッシュ API の場合、文書のコンテンツを HTTP POST 本体としてプッシュし、docType パラメーターを使って、該当するコンテンツ・タイプ (たとえば MIME タイプ) を設定する必要があります。

docID は、索引内の個々の文書をそれぞれ固有に識別する必要があります。docID は、文書のプッシュおよび削除の操作で使用されて、デフォルト索引内の個別の文書を識別します。また、docID は、検索後にオリジナルの文書を取り出すのにも使用されます。オリジナルのコンテンツを正しく取り出すには、docIDは有効な URL でなければなりません。URL が標準形式の場合、ブラウザーによる直接処理が可能なので、オリジナルのコンテンツを取り出すために何もする必要はありません。URL が標準形式でない場合は、カスタムの文書取得 J2EE Web アプリケーションを作成して、docID をアプリケーションに渡す必要があります。そうすれば、オリジナルの文書を取り出すことができます。オリジナルのコンテンツの取り出しは重要ですが、この記事ではこれ以上その内容を掘り下げません。なぜなら、これは OmniFind REST API の一部を成すものではないからです。




上に戻る


OmniFind REST API の標準的な使用法

カスタムの検索 Web アプリケーションの作成では、検索ページが皆さん独自のルック・アンド・フィールになるように作成します。図 1 に示されているとおり、標準的なカスタム検索 Web アプリケーションは、OmniFind 検索 REST API を使って、クライアントからのクエリー・ストリングを受け入れて、OmniFind 索引を検索します。検索入力フォームの提示方法と、検索結果の表示方法は、すべて顧客アプリケーションに委ねられます。カスタム Web アプリケーションに AJAX および DHTML を組み入れて、ユーザー・エクスペリエンスや UI の応答性をさらに向上したいと考える方もおられるでしょう。通常、カスタムの Web ベース検索アプリケーションは、J2EE アプリケーション・サーバーにデプロイされますが、このようなアプリケーションは、OmniFind REST API を使って OmniFind 検索サービスを活用します。この検索アプリケーションは、OmniFind サーバー・ノードに組み込まれている J2EE アプリケーション・サーバーとの対話を介して、OmniFind 検索サービスを利用します。


図 1. カスタム検索アプリケーション

現在、OmniFind でサポートされているデータ・ソースには、Web サイトおよびファイル・システムなどがあります。他のリポジトリーのデータに索引を付けるには、カスタム・クローラーを作成する必要があります。カスタム・クローラーは、そのようなリポジトリーから文書を取り出し、OmniFind 索引にプッシュします。たとえば、図 2 に示されているとおり、OmniFind 索引に対する E メールに索引を付けるには、カスタムの E メール・クローラーを作成したうえで、E メール・サーバーから E メールを抽出し、OmniFind 文書プッシュ API を使って OmniFind 索引にプッシュする必要があります。


図 2. カスタム・クローラー




上に戻る


Apache Jakarta Commons の HttpClient および ROME ライブラリーの使用

OmniFind REST API は標準の HTTP メソッドをベースにしているので、プログラミング環境で唯一必要なのは、HTTP GET/POST/DELETE 要求を発行する機能と、それに対する HTTP 応答を活用する機能だけです。基本的に、どのプラットフォームおよびプログラミング言語も HTTP プロトコルをサポートします。ただし、この記事では、Java™ プラットフォームのみを取り上げます。

Java プラットフォームには、さまざまなネットワーク・アプリケーションの作成時に利用できる java.net.* パッケージが用意されています。直接ソケット・レベルのインターフェースを使用しても、または、java.net パッケージ内のより高度な URLConnection および HttpURLConnection クラスを使用してもかまいません。ただし、決まりきった処理の作り直しを避け、サンプル・コードをさらにシンプルにするために、この例では HTTP 要求や HTTP 応答の処理に Apache Jakarta Commons の HttpClient ライブラリーを使用しています。以下に、Apache Jarkarta 共通 HTTP クライアント・ライブラリーが何を目指しているかを明確に述べている Apache HttpClient Web サイトの抜粋を示してあります。

「確かに、java.net パッケージが HTTP を通じたリソースへのアクセスを基本的にサポートしているのですが、多くのアプリケーションが必要とする広い柔軟性や機能を有していません。Jakarta Commons HTTP Client コンポーネントは、最新の HTTP 標準や HTTP 勧告を満たしたクライアントサイドの実装のある、効率的で最新かつ充実した機能のあるパッケージによって、この空白を埋めようと模索しています。」

使用するもう 1 つ別のオープン・ソースは ROME (Java 用の RSS および Atom ユーティリティー) です。この後の説明のとおり、OmniFind 検索 API は、HTML スニペットとデフォルトの Atom 1.0 フィード・フォーマットの 2 つの検索応答フォーマットをサポートします。ROME ライブラリーによって、他のいくつかのシンジケート・フィード・フォーマットどうしの間で Atom 1.0 フィードを簡単に利用できるようになります。それは、Java オブジェクトに対する生の XML ストリームのマッピングによって達成されます。これは、Java プログラム内で簡単に操作することができます。

これらのオープン・ソース・ライブラリーを足がかりとして、以下の説明では、短いサンプル・プログラムを示しながら、OmniFind REST API を掘り下げていきます。




上に戻る


OmniFind 検索 API の使用

OmniFind 検索 API には、HTTP GET メソッドを使ってアクセスします。サポートされている検索パラメーターは 8 種類あります。それらは、索引、クエリー・テキスト、問い合わせ言語、出力フォーマット、開始オフセット、結果言語フィルター、結果数、および出力結果をフォーマットする XSL スタイルシートへの完全修飾 URL です。これらのパラメーターの中で必須のパラメーターは、索引とクエリー・テキストのみです。その他のパラメーターに関しては、未指定にするとデフォルト値がとられます。サポートされている検索要求パラメーターの詳細は、「IBM OmniFind Yahoo! Edition Programming Guide and API reference」を参照してください。

以下のプログラムは、Apache HttpClient ライブラリーを使って検索要求を送信し、検索応答を取り出す単純な OmniFind 検索アプリケーションです。


リスト 1. 検索のサンプル・プログラム
                                
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;

/**
 * This is a simple search example against the OmniFind default index.
 * 
 * Steps as following; (1)construct HttpClient so that we can issue HTTP GET
 * request later (2) construct search URL with the OmniFind search REST endpoint
 * and any necessary parameters such as index and query parameters (3) construct
 * GetMethod with the search URL (4) execute the GetMethod and check HTTP status
 * (5) retrieve the search result
 */
public class SimpleSearch {
  
  // omnifind the REST end point URL for OmniFind search
  final static String targetSearchAPIEndpointURL = "http://localhost/api/search";
  
  public static void main(String[] args) throws UnsupportedEncodingException {
    // query string command line parameter
    String queryString = args[0];
    
    // construct HttpClient so that we issue HTTP GET request
    HttpClient client = new HttpClient();
    
    // construct search URL with the OmniFind search REST endpoint
    // and any necessary parameters such as index and query
    StringBuffer url = new StringBuffer();
    url.append(targetSearchAPIEndpointURL);
    url.append("?index=Default&");
    url.append("query=" + java.net.URLEncoder.encode(queryString, "UTF-8"));
    
    // construct GetMethod with the search URL
    HttpMethod method = new GetMethod(url.toString());
    try {
      // execute the GetMethod and check http response
      String responseBody = null;
      int status = client.executeMethod(method);
      if (status != HttpStatus.SC_OK) {
        System.err.println("SimpleSearch failed: " + method.getStatusLine());
        System.exit(status);
      }
      // retrieve the search result. By default it is in Atom 1.0 format
      responseBody = method.getResponseBodyAsString();
      // write out the response body
      System.out.println(responseBody);
    } catch (HttpException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      // clean up the connection resources
      method.releaseConnection();
    }
  }
}

このプログラムは、HttpClient オブジェクトと OmniFind 検索 URL を作成します。検索 URL には、必須の index と query の検索パラメーターのみが入っています。構成済みの URL を基に、GetMethod オブジェクトがインスタンス化されてメソッドが実行されます。実行後に HTTP 応答を抽出するための多様な手段が、GetMethod クラスによって提供されます。この場合、シンプルな getResponseBodyAsString メソッドを使用して、応答ストリング全体を取得します。ただし、ストリングではなく入力ストリームを返す他のメソッドも GetMethod クラスから提供されます。大容量の長い応答の場合、応答から得た入力ストリームを使用することをお勧めします。詳しくは、Apache HTTP Client v3.1.Beta Javadoc を参照してください。

プログラムの出力は、Atom 1.0 シンジケーション・フィード・フォーマットの XML ストリングで返されます。これは、"output" フォーマット・パラメーターを指定しなかった場合の結果です。Omnifind は、Atom 1.0 および HTML スニペットの、2 種類の検索結果フォーマットをサポートします。検索結果フォーマットは、"output" 検索パラメーターによって制御されます。指定がない限り、以下に示されているとおり、Atom 1.0 フォーマットがデフォルトになります。


リスト 2. Atom フォーマットのサンプル検索結果
                                <?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
        xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/">
        <title>Search results for query 'Axis' on index Default</title>
        <link
                href="http://localhost:8800/api/search?
                index=Default&amp;results=1&amp;query=Axis"
                rel="self" type="application/atom+xml" />
        <author>
                <name>IBM OmniFind Yahoo! Edition API Web Service</name>
        </author>
        <id>
                http://localhost:8800/api/search?index=Default&amp;
                results=1&amp;query=Axis
        </id>
        <category term="Default" label="Default" />
        <updated>2007-01-07T03:09:48Z</updated>
        <opensearch:totalResults>94</opensearch:totalResults>
        <opensearch:Query role="request" searchTerms="Axis" />
        <opensearch:startIndex>1</opensearch:startIndex>
        <opensearch:itemsPerPage>1</opensearch:itemsPerPage>
        <entry>
             <link
                href="http://www.javaworld.com/askTheExpert.jsp?
                pagename=http:%2F%2Fwww.javaworld.com%2Fjavaworld%2Fjw-02-2006%2F
                jw-0220-axis.html&amp;pagename=%2Fjavaworld%2Fjw-02-2006%2F
                jw-0220-axis.html&amp;pageurl=%2Fjavaworld%2Fjw-02-2006%2F
                jw-0220-axis.html&amp;pubsite=j"
                rel="alternate" type="text/html" 
                hreflang="en" />
             <link
                href="http://192.168.0.100:8800/search/?query=cache::http%3A%2F%2F
                www.javaworld.com%2FaskTheExpert.jsp%3Fpagename%3Dhttp%3A%252F%252F
                www.javaworld.com%252Fjavaworld%252Fjw-02-2006%252Fjw-0220-axis.html%26
                pagename%3D%252Fjavaworld%252Fjw-02-2006%252Fjw-0220-axis.html%26
                pageurl%3D%252Fjavaworld%252Fjw-02-2006%252F
                jw-0220-axis.html%26pubsite%3Dj&amp;output=binary"
                rel="via" type="text/html" 
                hreflang="en" />
             <opensearch:relevance>1.55</opensearch:relevance>
             <title type="html">Feedback Form</title>
             <updated>2007-01-06T14:56:04Z</updated>
             <id>
                http://www.javaworld.com/askTheExpert.jsp?pagename=http:%2F%2F
                www.javaworld.com%2Fjavaworld%2Fjw-02-2006%2F
                jw-0220-axis.html&amp;pagename=%2Fjavaworld%2Fjw-02-2006%2F
                jw-0220-axis.html&amp;pageurl=%2Fjavaworld%2Fjw-02-2006%2F
                jw-0220-axis.html&amp;pubsite=j
             </id>
             <summary type="html">
                &lt;SPAN class=&quot;ellipsis&quot;&gt;...
                &lt;/SPAN&gt;Feedback. Tell us your thoughts on this article
                or the issues raised in it. We&apos;ll cc: the author
                &lt;SPAN class=&quot;ellipsis&quot;&gt;
                ... &lt;/SPAN&gt;
             </summary>
       </entry>
</feed>

任意の XML パーサーを使用して、Atom 1.0 の検索応答をプログラムによって利用することができます。残念なことに、その作業はかなり長い退屈な工程です。しかし幸いにも、ROME というオープン・ソース・ライブラリーがあります。これにより、他の多くのシンジケーション・フィード・フォーマットよりも簡単に Atom 1.0 を利用することができます。基本的に、ROME を使用するのは、任意の RSS または Atom フィードを解析して、正規の bean インターフェース SyndFeed にするためです。このようにすれば、開発者は直接 XML のストリングを処理するのではなく、Java オブジェクトを処理することができます。

以下のコード・スニペットは、ROME の使用によって検索応答ストリームを利用する方法を示しています。この場合、最初の "/feed/entry/link" 要素を検索応答ストリームから抽出してコンソールに表示します。そのためには、SyndFeedInput インスタンスを作成し、検索応答ストリームに取り込みます。SyndFeedInput は、SyndFeed オブジェクト・インスタンスを返すので、必要な情報にアクセスできるようになります。OmniFind Atom 1.0 要素の詳細は、「IBM OmniFind Yahoo! Edition Programming Guide and API reference」を参照してください。


リスト 3. ROME 解析を使ったサンプル検索
                                
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;

/**
 * This is a simple search example against an OmniFind default index. For this
 * program, we are parsing the search results with ROME library to extract feed
 * entries.
 * 
 * Steps as following; (1)construct HttpClient so that we can issue HTTP GET
 * request later (2) construct search URL with the OmniFind search REST endpoint
 * and any necessary parameters such as index and query parameters (3) construct
 * GetMethod with the search URL (4) execute the GetMethod and check HTTP status
 * (5) retrieve the search result (6) convert the search result in ATOM to a
 * SyndFeed using ROME library (7) extract feed entries
 */
public class SimpleSearchWithParsing {
  
  // omnifind the REST end point URL for OmniFind search
  final static String targetSearchAPIEndpointURL = "http://localhost/api/search";
  
  public static void main(String[] args) throws UnsupportedEncodingException {
    // query string command line parameter
    String queryString = args[0];
    
    // construct HttpClient so that we issue HTTP GET request
    HttpClient client = new HttpClient();
    
    // construct search URL with the OmniFind search REST endpoint and any
    // necessary parameters such as index and query parameters
    StringBuffer url = new StringBuffer();
    url.append(targetSearchAPIEndpointURL);
    url.append("?index=Default&");
    url.append("results=1&");
    url.append("query=" + java.net.URLEncoder.encode(queryString, "UTF-8"));
    
    // construct GetMethod with the search REST end point URL
    HttpMethod method = new GetMethod(url.toString());
    try {
      // execute the GetMethod and check http status
      int status = client.executeMethod(method);
      if (status != HttpStatus.SC_OK) {
        System.err.println("SimpleSearchWithParsing failed: "
            + method.getStatusLine());
        System.exit(status);
      }
      
      // retrieve the search result
      // convert the search result in ATOM to a SyndFeed using ROME
      // library
      SyndFeedInput input = new SyndFeedInput();
      SyndFeed feed = input.build(new XmlReader(method
          .getResponseBodyAsStream()));
      
      // extract feed entries
      List list = feed.getEntries();
      for (Iterator iter = list.iterator(); iter.hasNext();) {
        SyndEntry entry = (SyndEntry) iter.next();
        System.out.println(entry.getLink());
      }
    } catch (HttpException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } catch (FeedException e) {
      e.printStackTrace();
    } finally {
      // clean up the connection resources
      method.releaseConnection();
    }
  }
}

上述の 2 つのプログラムで示したとおり、検索要求の発行と応答の利用は非常に簡単に行うことができます。なぜなら、API は標準の HTTP メソッドをベースにしているからです。利用可能なオープン・ソース Java ライブラリーは多数あるので、OmniFind 検索関数のアクセスはさらに簡単になります。

すでに簡単に述べたとおり、OmniFind は 2 つの検索応答フォーマットをサポートします。デフォルトの Atom 1.0 フィード・フォーマットに加えて、OmniFind は検索応答を HTML スニペットで返すこともできます。単に “output”検索パラメーターを追加し、その値を “htmlsnippet” と設定するだけで、検索応答は HTML スニペットで返されます。リスト 4 は、HTML スニペットのサンプル出力を示しています。HTML スニペットには、検索応答リストを表すカスケード・スタイルおよび HTML 要素が入っています。


リスト 4. HTML スニペットのサンプル検索応答
                                <link rel="stylesheet" type="text/css" href="styles/nuvo.css">
   <style>
   body { 
  font-family: Verdana; 
  font-size: 12px; 
  background-repeat: no-repeat; 
  background-color: white; 
} 
.background { 
  background-repeat: no-repeat; 
} 
…
.resultFooterHtmlCachedLink { 
  font-family: Arial; 
  color: #8284cc; 
} 
.resultFooterOriginalCachedLink { 
  font-family: Arial; 
  color: #8284cc; 
} 
 
</style>
<div id=yschres>
    <div id=yschcont style="margin-left:0px;">
         <div id=yschpri style="margin-left:5px;">
            <div id=yschrel>
            </div>
            <div id=yschweb>
               <ol start=1>    
                     <li>            
                       <div>
                             <a class="yschttl" style="
                             font-family: Arial; color: #0000de; " 
                             href="http://www.javaworld.com/
                             askTheExpert.jsp?pagename=http:%2F%2F
                             www.javaworld.com%2F
                             javaworld%2Fjw-02-2006%2F
                             jw-0220-axis.html&amp;pagename=%2F
                             javaworld%2Fjw-02-2006%2F
                             jw-0220-axis.html&amp;pageurl=%2F
                             javaworld%2F
                             jw-02-2006%2Fjw-0220-axis.html&amp;pubsite=j">
                             Feedback Form</a>
                             </div>
                       <div class=yschabstr style="font-family: Arial; 
                            color: black; ">               
                             <SPAN class="ellipsis">... </SPAN>
                             Feedback.  Tell us your thoughts on this article or 
                             the issues raised in it. We'll cc: the 
                             author <SPAN class="
                             ellipsis">... </SPAN></div>
                       <em class=yschurl  style="font-family: 
                       Arial; color: #088000; " >
                          http://www.javaworld.com/askTheExpert.jsp?pagename=http:%2F%2F
                          www.javaworld.com%2Fjavaworld%2Fjw-02-2006%2F
                          jw-0220-<SPAN class="
                          highlight"><SPAN class="
                          hlTerm0">axis</SPAN></SPAN>.html&amp;
                          pagename=%2Fjavaworld%2Fjw-02-2006%2Fjw-0220-<SPAN class="
                          highlight"><SPAN class="
                          hlTerm0">axis</SPAN></SPAN>.html&amp;
                          pageurl=%2Fjavaworld%2Fjw-02-2006%2Fjw-0220-<SPAN 
                          class="highlight"><SPAN class="
                          hlTerm0">axis</SPAN></SPAN>.html&amp;
                          pubsite=j </em> 
                              - 
                 </ol>   
             </div>   
         </div>
      </div>
   </div>

エンド・ユーザー向けに検索結果を実際にレンダリングする J2EE Web アプリケーションにとっては、HTML スニペットの出力フォーマットのほうが適しています。DHTML を使用して、返された HTML スニペットを検索結果ページに動的に挿入することができます。プログラムによるアクセスに対しては、デフォルトの Atom フィード・フォーマットのほうが適しています。

Atom フィード・フォーマットに関して言えば、”stylesheet” という別の検索パラメーターを使用することもできます。このパラメーターを指定する場合、このパラメーターは出力結果をフォーマットする XSL スタイルシートの完全修飾 URL でなければなりません。このパラメーターが有効であるのは、”output” 検索パラメーターの値が “atomxml” の場合のみです。

XSL スタイルシートをパラメーターとして指定した場合、これは OmniFind 検索エンジンでは処理されないことに注意してください。実際の変換は、クライアント・アプリケーションによって行われます。このアプリケーションは、XSL 対応の Web ブラウザーまたはカスタムの XSLT アプリケーションのどちらでも構いません。OmniFind 検索結果の XSLT 変換に関する詳細は、「Add IBM Omnifind Yahoo! Edition to your Web site」(developerWorks、2006年12月) を参照してください。




上に戻る


文書の追加時の文書プッシュ API の使用

文書を追加するには、OmniFind 文書 API を使用します。検索 API と同様にこの API も、標準の HTTP メソッドをベースにしています。ただし、検索 API との相違点として、文書プッシュ API には HTTP POST メソッドからアクセスすることができます。検索とは違って、文書 API へのアクセスでは、OmniFind 管理者コンソールから API パスワードを要求されます (図 3 を参照)。API パスワードを入手するには、管理者コンソールで「Manage System (システムの管理)」-> 「Manage Authentication (認証の管理)」メニューをクリックします。


図 3. API パスワード

以下のプログラムは、デフォルトの Omnifind 索引に PDF 文書を追加する単純な OmniFind 文書プッシュ・クライアントです。Apache HttpClient ライブラリーを使用して、HTTP POST メソッド PostMethod を発行します。文書 API では API パスワードが必要なので、API パスワードを使った HTTP 基本認証が使用されます。基本認証のユーザー ID は、使用されずに無視されます。したがって、任意の値にすることができます。

文書プッシュ API は 7 種類のパラメーターをサポートします。それには、アクション・パラメーター、索引、文書タイプ (docType)、文書コンテンツ・フォールバック言語、文書コンテンツ既知言語、文書 ID (docId)、および最終変更日付があります。その中で、アクション、索引、docType、および docID パラメーターは、必須パラメーターです。これを指定しないと、他のパラメーターは、「IBM OmniFind Yahoo! Edition Programming Guide and API reference」に指定されているデフォルト値をそのままとります。


リスト 5. 文書プッシュのサンプル・プログラム
                                
import java.io.File;
import java.io.IOException;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.FileRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;

/**
 * This is a document push example.
 * 
 * Steps as following; (1)construct HttpClient so that we can issue HTTP POST
 * request later (2) set the credential using OmniFind API password (2)
 * construct a PostMethod and set necessary request headers (4) set the request
 * entity with the file content to be indexed (5) execute the PostMethod and
 * check HTTP status (6) check an error
 */
public class PushPDFDocument {
  
  // omnifind the REST end point URL for document push
  final static String targetDocumentAPIEndpointURL = "http://localhost/api/document";
  
  public static void main(String[] args) {
    
    // construct HttpClient so that we issue HTTP POST request
    HttpClient client = new HttpClient();
    
    // set the credential using OmniFind API password
    client.getState().setCredentials(new AuthScope("localhost", 80),
        new UsernamePasswordCredentials("notused", "+UrSlFg="));
    
    // construct a PostMethod and set necessary request headers
    PostMethod method = new PostMethod(targetDocumentAPIEndpointURL);
    method.setDoAuthentication(true);
    method.setRequestHeader("action", "addDocument");
    method.setRequestHeader("index", "Default");
    method.setRequestHeader("docId", "pdfrepository://oye_api_guide_v84.pdf");
    method.setRequestHeader("docType", "application/pdf");
    
    try {
      // set the request entity with the file content to be indexed
      File input = new File("oye_api_guide_v84.pdf");
      RequestEntity entity = new FileRequestEntity(input, "application/pdf");
      method.setRequestEntity(entity);
      
      // execute the post method and check HTTP status
      int status = client.executeMethod(method);
      if (status != HttpStatus.SC_OK) {
        System.err.println("PushPDFDocument failed: " + method.getStatusLine());
        System.exit(status);
      }
      
      // Note on the response from a document API call. The HTTP response
      // code is always 200, with the exception of 401 for failed
      // authentication. If an error occurs during the document insert
      // process, the HTTP response code is still 200 and the HTTP
      // response header contains a parameter of "hasError". 
      // Therefore, to do the proper handling of the document push result,
      // you must check for the existence of the "hasError" response
      // header or the HTTP 401 response code.
      Header hasErrorHeader = method.getResponseHeader("hasError");
      if (hasErrorHeader == null) {
        System.out.println("document pushed fine.");
      } else {
        String errorResponse = method.getResponseBodyAsString();
        System.out.println("error response: " + errorResponse);
      }
    } catch (HttpException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      // clean up the connection resources
      method.releaseConnection();
    }
  }
}

PDF 文書を追加するためにプログラムは HttpClient オブジェクトを作成し、setCredentials() メソッドを呼び出して、HTTP 基本認証におけるユーザー ID/パスワードの資格情報を設定します。文書追加アクションに必要なパラメーターは、HTTP 要求ヘッダーとして渡されます。最後に、PostMethod オブジェクトがインスタンス化されて実行されます。PostMethod の実行の前に、実際の PDF ファイルが、PostMethod の HTTP POST 本体として設定されます。

文書プッシュ API 呼び出しからの応答では、HTTP 応答コードは常に 200 であることに注意してください。ただし例外として、認証が失敗した場合は 401 になります。文書の挿入プロセス中にエラーが発生しても、応答コードはやはり 200 になり、HTTP 応答ヘッダーには “hasError” というパラメーターが入ります。したがって、文書プッシュ結果を適切に処理するには、hasError 応答ヘッダーまたは HTTP 401 応答コードがあるかどうかを調べる必要があります。

前のプログラムでは文書 ID は任意設定でしたが、それは望ましい習慣ではありません。なぜなら、検索後に元の文書の取り出しができないからです。docID 値が有効な URL でない場合、検索結果ページ上でその文書をクリックできなくなります。たとえば上記のプログラムを実行した後、追加したばかりの文書を検索したとします。検索ページには "pdfrepository://oye_api_guide_v84.pdf" リンクが表示されます。この docID は有効な URL ではないので、クリックするとエラー・ページが表示されます。ただし、キャッシュされたリンクをクリックすれば、元の文書を表示することはできます。皆さんのプログラムでは、元の文書を確実に取り出せるようにするには、有効な URL を使って docID を設定する必要があります。


図 4. クリックできないリンク

OmniFind の文書プッシュ API を介した文書の追加に関しては注意事項があります。プログラミング・ガイドによれば、「addDocument API を使って索引に追加した文書は、管理コンソール上の「Document Status (文書の状況)」ウィンドウでは追跡できません」とのことです。




上に戻る


文書の削除時の文書 API の使用

文書を削除するには、OmniFind 文書 API を使用します。検索 API と同様にこの API も、標準の HTTP メソッドをベースにしています。ただし、検索 API との相違点として、文書削除 API には HTTP DELETE メソッドからアクセスすることができます。図 3 に示されているとおり、文書削除アクションでは、OmniFind 管理者コンソールで API パスワードを要求されます。

デフォルトの OmniFind 索引から PDF 文書を削除する単純なプログラムを以下に示してあります。検索プログラムの場合と同様に、Apache HttpClient ライブラリーを使用して HTTP メソッドを発行します。ここでは、GetMethod の代わりに、Apache HttpClient ライブラリーの DeleteMethod を使用します。文書 API では API パスワードが必要なので、API パスワードを使った HTTP 基本認証が使用されます。基本認証のユーザー ID は、使用されずに無視されるため、任意の値にすることができます。

文書削除 API には、アクション・パラメーター、索引、および文書 ID (docId)、の 3 つのパラメーターが必要です。アクション・パラメーターの値は “deleteDocument” でなければなりません。索引パラメーターの値は “Default” でなければなりません。docID は、Default 索引から削除する特定の文書を一意に識別しなければなりません。指定した docID が索引で見つかなかった場合、警告として取り扱われて、削除 API からエラーは返されません。


リスト 6. 文書削除のサンプル・プログラム
                                
import java.io.IOException;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.DeleteMethod;

/**
 * This is a document delete example.
 * 
 * Steps as following; (1)construct HttpClient so that we can issue HTTP DELETE
 * request later (2) set the credential using OmniFind API password (2)
 * construct a DeleteMethod and set necessary request headers (4) execute the
 * DeleteMethod and check HTTP status (5) check an error
 */

public class DeletePDFDocument {
  
  // omnifind the REST end point URL for document push
  final static String targetDocumentAPIEndpointURL = "http://localhost/api/document";
  
  public static void main(String[] args) throws HttpException, IOException {
    
    // construct HttpClient so that we issue HTTP POST request
    HttpClient client = new HttpClient();
    
    // set the credential using OmniFind API password
    client.getState().setCredentials(new AuthScope("localhost", 80),
        new UsernamePasswordCredentials("notused", "+UrSlFg="));
    
    // construct a DeleteMethod and set necessary request headers
    DeleteMethod method = new DeleteMethod(targetDocumentAPIEndpointURL);
    method.setDoAuthentication(true);
    method.setRequestHeader("action", "deleteDocument");
    method.setRequestHeader("index", "Default");
    // the docId of the document to be deleted
    method.setRequestHeader("docId", "pdfrepository://oye_api_guide_v84.pdf");
    
    try {
      // execute the delete method
      int status = client.executeMethod(method);
      if (status != HttpStatus.SC_OK) {
        System.err.println("DeletePDFDocument failed: "
            + method.getStatusLine());
        System.exit(status);
      }
      
      // Note on the response from a document API call. The HTTP response
      // code is always 200, with the exception of 401 for failed
      // authentication. If an error occurs during the document insert
      // process, the HTTP response code is still 200 and the HTTP
      // response header contains a parameter of "hasError". 
      // Therefore, to do the proper handling of the document push result, 
      // you must check for the existence of the "hasError" response 
      // header or the HTTP 401 response code.
      Header hasErrorHeader = method.getResponseHeader("hasError");
      if (hasErrorHeader == null) {
        System.out.println("document deleted.");
      } else {
        String errorResponse = method.getResponseBodyAsString();
        System.out.println("error response: " + errorResponse);
      }
    } finally {
      // clean up the connection resources
      method.releaseConnection();
    }
  }
}

注: 文書を削除しても、その文書がその後検索不能になるとは限りません。プログラミング・ガイドによれば、「どのくらい時間が経過すれば文書が検索不能になるかは、削除要求が発行された時点の検索サーバーの負荷によって異なります」とのことです。




上に戻る


まとめ

この記事では、OmniFind の検索機能および文書機能を活用するシンプルなプログラムをいくつかご紹介しました。OmniFind API は標準 HTTP メソッドをベースにしており、しかも利用できるオープン・ソースのライブラリーやツールが多数あるので、OmniFind の各種機能へのアクセスにはそれほど手間はかかりません。HTTP GET/POST/DELETE メソッドの処理では、Apache HttpClient ライブラリーを使用しました。オープン・ソース ROME ライブラリーを活用できるので、Atom フィード・フォーマットの検索結果は、数行のコードを使って利用することができました。OmniFind Yahoo! Edition をダウンロードし、これらの技法を使って皆さんのカスタム・アプリケーションを拡張してみてください。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
Sample programs for this articleofsamples.zip980KBHTTP
ダウンロード形式について


参考文献

学ぶために

製品や技術を入手するために
  • IBM Apache HTTP Client v3.1.Betaをダウンロードしてください。

  • ROMEをダウンロードしてください。これは、オープン・ソース・ライブラリーであり、RSS 0.90、RSS 0.91 Netscape、RSS 0.91 Userland、RSS 0.92、RSS 0.93、RSS 0.94、RSS 1.0、RSS 2.0、Atom 0.3、および Atom 1.0 などのたいていのシンジケート・フォーマットを使った Java での作業で、OmniFind REST API に関する詳細を見つけ出すのに役立ちます。

  • IBM OmniFind Yahoo! editionをダウンロードしてください。

  • 次期開発プロジェクトの構築に、developerWorks から直接ダウンロードできるIBM の試用版ソフトウェアをご利用ください。


議論するために


著者について

Arthur Choi は現在、IBM 情報管理部の Content Management & Discovery Center of Excellence 部門のテクニカル営業コンサルタントとして活躍しています。彼は、IBM 社の顧客に対して、その社内コンピューティング環境に IBM エンタープライズ検索ソリューションをデプロイするサービスの提供に携わっています。また以前は、Lotus Extended Search および WebSphere Enterprise Search の各種製品を含め、さまざまなエンタープライズ検索関連プロジェクトに取り組んでいました。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



はいいいえわからない
 


 


12345
不充分・不完全である大変素晴らしい
 


この記事を共有する

はてなブックマーク はてなブックマーク livedoorクリップ livedoorクリップ del.icio.us del.icio.us Buzzurl(バザール) Buzzurl(バザール) Choix! Choix!
Saafブックマーク Saafブックマーク FC2ブックマーク FC2ブックマーク MM/memo MM/memo ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
CZブックマーク CZブックマーク newsing newsing




上に戻る


    日本IBMについて プライバシー お問い合わせ