AWS CloudSearch


AWS 관련자료가 원래 잘 없지만 CloudSearch 에 대한 자료는 더 없고

Java SDK 를 사용한 자료는 더 없다. 


간단하게 검색하는 방법입니다.


Document 를 업데이트하는건 전편에 설명



Java


AmazonCloudSearchDomainClient domain = new AmazonCloudSearchDomainClient(getCredentials());
domain.setEndpoint("search-**************.cloudsearch.amazonaws.com");

SearchRequest request = new SearchRequest();

long pageSize = 20;
long startIndex = 0 * pageSize; // 기본 0

String sort = "_score desc,id desc";

String filterQuery = "kind:'hello'";
String returnFields = "_all_fields,_score";
String queryOptions = "{ \n" +
" \"defaultOperator\":\"or\",\n" +
" \"fields\":[ \n" +
" \"name^5\",\n" +
" \"description^3\",\n" +
" \"tags^3\",\n" +
" \"colors^3\",\n" +
" \"category_names^3\",\n" +
" \"file_extensions^2\",\n" +
" \"creator_name\"\n" +
" ],\n" +
" \"operators\":[ \n" +
" \"and\",\n" +
" \"escape\",\n" +
" \"fuzzy\",\n" +
" \"near\",\n" +
" \"not\",\n" +
" \"or\",\n" +
" \"phrase\",\n" +
" \"precedence\",\n" +
" \"prefix\",\n" +
" \"whitespace\"\n" +
" ]\n" +
"}";

request.withQueryParser(QueryParser.Simple)
.withQuery(keyword)
.withStart(startIndex)
.withSize(pageSize)
.withSort(sort)
.withFilterQuery(filterQuery)
.withReturn(returnFields)
.withQueryOptions(queryOptions)
;

SearchResult searchResult = domain.search(request);

queryOptions 의 fields 는 검색대상들이며

name^5 라고 된것이 있는데

field에 weight 를 주고 _score 를 높여 더 높은 검색순위로 끌어올릴 수 있다.

기본 weight는 1 이고, 0.1 도 가능



Query 표현식 조합 방법은

http://docs.aws.amazon.com/cloudsearch/latest/developerguide/searching-compound-queries.html



예를 들어 filterQuery 를 조합할때


kind:hello 이고, status:Active, 이고, category_codes Array 값중 30이 포함된 항목을 필터링 하고싶으면


(and kind:'hello' status:'Active' (phrase field='category_codes' 30) )






Result

{
"status": {
"timems": 5,
"rid": "/M7W4bsqOgq1pko\u003d"
},
"hits": {
"found": 8,
"start": 0,
"hit": [
{
"id": "Marketplace_291",
"fields": {
"thumbnail": [
"http://**************/7b12910b-cc3c-4494-a504-ba00226b27f7.jpg"
],
"kind": [
"Marketplace"
],
"description": [
"Test"
],
"category_names": [
"Video Motion",
"Apple Motion Templates",
"Product Promo"
],
"_score": [
"15.213767"
],
"file_size": [
"21798.0"
],
"file_extensions": [
"jpg"
],
"happened_date": [
"2016-03-28T07:16:41.984Z"
],
"category_codes": [
"30",
"209",
"1730"
],
"creator_email": [
"hello@hello.com"
],
"price": [
"3.0"
],
"name": [
"Video Motion Apple"
],
"creator_name": [
"Creator"
],
"id": [
"291"
]
}
},
.............
]
}
}


결과중 짜증나는건, Field Type 이 Array 가 아닌것들도 Array 로 온다.........





'AWS > CloudSearch' 카테고리의 다른 글

[CloudSearch] Java SDK 사용하여 Search 하기  (0) 2016.03.29
[CloudSearch] Java SDK 로 document update  (0) 2016.03.28
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



AWS CloudSearch



Java SDK 연동하는 CloudSearch 관련 문서가 없는거 같다. 


1. Document Update(JSON)


- Domain

@Setter
@Getter
@ToString
public class SearchDocument {
private String id;
private String type;
private SearchItem fields;
}


@Setter
@Getter
@ToString
public class SearchItem {
String id;
private String name;
String description;
String price;
String thumbnail;
Long fileSize;
String fileExtensions;
String creatorName;
String creatorEmail;
SearchItemKind kind;
String happenedDate;
String[] categoryNames;
Long[] categoryCodes;
}



- 위 Domain 을 JSON 으로 변환한 것

각 Object 최상위에 id 와 type, fields 는 필수로 존재해야 한다.

type 값에는 add, delete 두가지가 있다.

각 field type 에 허용되는 값에 대한 설명은 아래

http://docs.aws.amazon.com/cloudsearch/latest/developerguide/configuring-index-fields.html

[
{
"id": "Marketplace_292",
"type": "add",
"fields": {
"id": "292",
"name": "Motion Graphics",
"description": "Motion Graphics description",
"price": "6.12",
"thumbnail": "http://**********/edbeb3e0-7c8c-4319-849b-863087f272c8.jpg",
"file_size": 21798,
"file_extensions": "jpg,png",
"creator_name": "hello",
"creator_email": "hello@hello.com",
"kind": "Marketplace",
"happened_date":"2016-03-26T05:12:32.545Z",
"category_names": [
"Video Motion",
"Motion Graphics",
"Overlays"
],
"category_codes": [
30,
210,
1775
]
}
}
]



Java Code


AmazonCloudSearchDomainClient domain
= new AmazonCloudSearchDomainClient(S3Manager.getCredentials());
domain.setEndpoint("********");

Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.create();

String str = gson.toJson(getSearchDocuments());

byte[] bytes = str.getBytes("UTF-8");

InputStream is = new ByteArrayInputStream(bytes);

UploadDocumentsRequest req = new UploadDocumentsRequest();
req.setContentType(ContentType.Applicationjson);
req.setDocuments(is);
req.setContentLength(0L + bytes.length);

UploadDocumentsResult result = domain.uploadDocuments(req);




'AWS > CloudSearch' 카테고리의 다른 글

[CloudSearch] Java SDK 사용하여 Search 하기  (0) 2016.03.29
[CloudSearch] Java SDK 로 document update  (0) 2016.03.28
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



AWS RDS


기존 개발 환경은 로컬과 STG - US.EAST Region EC2 의 WAS 에서


Toyko Region MySQL 을 바라보고 있었는데


Seoul Region 이 생겨서 로컬에서 더 빠르게 응답받고자 RDS.MySQL 을 생성했다.



로컬 앱과 WorkBench 에서는 별 문제 없이 잘 동작되는데


US.EAST 의 EC2 WAS 에서 DB Connection error 가 발생했다.


Security Group 은 Default 를 사용했는데 Inbound Rules 은


All Traffic 으로 되어 설정 돼있었는데, 


아래와 같이 TCP 를 따로 추가하니 DB 연결이 정상적으로 되더라.


US.EAST RDS 는 저 rule 을 추가하지 않아도 문제없었는데, 왜 Seoul Region 만 이런지는 잘모르겠다.







'AWS > RDS' 카테고리의 다른 글

[RDS] Seoul Region 에서 RDS 생성 후 TCP 접근 안되는 문제  (0) 2016.03.24
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



Elastic Beanstalk environment 

Tomcat Platform + Load balancing, auto scaling 으로 세팅하게 되면,


자동으로 Apache + Tomcat 이 EC2 에 설치되어 서비스되는데 문제는


httpd.conf 와 server.xml 설정파일등이 기본값으로 되어있어 대용량 파일 업로드할때 connection 이 끊기면서 문제가 생겼다.


그래서 ec2 의 설정 파일을 직접수정하여, 리붓하여 해결을 했는데


문제는 war 를 다시 배포하면, ec2 를 바꿔버리는 경우도 있고, auto scaling 으로 ec2 를 생성하는 것들은 기본설정으로


생성되니 일일이 생성될때마다 들어가서 고쳐줄 수 도 없는 노릇이다.



war 를 배포할때마다 설정을 자동으로 변경할 수 있으면 해결될 문제인것 같다.



검색해보니 몇가지 해결책이 있었는데, 안돼서 AWS Support 팀에 물어보고 얻은 해결책입니다.




제 환경은 Maven 으로 war 생성하여, beanstalk 에 업로드 합니다.


1.

위 이미지 처럼 WebContent root 에 .ebextensions 폴더를 생성합니다.




2. .ebextensions 폴더 아래 server-update.config 파일을 생성합니다. 내용은 아래처럼

container_commands:
00_replace-tomcat-config:
command: cp .ebextensions/tomcat8/server.xml /etc/tomcat8/server.xml
01_replace-apache-config:
command: cp .ebextensions/apache/elasticbeanstalk.conf /etc/httpd/conf.d/elasticbeanstalk.conf

** 들여쓰기를 꼭 지켜야합니다. **


라인 3은 tomcat server.xml 파일작업

라인 5는 apache httpd.conf 파일역할을 하는것같은? ;; elasticbeanstalk.conf 파일 작업입니다.


저것들의 내용은



3. server.xml - 아래 위 다 짜르고 고친부분만 올렸습니다. 제 설정이니 프로젝트에 맞게 고치세요.

<Connector port="8080" protocol="HTTP/1.1"
keepAliveTimeout="-1"
URIEncoding="UTF-8"
disableUploadTimeout="true"
connectionTimeout="7200000"
connectionUploadTimeout="7200000"
redirectPort="8443" />



4. elasticbeanstalk.conf - 전체입니다.

<VirtualHost *:80>
Timeout 7200
ProxyTimeout 7200

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost on

ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>




5. EC2 Console - Load Balancers 에서 해당 Elastic Beanstalk 이 생성한 ELB 를 찾아야 합니다.


찾아서 아래 그림처럼 Connection Settings 값을 최대 3600까지 올려주시면 됩니다.






여기까지 한 후 war 를 생성해보면, war 파일 root 에 .ebextensions 가 존재하면 다됐습니다.


이제 war 배포가 완료되고 ec2 의 각 파일을 열어보시면, 변경되었을겁니다.


인스턴스 리붓할 필요없이 자동으로 반영되는것 같습니다..


리전이 북미라 500메가 업로드하는데 1시간정도 걸리던데 서비스 잘되고 있습니다.













YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST