自作自演

Firefox の話題を中心に Web 関係の話も扱うつもりの雑記。だった。
zisakuzien.exblog.jp

Top

Java から CloudSearch を使ってみた。

参考
Amazon CloudSearchのクライアントプログラミング | shinodogg.com
Amazon CloudSearch 用 deleteByQuery を書きました。 - よしだのブログ
What Is Amazon CloudSearch? - Amazon CloudSearch
Overview (AWS SDK for Java - 1.7.11)

以下、適当に書いてたものをブログに載せても差し支えないように
伏せたり直したりしているので、動かなかった時はごめんなさい。試してないです。

■準備
SDK などをダウンロードしてビルドパスを追加しておく。
AWS SDK for Java | アマゾン ウェブ サービス(AWS 日本語)

Joda - Time - Browse /joda-time at SourceForge.net (2.3 を利用)
Commons Logging - Download Commons Logging (1.1.3 を利用)
Apache HttpComponents - HttpComponents Downloads(httpclient-4.3.3.jar と httpcore-4.3.2.jar を利用)
JacksonDownload - FasterXML Wiki (jackson-annotations-2.2.3.jar、jackson-core-2.2.3.jar、jackson-databind-2.2.3.jar を利用)

■ドメインを作る
認証情報を AwsCredentials.properties ファイルに書いておく。
accessKey = xxxxxxxxxxxxxxxxxxxx
secretKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

アクセスポリシーの設定を JSON 形式で用意しておく。
(下記は特定のIPアドレスからのみすべての操作を受け付ける)
{
"Version":"2012-10-17",
"Statement":
[{
"Resource": "arn:aws:cloudsearch:ap-northeast-1:xxxxxxxxxxxx:domain/piyo",
"Effect": "Allow",
"Sid":"1",
"Action": "cloudsearch:*",
"Condition": {
"IpAddress": {
"aws:SourceIp": ["xxx.xxx.xxx.xxx/xxx"]
}
},
"Principal": {
"AWS": ["*"]
}
}]
}


AmazonCloudSearchClient client = new AmazonCloudSearchClient(
new PropertiesCredentials(
CreateDomain.class.getResourceAsStream("/AwsCredentials.properties")));
client.setRegion(Region.getRegion(Regions.AP_NORTHEAST_1));

// 作るドメインの設定
CreateDomainRequest request = new CreateDomainRequest();
request.setDomainName("piyo"); //好きな名前を付ける
// ドメイン作る
CreateDomainResult result = client.createDomain(request);

// アクセスポリシー設定
String policiesJson = ポリシーを書いた JSON の文字列;
UpdateServiceAccessPoliciesRequest policiesRequest = new UpdateServiceAccessPoliciesRequest();
policiesRequest.setDomainName(domainStatus.getDomainName());
policiesRequest.setAccessPolicies(policiesJson);
UpdateServiceAccessPoliciesResult policiesResult = client
.updateServiceAccessPolicies(policiesRequest);


■フィールド設定
AmazonCloudSearchClient client = new AmazonCloudSearchClient(
new PropertiesCredentials(
CreateDomain.class.getResourceAsStream("/AwsCredentials.properties")));
client.setRegion(Region.getRegion(Regions.AP_NORTHEAST_1));

DefineIndexFieldRequest request = new DefineIndexFieldRequest();
request.setDomainName("piyo");
IndexField field = new IndexField();
field.setIndexFieldName("title"); // 好きなフィールド名をつける
field.setIndexFieldType(IndexFieldType.Text); // com.amazonaws.services.cloudsearchv2.model.IndexFieldType
request.setIndexField(field);

DefineIndexFieldResult result = client.defineIndexField(request);

インデックス生成のリクエスト (時間かかるかも)
IndexDocumentsRequest request = new IndexDocumentsRequest();
request.setDomainName("piyo");
client.indexDocuments(request);


■追加・削除の post 用のメソッド
URL は固定してしまっていますが、それ以外はただ指定の URL に json を post するだけです。
DefaultHttpClient は非推奨になってたので違う方法で HttpClient を作るようにしました。
public static String postBatch(HttpClient client, String json)
throws IOException {
HttpPost post = new HttpPost("http://doc-piyo-xxxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/documents/batch");
StringEntity stringEntity = new StringEntity(json,
StandardCharsets.UTF_8);
stringEntity.setContentType("application/json");
post.setEntity(stringEntity);

HttpResponse response = client.execute(post);
String responseString = EntityUtils.toString(response.getEntity());
return responseString;
}

public static HttpClient createHttpClient() {
// 適当に…
int connectTimeout = 1000 * 30;
int socketTimeout = 1000 * 30;

RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeout)
.setSocketTimeout(socketTimeout).build();

List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader("Accept-Charset", "utf-8"));

HttpClient client = HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setDefaultHeaders(headers).build();
return client;
}


■追加・削除
下記のような感じに追加・削除するドキュメントのデータを JSON 形式で用意し
所定の URL に post する。
[
{"type": "add",
"id": "piyo0001",
"fields": {
"title": "ひよこものがたり"
}
},
{"type": "delete",
"id": "piyo0002"
}
]


形式については Preparing Your Data for Amazon CloudSearch - Amazon CloudSearch を参照。

投入したデータの一部だけを「修正」する機能はないので、
修正したい場合はその id のデータをまるごともう一度 type=add で送る。

■全件削除
雑すぎる例外処理、そして getDeleteAllList()と言いながら特にループとかしてないので
これだと件数が多い時は全件取れないです…
今のところ新しく渡したデータに全とっかえして、古いデータを全部捨てる、みたいな機能はないので、
古いものを全部消したければ自分で指定して消さないといけないです。
(下記の ObjectMapper は com.fasterxml.jackson.databind.ObjectMapper です。)

public static void main(String[] args) {

try {
log.info("削除対象を取得します。");
List<Map<String, ?>> deleteMap = getDeleteAllList();
log.info(deleteMap.size() + "件の削除対象がありました。");

ObjectMapper mapper = new ObjectMapper();

HttpClient client = createHttpClient();
postBatch(client, mapper.writeValueAsString(deleteMap));

log.info("処理がすべて完了しました。");
} catch (Exception e) {
log.error("ダメだった(´・ω・`)", e);
}
}

@SuppressWarnings("unchecked")
public static List<Map<String, ?>> getDeleteAllList() throws Exception {
ObjectMapper mapper = new ObjectMapper();

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("q", "*:*"));
params.add(new BasicNameValuePair("q.parser", "lucene"));
params.add(new BasicNameValuePair("return", "id"));
params.add(new BasicNameValuePair("size", "10000"));

List<Map<String, ?>> root = new ArrayList<>();
String responseString = getSearch(params);

Map<String, ?> map = mapper.readValue(responseString, Map.class);
System.out.println(map);
for (Map<String, ?> hit : (List<Map<String, ?>>) ((Map<String, ?>) map
.get("hits")).get("hit")) {
Map<String, String> data = new HashMap<>();
data.put("id", (String) hit.get("id"));
data.put("type", "delete");
root.add(data);
}
return root;
}

public static String getSearch(List<NameValuePair> params)
throws IOException {
HttpClient client = createHttpClient();

HttpGet get = new HttpGet("http://doc-piyo-xxxxxxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com/2013-01-01/search?"
+ URLEncodedUtils.format(params, "UTF-8"));

HttpResponse response = client.execute(get);
return EntityUtils.toString(response.getEntity());
}

[PR]
by tokage-shippo | 2014-05-28 14:44
Mozilla Firefox ブラウザ無料ダウンロード

about this...

書き手の名前は 晴柳祐志 と言います。


リンク

Twitter
いつか何とかしたいサイト

最新のトラックバック

[foxkeh]フォクす..
from 「 Firefox ×?=!..
[Firefox]Fir..
from +Sun Flower〜報告〜+
Firefoxバトン
from MなMによるMのための日記
スキン変更!
from SUKA・SUKA・BLOG
Firefox 1.5に..
from mmkg

検索

S M T W T F S
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
XML | ATOM

個人情報保護
情報取得について
免責事項