カテゴリー別アーカイブ: AWS

“AWS SDK for Java”を使ってCloudSearchから検索結果を取得する

CloudSearchの検索時に”AWS SDK for Java”を使ってみるサンプルです。
HttpClient等を使った例は良く見かけますが、SDKを使った例が見つからなかったので載せときます。

scalaでの記述例ですけど、javaでもほとんど同じですよ。

import com.amazonaws.auth.AWSCredentials
import com.amazonaws.services.cloudsearchdomain.AmazonCloudSearchDomainClient
import com.amazonaws.services.cloudsearchdomain.model.SearchRequest
import com.amazonaws.services.cloudsearchdomain.model.QueryParser
import com.amazonaws.services.cloudsearchdomain.model.SearchResult


// search用のエンドポイント
val endpoint = "search-testdb-xxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com"

// クライアントを準備
val credentials = new BasicAWSCredentials("accessKey", "secretKey")
val client = new AmazonCloudSearchDomainClient(credentials)
client.setEndpoint(endpoint)


// リクエストを生成
// 各項目に設定する内容はhttpクライアント等で search apiを実行する時に
// 設定する内容とだいたい一緒です  
// 詳しくは↓
// http://docs.aws.amazon.com/cloudsearch/latest/developerguide/search-api.html
//
var request = (new SearchRequest())
	.withQueryParser(QueryParser.Simple)
	.withQuery("検索ワード")
	// titleとsubtitleに対して"AND"検索を行う	
	.withQueryOptions("{\"defaultOperator\":\"and\",\"fields\":[\"title\",\"subtitle\"]}")
	// 先頭から1000件まで取得	
	.withStart(0)
	.withSize(1000)
	// ソート条件を設定
    .withSort("sortkey1 asc,sortkey2 desc")
    // 結果として取得する項目
    .withReturn("_score,title,ranking")
    

try{
    // 検索処理
    val result = client.search(request)
	
	 
    val status  = result.getStatus()
    val hits = result.getHits()
    
    // インデックス全体でのトータル件数(startとsizeで指定した範囲外も含む)
    val total = hits.getFound();
    
    // 取得したレコードをマップ (javaな人は for-eachしていると思って下さい)
    hits.getHit().map{rec => 
    
      // ID項目
      val id = rec.getId()
      
      // Fieldを参照してみる
      val ranking = rec.getFields().get("ranking").get(0)
      
      Logger.info(" id:" + id + " ranking:" + ranking)
    }

} finally {
   client.shutdown()
}

なぜSDKを使う必要があったかと言うと、IAMロールでのアクセス制限を行いたかったからです。
署名済リクエストを作るのがやたらと面倒だったので・・・
SDKを使う事で簡単に署名済のリクエストが行えます。

“AWS SDK for Java”を使ってCloudSearchへデータを登録する

前回の検索に続いてこんどはドキュメントの更新処理です
これもSDKを使ったサンプルが見つからないんですよね。。。探し方が悪いのかな??

scalaでの記述になっていますけど、javaでもほとんど同じです。

import com.amazonaws.auth.AWSCredentials
import com.amazonaws.services.cloudsearchdomain.AmazonCloudSearchDomainClient
import com.amazonaws.services.cloudsearchdomain.model.UploadDocumentsRequest
import com.amazonaws.services.cloudsearchdomain.model.ContentType
import java.io.ByteArrayInputStream


// document用のエンドポイント
val endpoint = "document-testdb-xxxxxxxxx.ap-northeast-1.cloudsearch.amazonaws.com"

// クライアントを準備
val credentials = new BasicAWSCredentials("accessKey", "secretKey")
val client = new AmazonCloudSearchDomainClient(credentials)
client.setEndpoint(endpoint)

// データ投入用のjsonデータを作成する
val datajson = "[{ ...省略... }]"

// json文字列をbyte配列としてInputStreamを取得
val postdata = datajson.getBytes()
val data = new ByteArrayInputStream(postdata); 

// リクエストを生成
var request = (new UploadDocumentsRequest())
    .withContentType(ContentType.Applicationjson)
    .withContentLength(postdata.length)
    .withDocuments(data)
     
// uploadを実行
val response = client.uploadDocuments(request)

// 何件登録して、何件削除したのかを確認できます      
Logger.info(response.toString())

client.shutdown()

datajsonに入れる文字列はHttpクライアント等で “documents/batch” APIにpostする内容と同じです
詳しくは↓
http://docs.aws.amazon.com/cloudsearch/latest/developerguide/document-service-api.html

簡単なサンプルですとこんな感じです

[
  { 
  	"fields": { "title": "タイトル100","subtitle": "サブタイトル" }, 
	"id": "100", 
	"type": "add"
  }, 
  {
  	"fields": { "title": "タイトル101", "subtitle": "サブタイトル" }, 
	"id": "101", 
	"type": "add"
  },
  {
  	"id": "900",
  	"type": "delete"
  }
]

jsonはJacksonとかGsonとかで作ると楽ですね。