package es.official.guide.agg;
import java.io.IOException;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Order;
import org.junit.Test;
import es.ESTestBase;
/**
* http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/top-hits.html
*/
public class FieldCollapsingExamples extends ESTestBase {
private String indexName = "my_index";
private String typeBlogpost = "blogpost";
private String typeUser = "user";
@Test
public void testCreateMappings() throws IOException {
// mapping for the blogpost
XContentBuilder builder =
XContentFactory.jsonBuilder()
.startObject()
.startObject("properties")
// field user
.startObject("user")
.startObject("properties")
.startObject("name")
.field("type", "string")
.startObject("fields")
.startObject("raw")
.field("type", "string")
.field("index", "not_analyzed")
.endObject()
.endObject()
.endObject()
.endObject()
.endObject()
// field title
.startObject("title")
.field("type", "string")
.endObject()
// field body
.startObject("body")
.field("type", "string")
.endObject()
.endObject()
.endObject();
PutMappingResponse response = client.admin().indices().preparePutMapping(indexName).setType(typeBlogpost)
.setSource(builder).execute().actionGet();
if (response.isAcknowledged()) {
System.out.println("blogpost mapping created !");
} else {
System.err.println("blogpost mapping creation failed !");
}
// mapping for user
builder =
XContentFactory.jsonBuilder()
.startObject()
.startObject("properties")
// field name
.startObject("name")
.field("type", "string")
.endObject()
// field email
.startObject("email")
.field("type", "string")
.endObject()
// field dob
.startObject("dob")
.field("type", "date")
.endObject()
.endObject()
.endObject();
response = client.admin().indices().preparePutMapping(indexName).setType(typeUser)
.setSource(builder).execute().actionGet();
if (response.isAcknowledged()) {
System.out.println("user mapping created !");
} else {
System.err.println("user mapping creation failed !");
}
}
@Test
public void testBulkIndexing() throws IOException {
BulkRequestBuilder bulkRequest = client.prepareBulk();
// add users
bulkRequest.add(client.prepareIndex(indexName, typeUser, "1").setSource(XContentFactory.jsonBuilder()
.startObject()
.field("name", "John Smith")
.field("email", "john@smith.com")
.field("dob", "1970-10-24")
.endObject()));
bulkRequest.add(client.prepareIndex(indexName, typeUser, "3").setSource(XContentFactory.jsonBuilder()
.startObject()
.field("name", "Alice John")
.field("email", "alice@john.com")
.field("dob", "1979-01-04")
.endObject()));
// add blogposts
bulkRequest.add(client.prepareIndex(indexName, typeBlogpost, "2").setSource(XContentFactory.jsonBuilder()
.startObject()
.field("title", "Relationships")
.field("body", "It's complicated...")
.startObject("user")
.field("id", 1)
.field("name", "John Smith")
.endObject()
.endObject()));
bulkRequest.add(client.prepareIndex(indexName, typeBlogpost, "4").setSource(XContentFactory.jsonBuilder()
.startObject()
.field("title", "Relationships are cool")
.field("body", "It's not complicated at all...")
.startObject("user")
.field("id", 3)
.field("name", "Alice John")
.endObject()
.endObject()));
BulkResponse bulkResponse = bulkRequest.execute().actionGet();
if (bulkResponse.hasFailures()) {
// process failures by iterating through each bulk response item
System.err.println("Bulk requesting has failed.");
} else {
System.out.println("Bulk requesting has succeeded.");
}
}
@Test
public void testFieldCollapsing() {
SearchRequestBuilder srb = client.prepareSearch(indexName).setTypes(typeBlogpost)
.setQuery(
QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("title", "relationships"))
.must(QueryBuilders.matchQuery("user.name", "john")))
.addAggregation(AggregationBuilders
.terms("users")
.field("user.name.raw")
.order(Order.aggregation("top_score", false))
.subAggregation(AggregationBuilders.topHits("blogposts").setSize(5).setFetchSource(true))
.subAggregation(AggregationBuilders.max("top_score").script("_score").lang("groovy")));
// execute the srb
SearchResponse response = srb.execute().actionGet();
// read agg
// TODO: why the top_score is 0
System.out.println(response);
}
}