diff --git a/.gitignore b/.gitignore index 539df96..3533ef7 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ target/* .classpath .project bin/ +/target diff --git a/README.md b/README.md index af604f8..1a6605b 100644 --- a/README.md +++ b/README.md @@ -89,11 +89,13 @@ Below is a simple example of searching documents. ```java AmazonCloudSearchQuery query = new AmazonCloudSearchQuery(); query.query = "Dining Tables"; -query.returnFields = "title,sku_no,description"; -query.start = 20; -query.size = 20; -query.addExpression("sort_expr","(0.3*popularity)+(0.7*_score)"); -query.sort("sort_expr", "desc"); +query.queryParser = "simple"; +query.start = 0; +query.size = 16; +query.setDefaultOperator("or"); +query.setFields("sku_no^11", "title^10", "description^9", "features^8", "specification^8", "categories^7"); +query.addExpression("sort_expr", "(0.3*popularity)+(0.7*_score)"); +query.addSort("sort_expr", "desc"); AmazonCloudSearchResult result = client.search(query); ``` diff --git a/pom.xml b/pom.xml index 1eafd57..22be305 100644 --- a/pom.xml +++ b/pom.xml @@ -40,4 +40,23 @@ 4.2 + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + diff --git a/src/main/java/aws/services/cloudsearchv2/AmazonCloudSearchClient.java b/src/main/java/aws/services/cloudsearchv2/AmazonCloudSearchClient.java index c989794..6d5b973 100644 --- a/src/main/java/aws/services/cloudsearchv2/AmazonCloudSearchClient.java +++ b/src/main/java/aws/services/cloudsearchv2/AmazonCloudSearchClient.java @@ -184,6 +184,7 @@ public AmazonCloudSearchClient(AWSCredentialsProvider awsCredentialsProvider, Cl public void addDocument(AmazonCloudSearchAddRequest document) throws AmazonCloudSearchRequestException, AmazonCloudSearchInternalServerException, JSONException { JSONArray docs = new JSONArray(); docs.put(toJSON(document)); + updateDocumentRequest(docs.toString()); } /** @@ -200,6 +201,7 @@ public void addDocuments(List documents) throws JSO for(AmazonCloudSearchAddRequest doc : documents) { docs.put(toJSON(doc)); } + updateDocumentRequest(docs.toString()); } @@ -374,7 +376,7 @@ public AmazonCloudSearchResult search(AmazonCloudSearchQuery query) throws Illeg AmazonCloudSearchResult result = null; try { - Response response = Request.Post("https://" + getSearchEndpoint() + "/2013-01-01/search?" + query.build()) + Response response = Request.Get("https://" + getSearchEndpoint() + "/2013-01-01/search?" + query.build()) .useExpectContinue() .version(HttpVersion.HTTP_1_1) .addHeader("Accept", ContentType.APPLICATION_JSON.getMimeType()) @@ -415,25 +417,26 @@ private AmazonCloudSearchResult fromJSON(String responseBody) throws JSONExcepti if(hits != null) { result.found = hits.getInt("found"); result.start = hits.getInt("start"); - - JSONArray hitArray = root.getJSONArray("hit"); - if(hitArray != null) { - for(int i = 0; i < hitArray.length(); i++) { - JSONObject row = hitArray.getJSONObject(i); - Hit hit = new Hit(); - hit.id = row.getString("id"); - JSONObject fields = row.getJSONObject("fields"); - String[] names = JSONObject.getNames(fields); - for(String name : names) { - if(hit.fields == null) { - hit.fields = new HashMap(); + if(result.found > 0) { + JSONArray hitArray = hits.getJSONArray("hit"); + if(hitArray != null) { + for(int i = 0; i < hitArray.length(); i++) { + JSONObject row = hitArray.getJSONObject(i); + Hit hit = new Hit(); + hit.id = row.getString("id"); + JSONObject fields = row.getJSONObject("fields"); + String[] names = JSONObject.getNames(fields); + for(String name : names) { + if(hit.fields == null) { + hit.fields = new HashMap(); + } + hit.fields.put(name, fields.getString(name)); } - hit.fields.put(name, fields.getString(name)); - } - if(result.hits == null) { - result.hits = new ArrayList(); + if(result.hits == null) { + result.hits = new ArrayList(); + } + result.hits.add(hit); } - result.hits.add(hit); } } } diff --git a/src/main/java/aws/services/cloudsearchv2/search/AmazonCloudSearchQuery.java b/src/main/java/aws/services/cloudsearchv2/search/AmazonCloudSearchQuery.java index e0f4d8a..ff88251 100644 --- a/src/main/java/aws/services/cloudsearchv2/search/AmazonCloudSearchQuery.java +++ b/src/main/java/aws/services/cloudsearchv2/search/AmazonCloudSearchQuery.java @@ -1,5 +1,7 @@ package aws.services.cloudsearchv2.search; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -313,11 +315,11 @@ public void setReturnFields(String ... returnFields) { this.returnFields = builder.toString(); } - public String build() { + public String build() throws UnsupportedEncodingException { StringBuilder builder = new StringBuilder(); if(cursor != null) { - builder.append("cursor").append("=").append(cursor); + builder.append("cursor").append("=").append(URLEncoder.encode(cursor, "UTF-8")); } if(expressions.size() > 0) { @@ -325,7 +327,7 @@ public String build() { if(builder.length() > 0) { builder.append("&"); } - builder.append(entry.getKey()).append("=").append(entry.getValue()); + builder.append("expr").append(".").append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8")); } } @@ -334,17 +336,23 @@ public String build() { if(builder.length() > 0) { builder.append("&"); } - builder.append("facet").append(".").append(facet.field).append("=").append("{"); + builder.append("facet").append(".").append(facet.field).append("="); + + StringBuilder value = new StringBuilder(); + value.append("{"); if(facet.sort != null) { - builder.append("sort").append(":").append("\"").append(facet.sort).append("\""); + value.append("sort").append(":").append("\"").append(facet.sort).append("\""); } if(facet.buckets != null) { - builder.append("buckets").append(":").append(facet.buckets); + value.append("buckets").append(":").append(facet.buckets); } if(facet.size != null) { - builder.append("size").append(":").append(facet.size); + value.append("size").append(":").append(facet.size); } - builder.append("}"); + + value.append("}"); + + builder.append(URLEncoder.encode(value.toString(), "UTF-8")); } } @@ -361,20 +369,26 @@ public String build() { if(builder.length() > 0) { builder.append("&"); } - builder.append("highlight").append(".").append(highlight.field).append("=").append("{"); + builder.append("highlight").append(".").append(highlight.field).append("="); + + StringBuilder value = new StringBuilder(); + value.append("{"); if(highlight.format != null) { - builder.append("format").append(":").append("'").append(highlight.format).append("'"); + value.append("format").append(":").append("'").append(highlight.format).append("'"); } if(highlight.maxPhrases != null) { - builder.append("max_phrases").append(":").append(highlight.maxPhrases); + value.append("max_phrases").append(":").append(highlight.maxPhrases); } if(highlight.preTag != null) { - builder.append("pre_tag").append(":").append("'").append(highlight.preTag).append("'"); + value.append("pre_tag").append(":").append("'").append(highlight.preTag).append("'"); } if(highlight.postTag != null) { - builder.append("post_tag").append(":").append("'").append(highlight.postTag).append("'"); + value.append("post_tag").append(":").append("'").append(highlight.postTag).append("'"); } - builder.append("}"); + value.append("}"); + + builder.append(URLEncoder.encode(value.toString(), "UTF-8")); + } } @@ -382,75 +396,87 @@ public String build() { if(builder.length() > 0) { builder.append("&"); } - builder.append("partial").append("=").append(partial); + builder.append("partial").append("=").append(URLEncoder.encode(partial + "", "UTF-8")); } if(pretty != null) { if(builder.length() > 0) { builder.append("&"); } - builder.append("pretty").append("=").append(pretty); + builder.append("pretty").append("=").append(URLEncoder.encode(pretty + "", "UTF-8")); } if(query != null) { if(builder.length() > 0) { builder.append("&"); } - builder.append("q").append("=").append(query); + builder.append("q").append("=").append(URLEncoder.encode(query, "UTF-8")); } if(queryOptions.size() > 0) { if(builder.length() > 0) { builder.append("&"); } - builder.append("q").append(".").append("options").append("=").append("{"); + + builder.append("q").append(".").append("options").append("="); + + StringBuilder value = new StringBuilder(); + value.append("{"); for(Map.Entry entry : queryOptions.entrySet()) { - builder.append(entry.getKey()).append(":").append(entry.getValue()); + value.append(entry.getKey()).append(":").append("'").append(entry.getValue()).append("'"); } - builder.append("}"); + value.append("}"); + + builder.append(URLEncoder.encode(value.toString(), "UTF-8")); } if(queryParser != null) { if(builder.length() > 0) { builder.append("&"); } - builder.append("q.parser").append("=").append(queryParser); + builder.append("q.parser").append("=").append(URLEncoder.encode(queryParser, "UTF-8")); } if(returnFields != null) { if(builder.length() > 0) { builder.append("&"); } - builder.append("return").append("=").append(returnFields); + builder.append("return").append("=").append(URLEncoder.encode(returnFields, "UTF-8")); } if(size != null) { if(builder.length() > 0) { builder.append("&"); } - builder.append("size").append("=").append(size); + builder.append("size").append("=").append(URLEncoder.encode(size + "", "UTF-8")); } if(sort.size() > 0) { if(builder.length() > 0) { builder.append("&"); } + builder.append("sort").append("="); + + StringBuilder value = new StringBuilder(); int i = 0; for(Map.Entry entry : sort.entrySet()) { - builder.append(entry.getKey()).append(" ").append(entry.getValue()); + value.append(entry.getKey()).append(" ").append(entry.getValue()); if(i != sort.size() - 1) { - builder.append(","); + value.append(","); } } + + builder.append(URLEncoder.encode(value.toString(), "UTF-8")); } if(start != null) { if(builder.length() > 0) { + builder.append("&"); } - builder.append("start").append("=").append(start); + builder.append("start").append("=").append(URLEncoder.encode(start + "", "UTF-8")); } return builder.toString(); diff --git a/target/amazon-cloudsearch-client-1.1.jar b/target/amazon-cloudsearch-client-1.1.jar index 318a9af..f03c5e3 100644 Binary files a/target/amazon-cloudsearch-client-1.1.jar and b/target/amazon-cloudsearch-client-1.1.jar differ