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にそれぞれ相当します。
IndexはDocumentの集まりで、DocumentはいくつかのFieldを持つことができます。
Index、Field、Documentの作成にはそれぞれBuilderを使うので、実装者はオブジェクトの作成過程を極力意識すること無く、オブジェクトを作成することができます。
1.1 それでは、まずはDocumentのBuilderを作成しましょう。
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);
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の情報を追加します。
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);
Field.Builder.setNameでフィールド名を設定し、setText(setAtom……)でそのフィールドの値を設定します。
また、下記のコードのように同一フィールド名を複数のフィールドに設定するとこもできます。
Field.Builder listFieldBuilder1 = Field.newBuilder();
listFieldBuilder1.setName("category").setAtom("学生");
docBuilder.addField(listFieldBuilder1);
Field.Builder listFieldBuilder2 = Field.newBuilder();
listFieldBuilder2.setName("category").setAtom("アルバイト");
docBuilder.addField(listFieldBuilder2);
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に登録します。
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);
Index.putにはList型でも渡せますが、一度に渡せる件数は200件までですので、Listで渡す場合は数の調整が必要になります。
1.4 実行後の確認
ここまでのコードを実行すると、Developer Consoleの[Compute]→[App Engine]→[Search]の
Index一覧に「sample」が見えると思います。
Index名「sample」をクリックすると、sampleに登録されたDocumentの一覧が表示されますので、登録したDocumentを確認してみましょう。
1.1でsetIdしたID=00001のDocumentが見れるはずです。
ですが、CATEGORYの項目に表示されている値は「アルバイト」だけで「学生」が見えません。
同一名称のフィールドの値は最後に追加したモノだけが表示されるようです。
※一覧での表示はDeveloper Consoleと同様でcategoryの値は「アルバイト」しか見せませんが、
Eclipseでのローカル実行であれば、Documentの詳細が見れますので、下記のように見えます。
また、一覧の表示に関して言えば、文字数が多い場合などは途中までしか表示されません。いつかは詳細ページができると良いのですが……
2. Documentの削除
2.1 先程1で作ったDocumentを削除してみましょう。
// 登録と同じように最初はIndex名を指定して、Indexオブジェクトを作ります。
IndexSpec indexSpec = IndexSpec.newBuilder().setName(“sample”).build();
Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);
// 削除するにはDocument IDを指定します。
index.delete(“00001”);
Index.deleteはIndex.put同様、200件までのListを渡せます。
今回は削除するDocument IDをベタ書きで指定していますが、本来なら削除対象を検索して、検索結果からDocument IDを取って削除するという流れになるかと思います。
それでは削除処理を実行し、正常に削除されたか、Developer Consoleを確認してみましょう。
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 詳細 限界値編 |
seach-api-part5/”>Search API 詳細 反映速度編