*

Search API詳細解説 Part2「Search APIの使い方 登録・削除編」

公開日: : 最終更新日:2015/04/17 投稿者: GAE

Search API詳細解説シリーズ

タイトル
Part1 Search API 概要説明
Part2 Search APIの使い方 登録・削除編(このページです)
Part3 Search APIの使い方 検索編
Part4 Search API 詳細 検索性能編
Part5 Search API 詳細 反映速度編
Part6 Search API 詳細 限界値編

みなさん、こんにちは。
Search API詳細解説 Part1ではSearch APIの概要を説明しました。
ざっとでしたが、検索に特化したServiceであることは分かっていただけたかと思います。
今回はPart2として実際に使ってみる所を「Search APIの使い方 登録・削除編」と題して説明します。

1. Documentの登録

Search APIのデータは、大きく分けてIndex、Document、Fieldの3要素で構成されて
います。
Part1のおさらいになりますが、この3要素はDatastoreで言うところの、Kind、Entity、
Propertyにそれぞれ相当します。Google Developers Console (14)

IndexはDocumentの集まりで、DocumentはいくつかのFieldを持つことができます。
Index、Field、Documentの作成にはそれぞれBuilderを使うので、実装者はオブジェクトの作成過程を極力意識すること無く、オブジェクトを作成することができます。

 

1.1 それでは、まずはDocumentのBuilderを作成しましょう。

[java]
import com.google.appengine.api.search.Document;
import com.google.appengine.api.search.Document.Builder;
// …中略…

// Document IDを設定し、Builderを作ります。
Document.Builder docBuilder = Document.newBuilder().setId("00001").setLocale(Locale.JAPANESE);
[/java]

Documentは必須項目として、Document IDをString型で持たなければなりません。
今回はDocument.newBuilder.setIdでDocument IDを設定します。
登録するIndexに既に同じIDのDocumentがある場合は、Documentは上書きされます。
.setLocale(Locale.JAPANESE)とやってますが、これはおまじないのようなもので、この設定が無くても正常に日本語検索ができます。
また、Document.BuilderにはsetRankメソッドがあり、検索結果で返るときのDocumentの順序を指定することができます。
※指定が無い場合は、2011年1月1日からの秒数が入ります。
なので、新しいDocumentのRankが自動的に高くなり、ソート順を指定しない検索の場合は新しく登録したDocumentが上になります。

 

1.2 次にDocument.BuilderにFieldの情報を追加します。

[java]
Field.Builder textFieldBuilder = Field.newBuilder(); // FieldのBuilderを生成します。
// Field.Builderを使用して、フィールド名、値、検索型を指定して、設定します。
textFieldBuilder.setName("name").setText("テスト太郎");
docBuilder.addField(textFieldBuilder); // DocumentのBuilderに情報を設定したField.Builderを追加します。

// 完全一致の場合は、ATOM型
Field.Builder atomFieldBuilderFieldBuilder = Field.newBuilder();
atomFieldBuilderFieldBuilder.setName("bloodType").setAtom("AB");
docBuilder.addField(atomFieldBuilderFieldBuilder);

// 日付型の場合は、DATE型
Field.Builder dateFieldBuilder = Field.newBuilder();
dateFieldBuilder.setName("birthDay").setDate(new Date());
docBuilder.addField(dateFieldBuilder);

// HTMLタグを無視した検索をしたい場合は、HTML型
Field.Builder htmlFieldBuilder = Field.newBuilder();
htmlFieldBuilder.setName("html").setHTML("<html><body><p>テスト太郎です。</p></body></html>");
docBuilder.addField(htmlFieldBuilder);

// 緯度経度情報の場合はGeoPoint型
Field.Builder geoPointFieldBuilder = Field.newBuilder();
geoPointFieldBuilder.setName("geoPoint").setGeoPoint(new GeoPoint(30.0, 30.0));
docBuilder.addField(geoPointFieldBuilder);

// 数値の場合は、Number型
Field.Builder numFieldBuilder = Field.newBuilder();
numFieldBuilder.setName("age").setNumber(25);
docBuilder.addField(numFieldBuilder);
[/java]

Field.Builder.setNameでフィールド名を設定し、setText(setAtom……)でそのフィールドの値を設定します。
また、下記のコードのように同一フィールド名を複数のフィールドに設定するとこもできます。

[java]
Field.Builder listFieldBuilder1 = Field.newBuilder();
listFieldBuilder1.setName("category").setAtom("学生");
docBuilder.addField(listFieldBuilder1);

Field.Builder listFieldBuilder2 = Field.newBuilder();
listFieldBuilder2.setName("category").setAtom("アルバイト");
docBuilder.addField(listFieldBuilder2);
[/java]

Field.Builder.setNameに同じフィールド名を設定し、Document.Builderに追加するだけです。
このように設定しますと、フィールド名「category」で検索した場合、「学生」でも引っかかるし、「アルバイト」でも引っかかるようになります。
※Number型とDate型以外のフィールド型の場合のみ、同一のフィールド名を設定できます。Number型かDate型で同一のフィールド名があると、Documentの登録時に、「java.lang.IllegalArgumentException: Number and date fields cannot be repeated.」が出ます。

 

1.3 フィールドを設定したら、DocumentをIndexに登録します。

[java]
import com.google.appengine.api.search.Index;
import com.google.appengine.api.search.IndexSpec;
import com.google.appengine.api.search.SearchServiceFactory;
// …中略…

// IndexSpec.newBuilderしつつ、setNameでIndexの名前を指定し、IndexSpecを生成します。
IndexSpec indexSpec = IndexSpec.newBuilder().setName("sample").build();
// IndexSpecを使って、SearchServiceからIndexを作成します。
Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);
// IndexにDocumentを登録する
index.put(builder);
[/java]

Index.putにはList型でも渡せますが、一度に渡せる件数は200件までですので、Listで渡す場合は数の調整が必要になります。

 

1.4 実行後の確認

ここまでのコードを実行すると、Developer Consoleの[Compute]→[App Engine]→[Search]の
Index一覧に「sample」が見えると思います。

Google Developers Console

Index名「sample」をクリックすると、sampleに登録されたDocumentの一覧が表示されますので、登録したDocumentを確認してみましょう。
1.1でsetIdしたID=00001のDocumentが見れるはずです。

Google Developers Console (4)

ですが、CATEGORYの項目に表示されている値は「アルバイト」だけで「学生」が見えません。
同一名称のフィールドの値は最後に追加したモノだけが表示されるようです。
※一覧での表示はDeveloper Consoleと同様でcategoryの値は「アルバイト」しか見せませんが、
Eclipseでのローカル実行であれば、Documentの詳細が見れますので、下記のように見えます。

z-yasue-search-api Development Console - Full Text Search

また、一覧の表示に関して言えば、文字数が多い場合などは途中までしか表示されません。いつかは詳細ページができると良いのですが……

 

 

2. Documentの削除

2.1 先程1で作ったDocumentを削除してみましょう。

[java]
// 登録と同じように最初はIndex名を指定して、Indexオブジェクトを作ります。
IndexSpec indexSpec = IndexSpec.newBuilder().setName(“sample”).build();
Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);

// 削除するにはDocument IDを指定します。
index.delete(“00001”);
[/java]

Index.deleteはIndex.put同様、200件までのListを渡せます。
今回は削除するDocument IDをベタ書きで指定していますが、本来なら削除対象を検索して、検索結果からDocument IDを取って削除するという流れになるかと思います。
それでは削除処理を実行し、正常に削除されたか、Developer Consoleを確認してみましょう。

Google Developers Console (2)

Documentはちゃんと消えていますね。
2014年11月28日時点では、Developer ConsoleからDocumentの削除はできないようなので、削除処理のプログラムは地味に必要なプログラムかと思います。

 

次回は、検索の実装について、注意点等を交えながら紹介したいと思います。

Search API詳細解説シリーズ

タイトル
Part1 Search API 概要説明
Part2 Search APIの使い方 登録・削除編(このページです)
Part3 Search APIの使い方 検索編
Part4 Search API 詳細 検索性能編
Part5 Search API 詳細 反映速度編
Part6 Search API 詳細 限界値編

関連記事

GAE/JからBigQueryへのStream Insert

今回はGAE/JからBigQueryへのStream Insertを試してみます。 BigQuer

記事を読む

AppEngine Security Scan Tool

AppEngine Security Scan Toolが利用出来るようになりました。ついては、GA

記事を読む

GAE/GOでVideo Intelligence APIを操作してみた!!〜事前準備編〜

先週のGCP Next 17’でGoogleから新しい機械学習APIが発表されました!その名

記事を読む

東京リージョン内でのGAE・GCS・GCE間の通信はこのくらいだった

11月8日に Google Cloud Platform にて待ちに待った日本リージョンがリ

記事を読む

Search API詳細解説 Part3「Search APIの使い方 検索編」

Search API詳細解説シリーズ タイトル Part1Search API 概要説明

記事を読む

1つのエンティティにプロパティをいくつまで作れるか

1つのエンティティにプロパティをいくつまで作れるか 1つのエンティティにプロパティをいくつまで

記事を読む

GAE/GOでTwitter Botを作ってみる~後編~

今回のapps-gcpは「GAE/GOでTwitter Botを作ってみる」の後編記事です。

記事を読む

GAリリース記念!!今更だけどGAE Flexible Environmentのチュートリアルを試してみた!

GAE Flexible Environment(以下FE)のGA(General Availa

記事を読む

GAEでよくあるエラーの発生原因と対策1

GAE上で動くWebアプリケーションに特有の例外について、弊社での運用の事例からいくつか特徴的なもの

記事を読む

1つのエンティティにプロパティをいくつまで作れるか(パート2)

1つのエンティティにプロパティをいくつまで作れるか 1つのエンティティにプロパティをいくつまで

記事を読む

PAGE TOP ↑