package es.official.guide.sid; import java.io.IOException; import java.util.Arrays; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse; 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.SearchResponse; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.query.FilterBuilders; import org.elasticsearch.index.query.QueryBuilders; import org.junit.Test; import es.ESTestBase; /** * http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/structured-search.html */ public class StructuredSearchExamples extends ESTestBase { private String indexName = "my_store"; private String typeName = "products"; @Test public void prepareIndexAndData() throws IOException { IndicesExistsResponse indicesExistsResponse = client.admin().indices().prepareExists(indexName).execute().actionGet(); if (indicesExistsResponse.isExists()) { DeleteIndexResponse deleteIndexResponse = client.admin().indices().prepareDelete(indexName).execute().actionGet(); if (deleteIndexResponse.isAcknowledged()) { System.out.println("Delete index completed."); } else { System.err.println("Delte index failed."); } // create index first CreateIndexResponse cir = client.admin().indices().prepareCreate(indexName).setSettings(XContentFactory.jsonBuilder() .startObject() .field("number_of_shards", 1) .field("number_of_replicas", 0) .endObject()).execute().actionGet(); if(cir.isAcknowledged()) { System.out.println("Index created."); } else { System.err.println("Index creation failed."); return; } // create the mapping for type products PutMappingResponse pmr = client.admin().indices().preparePutMapping(indexName).setType(typeName).setSource(XContentFactory.jsonBuilder() .startObject() .startObject(typeName) .startObject("properties") .startObject("productID") .field("type", "string") .field("index", "not_analyzed") .endObject() .endObject() .endObject() .endObject()).execute().actionGet(); if(pmr.isAcknowledged()) { System.out.println("Mapping created."); } else { System.err.println("Mapping creation failed."); } } else { System.out.println("No need to delete index since it is not existing."); } // create data in bulk BulkRequestBuilder brb = client.prepareBulk().add(client.prepareIndex(indexName, typeName, "1").setSource(XContentFactory.jsonBuilder() .startObject() .field("price", 10) .field("productID", "XHDK-A-1293-#fJ3") .endObject())); brb.add(client.prepareIndex(indexName, typeName, "2").setSource(XContentFactory.jsonBuilder() .startObject() .field("price", 20) .field("productID", "KDKE-B-9947-#kL5") .endObject())); brb.add(client.prepareIndex(indexName, typeName, "3").setSource(XContentFactory.jsonBuilder() .startObject() .field("price", 30) .field("productID", "JODL-X-1937-#pV7") .endObject())); brb.add(client.prepareIndex(indexName, typeName, "4").setSource(XContentFactory.jsonBuilder() .startObject() .field("price", 30) .field("productID", "QQPX-R-3956-#aD8") .endObject())); BulkResponse bulkResponse = brb.execute().actionGet(); if(bulkResponse.hasFailures()) { System.err.println(bulkResponse.buildFailureMessage()); } else { System.out.println("Bluk indexing completed."); } } // GET /my_store/products/_search // { // "query" : { // "filtered" : { // "query" : { // "match_all" : {} // }, // "filter" : { // "term" : { // "price" : 20 // } // } // } // } // } @Test public void testFilteredQuery() { SearchResponse response = client.prepareSearch(indexName).setTypes(typeName).setQuery(QueryBuilders.filteredQuery( QueryBuilders.matchAllQuery(), FilterBuilders.termFilter("price", 20))).execute().actionGet(); System.out.println(response); // filter on productID, which is a not_analyzed string field response = client.prepareSearch(indexName).setTypes(typeName).setQuery(QueryBuilders.filteredQuery( QueryBuilders.matchAllQuery(), FilterBuilders.termFilter("productID", "XHDK-A-1293-#fJ3"))).execute().actionGet(); System.out.println(response); } // SELECT product // FROM products // WHERE (price = 20 OR productID = "XHDK-A-1293-#fJ3") // AND (price != 30) @Test public void testBoolFilter() { SearchResponse response = client.prepareSearch(indexName).setTypes(typeName).setQuery(QueryBuilders.filteredQuery( QueryBuilders.matchAllQuery(), FilterBuilders.boolFilter() .should(FilterBuilders.termFilter("price", 20), FilterBuilders.termFilter("productID", "XHDK-A-1293-#fJ3")) .mustNot(FilterBuilders.termFilter("price", 30)))).execute().actionGet(); System.out.println(response); } // SELECT document // FROM products // WHERE productID = "KDKE-B-9947-#kL5" // OR ( productID = "JODL-X-1937-#pV7" // AND price = 30 ) @Test public void testNestedBoolFilter() { SearchResponse response = client.prepareSearch(indexName).setTypes(typeName).setQuery(QueryBuilders.filteredQuery( QueryBuilders.matchAllQuery(), FilterBuilders.boolFilter().should( FilterBuilders.termFilter("productID", "KDKE-B-9947-#kL5"), FilterBuilders.boolFilter().must( FilterBuilders.termFilter("productID", "JODL-X-1937-#pV7"), FilterBuilders.termFilter("price", 30) )))).execute().actionGet(); System.out.println(response); } @Test public void testFindMultipleExactValues() { SearchResponse response = client.prepareSearch(indexName).setTypes(typeName).setQuery(QueryBuilders.filteredQuery( QueryBuilders.matchAllQuery(), FilterBuilders.termsFilter("price", Arrays.asList(20, 30)))).execute().actionGet(); System.out.println(response); } // SELECT document // FROM products // WHERE price BETWEEN 20 AND 40 @Test public void testFindRange() { SearchResponse response = client.prepareSearch(indexName).setTypes(typeName).setQuery(QueryBuilders.filteredQuery( QueryBuilders.matchAllQuery(), FilterBuilders.rangeFilter("price") .gt(20).lt(40))).execute().actionGet(); System.out.println(response); } }