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

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

作成:2012-06-02 15:11
更新:2012-06-02 15:11

■Documentを使ってコンテンツを保管する

では、実際にDocumentを使ってテキストをGAEサーバーに保管するサンプルを作ってみましょう。ここでは、GAEのプロジェクトでデフォルトで作成されるhelo.jspMyGaeAppServletサーブレットの2つで作成をしてみます。

ここでは、helo.jspに「タイトル」と「コンテンツ」の項目からなるフォームを用意しておきました。ここに適当にテキストを書いて送信すると、それがDocumentとして保存されます。

さて、ソースコードを見てみましょう。ここではdoPostに送信されたら、modeの値によって処理を分けるようにしてあります。この例では、modecreateだったらcreateDocumentメソッドを呼び出すようにしてあります。

今回は、Document.Builderに3つのFieldを用意しています。title、content、datetimeといった名前のフィールドです。これらに、送信されたテキストと現在のDateを設定しています。既に説明した手順を見ながらコードを読んでいけば、やっていることはだいたいわかるでしょう。


■メソッドチェーンの利用

それにしても、たかがDocumentを作って保存するのに、ずいぶんと長い処理が必要となることがわかりますね。もう少し、何とかならないか?と思う人も多いでしょう。

実をいえば、Document.BuilderField.Builderに用意されているメソッド類は、自分自身を返すように設計されているものが大半なのです。これを利用し、メソッドの呼び出しをどんどんつなげて書く、いわゆる「メソッドチェーン」を利用することができます。

例えば、下のリストにあるcreateDocumentメソッドを、メソッドチェーンで書きなおしてみるとこんな具合になります。
public void createDocument(String title,String content){
    Document document = Document.newBuilder()
        .addField(Field.newBuilder()
            .setName("title")
            .setText(title))
        .addField(Field.newBuilder()
            .setName("content")
            .setText(content))
        .addField(Field.newBuilder()
            .setName("datetime")
            .setDate(Field.date(Calendar.
                getInstance().getTime()))
    ).build();
    
    Index INDEX = SearchServiceFactory.getSearchService()
        .getIndex(IndexSpec.newBuilder()
            .setName("mydataIndex"));

    try {
        INDEX.add(document);
        session.setAttribute("message", "ドキュメントを保存しました。");
    } catch (RuntimeException e) {
        session.setAttribute("message", "保存に失敗しました。");
    }
}
いかがですか。だいぶすっきりとした感じになるでしょう? こちらの書き方のほうがずっとわかりやすいので、こっちが基本と考えたほうがよいかも知れませんね。

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

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

●プログラム・リスト●

※MyGaeAppServlet.java

package com.tuyano.libro.mygaeapp;

import java.io.*;
import java.util.*;
import java.util.logging.*;

import javax.servlet.http.*;

import com.google.appengine.api.search.*;
import com.google.appengine.api.search.IndexSpec.Builder;

@SuppressWarnings("serial")
public class MyGaeAppServlet extends HttpServlet {	
	private HttpSession session = null;
	
	public void doGet(HttpServletRequest request, 
			HttpServletResponse response)
			throws IOException {
		……略(後で作成)……
	}
	
	public void doPost(HttpServletRequest request, 
			HttpServletResponse response)
			throws IOException {
		response.setContentType("text/html");
		request.setCharacterEncoding("utf8");
		response.setCharacterEncoding("utf8");
		session = request.getSession();
		session.setAttribute("message", null);
		String param = request.getParameter("mode");
		if ("create".equals(param)){
			String title = request.getParameter("title");
			String content = request.getParameter("content");
			this.createDocument(title, content);
		}
		response.sendRedirect("/helo.jsp");
	}

	public void createDocument(String title,String content){
		Document.Builder builder = Document.newBuilder();
		
		Field.Builder field1_builder = Field.newBuilder();
		field1_builder.setName("title");
		field1_builder.setText(title);
		builder.addField(field1_builder);
		
		Field.Builder field2_builder = Field.newBuilder();
		field2_builder.setName("content");
		field2_builder.setText(content);
		builder.addField(field2_builder);
		
		Field.Builder field3_builder = Field.newBuilder();
		field3_builder.setName("datetime");
		Date date = Calendar.getInstance().getTime();
		field3_builder.setDate(Field.date(date));
		builder.addField(field3_builder);
		
		Document document = builder.build();
		
		IndexSpec.Builder spec = IndexSpec.newBuilder();
		spec.setName("mydataIndex");
		SearchService service = SearchServiceFactory.getSearchService();
		Index index = service.getIndex(spec);

		try {
			index.add(document);
			session.setAttribute("message", "ドキュメントを保存しました。");
		} catch (RuntimeException e) {
			session.setAttribute("message", "保存に失敗しました。");
		}
	}
	
}


※helo.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
		pageEncoding="utf-8"%>
<%@ page import="java.util.ArrayList" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Sample jsp</title>
<style>
h1{
	font-size: 16pt;
	background: #AAFFAA;
	padding: 5px;
}
table tr td {
	background: #DDFFDD;
	padding: 2px;
}
</style>
</head>
<body>
	<h1>Hello App Engine!</h1>
	<hr>
	<p id="msg"><%=session.getAttribute("message") %></p>
	<form method="post" action="/mygaeapp">
	<table>
		<tr>
			<td>モード</td>
			<td><select id="mode" name="mode">
				<option value="create">データを作成</option>
				<option value="find">データを検索</option>
			</select></td>
		</tr>
		<tr>
			<td>タイトル</td>
			<td><input type="text" id="title" name="title"
				size="40"></td>
		</tr>
		<tr>
			<td>コンテンツ</td>
			<td><textarea id="content" name="content"
				cols="40" rows="5"></textarea></td>
		</tr>
		<tr>
			<td></td>
			<td>
				<input type="submit" value="送信する">
			</td>
		</tr>
	</table>
	</form>
	<hr>
	<%=session.getAttribute("result") %>
</body>
</html>

※関連コンテンツ

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