Search Serviceによる全文検索 (3/7)
作成:2012-06-02 15:11
更新:2012-06-02 15:11
更新:2012-06-02 15:11
■Documentを使ってコンテンツを保管する
では、実際にDocumentを使ってテキストをGAEサーバーに保管するサンプルを作ってみましょう。ここでは、GAEのプロジェクトでデフォルトで作成されるhelo.jspとMyGaeAppServletサーブレットの2つで作成をしてみます。
ここでは、helo.jspに「タイトル」と「コンテンツ」の項目からなるフォームを用意しておきました。ここに適当にテキストを書いて送信すると、それがDocumentとして保存されます。
さて、ソースコードを見てみましょう。ここではdoPostに送信されたら、modeの値によって処理を分けるようにしてあります。この例では、modeがcreateだったらcreateDocumentメソッドを呼び出すようにしてあります。
今回は、Document.Builderに3つのFieldを用意しています。title、content、datetimeといった名前のフィールドです。これらに、送信されたテキストと現在のDateを設定しています。既に説明した手順を見ながらコードを読んでいけば、やっていることはだいたいわかるでしょう。
それにしても、たかがDocumentを作って保存するのに、ずいぶんと長い処理が必要となることがわかりますね。もう少し、何とかならないか?と思う人も多いでしょう。
実をいえば、Document.BuilderやField.Builderに用意されているメソッド類は、自分自身を返すように設計されているものが大半なのです。これを利用し、メソッドの呼び出しをどんどんつなげて書く、いわゆる「メソッドチェーン」を利用することができます。
例えば、下のリストにあるcreateDocumentメソッドを、メソッドチェーンで書きなおしてみるとこんな具合になります。
ここでは、helo.jspに「タイトル」と「コンテンツ」の項目からなるフォームを用意しておきました。ここに適当にテキストを書いて送信すると、それがDocumentとして保存されます。
さて、ソースコードを見てみましょう。ここではdoPostに送信されたら、modeの値によって処理を分けるようにしてあります。この例では、modeがcreateだったらcreateDocumentメソッドを呼び出すようにしてあります。
今回は、Document.Builderに3つのFieldを用意しています。title、content、datetimeといった名前のフィールドです。これらに、送信されたテキストと現在のDateを設定しています。既に説明した手順を見ながらコードを読んでいけば、やっていることはだいたいわかるでしょう。
■メソッドチェーンの利用
それにしても、たかがDocumentを作って保存するのに、ずいぶんと長い処理が必要となることがわかりますね。もう少し、何とかならないか?と思う人も多いでしょう。
実をいえば、Document.BuilderやField.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", "保存に失敗しました。");
}
}いかがですか。だいぶすっきりとした感じになるでしょう? こちらの書き方のほうがずっとわかりやすいので、こっちが基本と考えたほうがよいかも知れませんね。(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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)プログラミング入門」に戻る