libro
www.tuyano.com
Google App Engine for Java(GAE/J)プログラミング入門

Search Serviceによる全文検索 (6/7)

作成:2012-06-02 15:22
更新:2012-06-02 15:28

■searchで検索したResultsを処理する

さて、Documentの検索は、「search」メソッドで行う、といいましたね。これは以下のように実行します。
Results 変数 = 《Index》
      .search(《Query》);

既にIndexQueryの用意の仕方はわかりましたから、検索そのものはこれで行えます。あと、必要となるのは、「結果として得られたResultsの処理」でしょう。searchで取得されるResultsは、正確には以下のようなものになります。
Results<ScoredDocument> results;

Resultsは、Iterableインターフェイスを実装したコレクションフレームワークの一種です。searchで得られるのは、ScoredDocumentというクラスのインスタンスが中にまとめられたインスタンスです。ScoredDocumentというのはDocumentのサブクラスで、検索して得られたDocumentはこのインスタンスとして取得されます。

Iterableですから、得られたResultsforなどを使って処理することができます。
for (ScoredDocument 変数 : 《Results》) { ……略…… }
このようにして順番に検索されたScoredDocumentを取得し処理していきます。ScoredDocumentには、保管されている情報を取得するためのメソッド類が要されています。

・IDを取り出す
String 変数 = 《Document》.getId();
保管されているDocumentには自動的にIDが割り振られています。これを取得するためのものです。

・指定のフィールドを取り出す
Iterable 変数 =  《Document》.getField( 名前 );
Field 変数 = 《Document》.getOnlyField( 名前 );
Documentに保管されているフィールドの取得はこれらのメソッドで行えます。getFieldは、指定した名前のFieldをすべてIterableにまとめたものを返します。getOnlyFieldは、指定した名前のFieldから最初の1つだけを返します。通常、指定した名前のフィールドが1種類しかないなら、getOnlyFieldでいいでしょう。

・Fieldから値を取り出す
String 変数 = 《Field》.getName();
String 変数 = 《Field》.getText();
String 変数 = 《Field》.getHTML();
String 変数 = 《Field》.getAtom();
Double 変数 = 《Field》.getNumber();
Date 変数 = 《Field》.getDate();
FieldType 変数 = 《Field》.getFieldType();
Fieldには、そのフィールドに保管されている値を取り出すためのメソッドが多数揃っています。Fieldインスタンスを作成するとき、Field.Builderにさまざまな値を設定するためのメソッドが用意されていましたが、それらがそのまま値を取り出すものとしても用意されているわけです。これらのメソッドで、保管されている値を取り出し処理していきます。くれぐれも、そのフィールドに保管されている値の種類にあったメソッドを呼び出すように注意してください。


――これでようやく「すべてのDocumentを取得し、保管されている値を取り出す」ということができるようになりました。サンプルとして、簡単な利用例をあげておきましょう。MyGaeAppServletサーブレットクラスに、下のリスト欄のメソッド2つを追記してください(doGetは置き換える形で)。

ここでは、doGetからgetAllDocumentを呼び出し、このメソッド内で全Documentの値を<table>にまとめたものを作成してセッション変数resultに設定しています。後は、フォワードされるhelo.jspで、この値を出力すれば、保管された全データが表示されるようになります。

見ればわかるように、Queryを作成する部分はメソッドチェーンで一続きに記述してあります。Searchは細々としたクラスやメソッドが山ほど登場しますが、基本的にこうしたメソッドチェーンが利用できるので、思ったほど複雑怪奇なものにはならずに済みます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※MyGaeAppServletクラスに用意するメソッド

public void doGet(HttpServletRequest request, 
		HttpServletResponse response)
		throws IOException {
	response.setContentType("text/html");
	request.setCharacterEncoding("utf8");
	response.setCharacterEncoding("utf8");
	session = request.getSession();
	this.getAllDocument();
	try {
		this.getServletContext()
			.getRequestDispatcher("/helo.jsp")
			.forward(request, response);
	} catch (ServletException e) {
		e.printStackTrace();
	}
}

public void getAllDocument() {
	Index index = SearchServiceFactory.getSearchService()
		.getIndex(IndexSpec.newBuilder()
			.setName("mydataIndex"));
	try {
		Query query = Query.newBuilder()
			.setOptions(QueryOptions
				.newBuilder()
				.setLimit(10)
				.setSortOptions(SortOptions.newBuilder()
					.addSortExpression(SortExpression.newBuilder()
						.setExpression("title")
						.setDefaultValue("")
						.setDirection(SortDirection.ASCENDING)))
			.build()).build("");

		Results<ScoredDocument> results = index.search(query);

		String result = "<table width=\"700\">";
		for (ScoredDocument document : results) {
			String id = document.getId();
			String title = document.getOnlyField("title")
				.getText();
			String content = document.getOnlyField("content")
					.getText();
			Date date = document.getOnlyField("datetime")
					.getDate();
			result += "<tr><td>" + id + "</td><td>" + title + "</td><td>" + 
				content  + "</td><td>" + date  + "</td></tr>";
		}
		result += "</table>";
		session.setAttribute("result",result);
		session.setAttribute("message", "全ドキュメントを取得しました。");
	} catch (SearchException e) {
		session.setAttribute("message", "検索に失敗しました。");
	}
}

※関連コンテンツ

「Google App Engine for Java(GAE/J)プログラミング入門」に戻る