Elasticsearch系列(六)----JAVA客户端之Jest操作详解

1,860 阅读48分钟
原文链接: blog.csdn.net

Jest示例代码如下:

  1. package com.fendo.JestClient;  
  2.   
  3. import java.io.IOException;  
  4. import java.text.SimpleDateFormat;  
  5. import java.util.Arrays;  
  6. import java.util.Date;  
  7. import java.util.List;  
  8. import java.util.Map;  
  9.   
  10. import org.elasticsearch.action.search.SearchResponse;  
  11. import org.elasticsearch.index.query.QueryBuilder;  
  12. import org.elasticsearch.index.query.QueryBuilders;  
  13. import io.searchbox.core.SearchResult.Hit;  
  14. import io.searchbox.core.Suggest;  
  15. import io.searchbox.core.SuggestResult;  
  16. import io.searchbox.core.Update;  
  17.   
  18. import org.elasticsearch.search.builder.SearchSourceBuilder;  
  19. import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;  
  20. import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;  
  21. import org.junit.After;  
  22. import org.junit.Before;  
  23. import org.junit.Test;  
  24.   
  25. import com.fendo.entity.CsdnBlog;  
  26. import com.google.gson.GsonBuilder;  
  27. import com.google.gson.JsonObject;  
  28.   
  29. import io.searchbox.client.JestClient;  
  30. import io.searchbox.client.JestClientFactory;  
  31. import io.searchbox.client.JestResult;  
  32. import io.searchbox.client.config.HttpClientConfig;  
  33. import io.searchbox.cluster.Health;  
  34. import io.searchbox.cluster.NodesInfo;  
  35. import io.searchbox.cluster.NodesStats;  
  36. import io.searchbox.core.Bulk;  
  37. import io.searchbox.core.Count;  
  38. import io.searchbox.core.CountResult;  
  39. import io.searchbox.core.Delete;  
  40. import io.searchbox.core.DocumentResult;  
  41. import io.searchbox.core.Get;  
  42. import io.searchbox.core.Index;  
  43. import io.searchbox.core.Search;  
  44. import io.searchbox.core.SearchResult;  
  45. import io.searchbox.indices.ClearCache;  
  46. import io.searchbox.indices.CloseIndex;  
  47. import io.searchbox.indices.CreateIndex;  
  48. import io.searchbox.indices.DeleteIndex;  
  49. import io.searchbox.indices.Flush;  
  50. import io.searchbox.indices.IndicesExists;  
  51. import io.searchbox.indices.Optimize;  
  52. import io.searchbox.indices.mapping.PutMapping;  
  53.   
  54. /**  
  55.  * Elasticserach jestClient示例  
  56.  * @author fendo  
  57.  *  
  58.  */  
  59.   
  60. public class Jest {  
  61.   
  62.       
  63.     private static JestClient jestClient;  
  64.     private static String indexName = "article";    
  65.     private static String typeName = "content";   
  66.   
  67.       
  68.     @Before  
  69.     public void getClient() throws Exception{  
  70.         JestClientFactory factory = new JestClientFactory();    
  71.         factory.setHttpClientConfig(new HttpClientConfig    
  72.                                .Builder("http://localhost:9200")    
  73.                                .gson(new GsonBuilder().setDateFormat("yyyy-MM-dd'T'hh:mm:ss").create())    
  74.                                .connTimeout(1500)    
  75.                                .readTimeout(3000)    
  76.                                .multiThreaded(true)    
  77.                                .build());  
  78.         jestClient=factory.getObject();  
  79.     }  
  80.     
  81.     @After  
  82.     public void tearDown() throws Exception {    
  83.         closeJestClient(jestClient);    
  84.     }    
  85.   
  86.         
  87.     /**    
  88.      * 关闭JestClient客户端    
  89.      * @param jestClient    
  90.      * @throws Exception    
  91.      */    
  92.     public void closeJestClient(JestClient jestClient) throws Exception {    
  93.             
  94.         if (jestClient != null) {    
  95.           jestClient.shutdownClient();    
  96.         }    
  97.     }  
  98.       
  99.     /**  
  100.      * ---------------------------测试--------------------------  
  101.      */  
  102.       
  103.     /**  
  104.      * 创建索引  
  105.      * @throws Exception  
  106.      */  
  107.     @Test    
  108.     public void createIndex() throws Exception {  
  109.           
  110.         JestResult jr = jestClient.execute(new CreateIndex.Builder(indexName).build());    
  111.         System.out.println(jr.isSucceeded());    
  112.     }    
  113.     
  114.       
  115.     /**  
  116.      * Put映射   
  117.      * @throws Exception  
  118.      */  
  119.     @Test    
  120.     public void createIndexMapping() throws Exception {    
  121.     
  122.         String source = "{\"" + typeName + "\":{\"properties\":{"    
  123.                 + "\"author\":{\"type\":\"string\",\"index\":\"not_analyzed\"}"    
  124.                 + ",\"title\":{\"type\":\"string\"}"  
  125.                 + ",\"content\":{\"type\":\"string\"}"  
  126.                 + ",\"price\":{\"type\":\"string\"}"  
  127.                 + ",\"view\":{\"type\":\"string\"}"  
  128.                 + ",\"tag\":{\"type\":\"string\"}"  
  129.                 + ",\"date\":{\"type\":\"date\",\"format\":\"yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"}"    
  130.                 + "}}}";    
  131.         System.out.println(source);    
  132.           
  133.         PutMapping putMapping = new PutMapping.Builder(indexName, typeName, source).build();    
  134.         JestResult jr = jestClient.execute(putMapping);    
  135.         System.out.println(jr.isSucceeded());    
  136.     }  
  137.       
  138.     /**  
  139.      * 插入多个  
  140.      * @throws IOException   
  141.      */  
  142.     @Test  
  143.     public void insertMultiple() throws IOException{  
  144.         CsdnBlog csdnBlog1=new CsdnBlog();  
  145.         csdnBlog1.setAuthor("AAAA");  
  146.         csdnBlog1.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");  
  147.         csdnBlog1.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");  
  148.         csdnBlog1.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));  
  149.         csdnBlog1.setView("100");  
  150.         csdnBlog1.setTag("JAVA,ANDROID,C++,LINUX");  
  151.           
  152.           
  153.         CsdnBlog csdnBlog2=new CsdnBlog();  
  154.         csdnBlog2.setAuthor("BBBB");  
  155.         csdnBlog2.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");  
  156.         csdnBlog2.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");  
  157.         csdnBlog2.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));  
  158.         csdnBlog2.setView("200");  
  159.         csdnBlog2.setTag("JAVA,ANDROID,C++,LINUX");  
  160.           
  161.           
  162.         CsdnBlog csdnBlog3=new CsdnBlog();  
  163.         csdnBlog3.setAuthor("CCCC");  
  164.         csdnBlog3.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");  
  165.         csdnBlog3.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");  
  166.         csdnBlog3.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));  
  167.         csdnBlog3.setView("300");  
  168.         csdnBlog3.setTag("JAVA,ANDROID,C++,LINUX");  
  169.           
  170.         CsdnBlog csdnBlog4=new CsdnBlog();  
  171.         csdnBlog4.setAuthor("CCCC");  
  172.         csdnBlog4.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");  
  173.         csdnBlog4.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");  
  174.         csdnBlog4.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));  
  175.         csdnBlog4.setView("400");  
  176.         csdnBlog4.setTag("JAVA,ANDROID,C++,LINUX");  
  177.           
  178.           
  179.         Index index1 = new Index.Builder(csdnBlog1).index("article").type("article").build();  
  180.         Index index2 = new Index.Builder(csdnBlog2).index("article").type("article").build();  
  181.         Index index3 = new Index.Builder(csdnBlog3).index("article").type("article").build();  
  182.         Index index4 = new Index.Builder(csdnBlog4).index("article").type("article").build();  
  183.   
  184.         JestResult jestResult1 = jestClient.execute(index1);  
  185.         System.out.println(jestResult1.getJsonString());  
  186.         JestResult jestResult2 = jestClient.execute(index2);  
  187.         System.out.println(jestResult2.getJsonString());  
  188.         JestResult jestResult3 = jestClient.execute(index3);  
  189.         System.out.println(jestResult3.getJsonString());  
  190.         JestResult jestResult4 = jestClient.execute(index3);  
  191.         System.out.println(jestResult4.getJsonString());  
  192.     }  
  193.       
  194.     /**  
  195.      * Bulk插入数据  
  196.      * @throws IOException   
  197.      */  
  198.     @Test  
  199.     public void bulkIndex() throws IOException{  
  200.         CsdnBlog csdnBlog1=new CsdnBlog();  
  201.         csdnBlog1.setAuthor("AAAA");  
  202.         csdnBlog1.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");  
  203.         csdnBlog1.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");  
  204.         csdnBlog1.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));  
  205.         csdnBlog1.setView("100");  
  206.         csdnBlog1.setTag("JAVA,ANDROID,C++,LINUX");  
  207.           
  208.           
  209.         CsdnBlog csdnBlog2=new CsdnBlog();  
  210.         csdnBlog2.setAuthor("BBBB");  
  211.         csdnBlog2.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");  
  212.         csdnBlog2.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");  
  213.         csdnBlog2.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));  
  214.         csdnBlog2.setView("200");  
  215.         csdnBlog2.setTag("JAVA,ANDROID,C++,LINUX");  
  216.           
  217.           
  218.         CsdnBlog csdnBlog3=new CsdnBlog();  
  219.         csdnBlog3.setAuthor("CCCC");  
  220.         csdnBlog3.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");  
  221.         csdnBlog3.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");  
  222.         csdnBlog3.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));  
  223.         csdnBlog3.setView("300");  
  224.         csdnBlog3.setTag("JAVA,ANDROID,C++,LINUX");  
  225.           
  226.         CsdnBlog csdnBlog4=new CsdnBlog();  
  227.         csdnBlog4.setAuthor("CCCC");  
  228.         csdnBlog4.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");  
  229.         csdnBlog4.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");  
  230.         csdnBlog4.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));  
  231.         csdnBlog4.setView("400");  
  232.         csdnBlog4.setTag("JAVA,ANDROID,C++,LINUX");  
  233.           
  234.         Bulk bulk = new Bulk.Builder()  
  235.                 .defaultIndex(indexName)  
  236.                 .defaultType(typeName)  
  237.                 .addAction(Arrays.asList(  
  238.                         new Index.Builder(csdnBlog1).build(),  
  239.                         new Index.Builder(csdnBlog2).build(),  
  240.                         new Index.Builder(csdnBlog3).build(),  
  241.                         new Index.Builder(csdnBlog4).build()  
  242.                 )).build();  
  243.         JestResult jestResult=jestClient.execute(bulk);  
  244.         System.out.println(jestResult.getJsonString());  
  245.           
  246.     }  
  247.       
  248.       
  249.       
  250.       
  251.     /**  
  252.      * 单值完全匹配查询  
  253.      * @throws Exception  
  254.      */  
  255.     @Test    
  256.     public void termQuery() throws Exception {    
  257.             
  258.         SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();    
  259.         QueryBuilder queryBuilder = QueryBuilders    
  260.             .termQuery("author", "T:o\"m-");//单值完全匹配查询    
  261.         searchSourceBuilder.query(queryBuilder);    
  262.         searchSourceBuilder.size(10);    
  263.         searchSourceBuilder.from(0);    
  264.         String query = searchSourceBuilder.toString();     
  265.         System.out.println(query);   
  266.           
  267.           
  268.         Search search = new Search.Builder(query)    
  269.                 .addIndex(indexName)    
  270.                 .addType(typeName)    
  271.                 .build();    
  272.         SearchResult result = jestClient.execute(search);   
  273.           
  274.         List<Hit<Object, Void >> hits = result.getHits(Object.class);    
  275.         System.out.println("Size:" + hits.size());    
  276.         for (Hit<Object, Void> hit : hits) {    
  277.           Object news = hit.source;    
  278.           System.out.println(news.toString());    
  279.         }    
  280.     }    
  281.       
  282.       
  283.     /**  
  284.      * 多值完全匹配查询    
  285.      * @throws Exception  
  286.      */  
  287.     @Test    
  288.     public void termsQuery() throws Exception {    
  289.             
  290.         SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();    
  291.         QueryBuilder queryBuilder = QueryBuilders    
  292.             .termsQuery("author", new String[]{ "T:o\"m-", "J,e{r}r;y:" });//多值完全匹配查询    
  293.         searchSourceBuilder.query(queryBuilder);    
  294.         searchSourceBuilder.size(10);    
  295.         searchSourceBuilder.from(0);    
  296.         String query = searchSourceBuilder.toString();     
  297.         System.out.println(query);  
  298.           
  299.         Search search = new Search.Builder(query)    
  300.                 .addIndex(indexName)    
  301.                 .addType(typeName)    
  302.                 .build();    
  303.         SearchResult result = jestClient.execute(search);   
  304.           
  305.         List<Hit<Object, Void >> hits = result.getHits(Object.class);    
  306.         System.out.println("Size:" + hits.size());    
  307.         for (Hit<Object, Void> hit : hits) {    
  308.             Object news = hit.source;    
  309.             System.out.println(news.toString());    
  310.         }    
  311.     }    
  312.        
  313.       
  314.     /**  
  315.      * 通配符和正则表达式查询    
  316.      * @throws Exception  
  317.      */  
  318.     @Test    
  319.     public void wildcardQuery() throws Exception {    
  320.             
  321.         SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();    
  322.         QueryBuilder queryBuilder = QueryBuilders    
  323.             .wildcardQuery("title", "*:*");//通配符和正则表达式查询    
  324.         searchSourceBuilder.query(queryBuilder);    
  325.         searchSourceBuilder.size(10);    
  326.         searchSourceBuilder.from(0);    
  327.         String query = searchSourceBuilder.toString();        
  328.         System.out.println(query);  
  329.           
  330.           
  331.         Search search = new Search.Builder(query)    
  332.                 .addIndex(indexName)    
  333.                 .addType(typeName)    
  334.                 .build();    
  335.         SearchResult result = jestClient.execute(search);   
  336.           
  337.         List<Hit< Object, Void>> hits =  result.getHits(Object.class);    
  338.         System.out.println("Size:" + hits.size());    
  339.         for (Hit<Object, Void > hit : hits) {    
  340.           Object news = hit.source;    
  341.           System.out.println(news.toString());    
  342.         }    
  343.     }    
  344.        
  345.       
  346.     /**  
  347.      * 前缀查询  
  348.      * @throws Exception  
  349.      */  
  350.     @Test    
  351.     public void prefixQuery() throws Exception {    
  352.             
  353.         SearchSourceBuilder searchSourceBuilder =  new SearchSourceBuilder();    
  354.         QueryBuilder queryBuilder = QueryBuilders    
  355.             .prefixQuery("name", "T:o");//前缀查询    
  356.         searchSourceBuilder.query(queryBuilder);    
  357.         searchSourceBuilder.size(10);    
  358.         searchSourceBuilder.from(0);    
  359.         String query = searchSourceBuilder.toString();        
  360.         System.out.println(query);    
  361.           
  362.         Search search = new Search.Builder(query)    
  363.                 .addIndex(indexName)    
  364.                 .addType(typeName)    
  365.                 .build();    
  366.         SearchResult result =  jestClient.execute(search);   
  367.           
  368.         List<Hit< Object, Void>> hits =  result.getHits(Object.class);    
  369.         System.out.println("Size:" + hits.size());    
  370.         for (Hit<Object, Void > hit : hits) {    
  371.           Object news =  hit.source;    
  372.           System.out.println(news.toString());    
  373.         }    
  374.     }    
  375.       
  376.       
  377.     /**  
  378.      * 区间查询    
  379.      * @throws Exception  
  380.      */  
  381.     @Test    
  382.     public void rangeQuery() throws Exception {    
  383.             
  384.         SearchSourceBuilder searchSourceBuilder =  new SearchSourceBuilder();    
  385.         QueryBuilder queryBuilder =  QueryBuilders    
  386.             .rangeQuery("birth")    
  387.             .gte("2016-09-01T00:00:00")    
  388.             .lte("2016-10-01T00:00:00")    
  389.             .includeLower(true)    
  390.             .includeUpper(true);//区间查询    
  391.         searchSourceBuilder.query(queryBuilder);    
  392.         searchSourceBuilder.size(10);    
  393.         searchSourceBuilder.from(0);    
  394.         String query =  searchSourceBuilder.toString();    
  395.         System.out.println(query);    
  396.           
  397.         Search search =  new Search.Builder(query)    
  398.                 .addIndex(indexName)    
  399.                 .addType(typeName)    
  400.                 .build();    
  401.         SearchResult result =  jestClient.execute(search);   
  402.           
  403.         List< Hit<Object, Void >>  hits =  result.getHits(Object.class);    
  404.         System.out.println("Size:" + hits.size());    
  405.         for (Hit< Object, Void > hit : hits) {    
  406.           Object news =  hit.source;    
  407.           System.out.println(news.toString());    
  408.         }    
  409.     }    
  410.       
  411.       
  412.     /**  
  413.      * 文本检索,应该是将查询的词先分成词库中存在的词,然后分别去检索,存在任一存在的词即返回,查询词分词后是OR的关系。需要转义特殊字符    
  414.      * @throws Exception  
  415.      */  
  416.     @Test    
  417.     public void queryString() throws Exception {    
  418.             
  419.         SearchSourceBuilder searchSourceBuilder =  new SearchSourceBuilder();    
  420.         //QueryBuilder queryBuilder =  QueryBuilders    
  421.         //    .queryStringQuery(QueryParser.escape("T:o\""));//文本检索,应该是将查询的词先分成词库中存在的词,然后分别去检索,存在任一存在的词即返回,查询词分词后是OR的关系。需要转义特殊字符    
  422.         //searchSourceBuilder.query(queryBuilder);    
  423.         searchSourceBuilder.size(10);    
  424.         searchSourceBuilder.from(0);    
  425.         String query =  searchSourceBuilder.toString();     
  426.         System.out.println(query);  
  427.           
  428.         Search search =  new Search.Builder(query)    
  429.                 .addIndex(indexName)    
  430.                 .addType(typeName)    
  431.                 .build();    
  432.         SearchResult result =  jestClient.execute(search);   
  433.           
  434.         List< Hit < Object, Void > >  hits =  result.getHits(Object.class);    
  435.         System.out.println("Size:" + hits.size());    
  436.         for (Hit< Object, Void > hit : hits) {    
  437.           Object news =  hit.source;    
  438.           System.out.println(news.toString());    
  439.         }    
  440.     }    
  441.       
  442.     /**  
  443.      * Count文档   
  444.      * @throws Exception  
  445.      */  
  446.     @Test    
  447.     public void count() throws Exception {    
  448.             
  449.         String[] name =  new String[]{ "T:o\"m-", "Jerry" };    
  450.         String from =  "2016-09-01T00:00:00";    
  451.         String to =  "2016-10-01T00:00:00";    
  452.         SearchSourceBuilder searchSourceBuilder =  new SearchSourceBuilder();    
  453.         QueryBuilder queryBuilder =  QueryBuilders.boolQuery()    
  454.             .must(QueryBuilders.termsQuery("name", name))    
  455.             .must(QueryBuilders.rangeQuery("birth").gte(from).lte(to));    
  456.         searchSourceBuilder.query(queryBuilder);    
  457.         String query =  searchSourceBuilder.toString();     
  458.         System.out.println(query);   
  459.          
  460.         Count count =  new Count.Builder()    
  461.                 .addIndex(indexName)    
  462.                 .addType(typeName)    
  463.                 .query(query)    
  464.                 .build();    
  465.         CountResult results =  jestClient.execute(count);     
  466.           
  467.         Double counts =  results.getCount();  
  468.         System.out.println("Count:" + counts);    
  469.     }    
  470.       
  471.      
  472.       
  473.     /**  
  474.      * 根据IDGet文档   
  475.      * @throws Exception  
  476.      */  
  477.     @Test    
  478.     public void get() throws Exception {    
  479.             
  480.         String id =  "2";    
  481.           
  482.         Get get =  new Get.Builder(indexName, id).type(typeName).build();            
  483.         JestResult result =  jestClient.execute(get);  
  484.           
  485.         if (result.isSucceeded()) {    
  486.           Object news =  result.getSourceAsObject(Object.class);    
  487.           System.out.println(news.toString());    
  488.         }    
  489.     }    
  490.       
  491.     /**  
  492.      * 根据ID删除文档  
  493.      * @throws Exception  
  494.      */  
  495.     @Test    
  496.     public void deleteIndexDocument() throws Exception {    
  497.             
  498.         String id =  "2";    
  499.         DocumentResult dr =  jestClient.execute(new Delete.Builder(id).index(indexName).type(typeName).build());   
  500.         boolean result =  dr.isSucceeded();   
  501.         System.out.println(result);    
  502.     }    
  503.       
  504.     /**  
  505.      * 删除索引  
  506.      * @throws Exception  
  507.      */  
  508.       @Test    
  509.        public void deleteIndex() throws Exception {   
  510.       
  511.         JestResult jr =  jestClient.execute(new DeleteIndex.Builder(indexName).build());   
  512.         boolean result =  jr.isSucceeded();    
  513.         System.out.println(result);    
  514.       }  
  515.       
  516.     /**  
  517.      * 将删除所有的索引  
  518.      * @throws Exception  
  519.      */  
  520.         @Test  
  521.         public  void deleteIndexAll() throws Exception {  
  522.         DeleteIndex deleteIndex =  new DeleteIndex.Builder("article").build();  
  523.         JestResult result =  jestClient.execute(deleteIndex);  
  524.         System.out.println(result.getJsonString());  
  525.     }  
  526.       
  527.       
  528.     /**  
  529.      * 清缓存  
  530.      * @throws Exception  
  531.      */  
  532.         @Test  
  533.         public  void clearCache() throws Exception {  
  534.         ClearCache closeIndex =  new ClearCache.Builder().build();  
  535.         JestResult result =  jestClient.execute(closeIndex);  
  536.         System.out.println(result.getJsonString());  
  537.     }  
  538.       
  539.     /**  
  540.      * 关闭索引  
  541.      * @throws Exception  
  542.      */  
  543.         @Test  
  544.         public  void closeIndex() throws Exception {  
  545.         CloseIndex closeIndex =  new CloseIndex.Builder("article").build();   
  546.         JestResult result =  jestClient.execute(closeIndex);  
  547.         System.out.println(result.getJsonString());  
  548.     }  
  549.   
  550.     /**  
  551.      * 优化索引  
  552.      * @throws Exception  
  553.      */  
  554.         @Test  
  555.         public  void optimize() throws Exception {  
  556.         Optimize optimize =  new Optimize.Builder().build();   
  557.         JestResult result =  jestClient.execute(optimize);  
  558.         System.out.println(result.getJsonString());  
  559.     }  
  560.   
  561.     /**  
  562.      * 刷新索引  
  563.      * @throws Exception  
  564.      */  
  565.        @Test  
  566.        public  void flush() throws Exception {  
  567.         Flush flush =  new Flush.Builder().build();   
  568.         JestResult result =  jestClient.execute(flush);  
  569.         System.out.println(result.getJsonString());  
  570.     }  
  571.   
  572.     /**  
  573.      * 判断索引目录是否存在  
  574.      * @throws Exception  
  575.      */  
  576.        @Test  
  577.        public  void indicesExists() throws Exception {  
  578.         IndicesExists indicesExists =  new IndicesExists.Builder("article").build();  
  579.         JestResult result =  jestClient.execute(indicesExists);  
  580.         System.out.println(result.getJsonString());  
  581.     }  
  582.   
  583.     /**  
  584.      * 查看节点信息  
  585.      * @throws Exception  
  586.      */  
  587.         @Test  
  588.         public  void nodesInfo() throws Exception {  
  589.         NodesInfo nodesInfo =  new NodesInfo.Builder().build();  
  590.         JestResult result =  jestClient.execute(nodesInfo);  
  591.         System.out.println(result.getJsonString());  
  592.     }  
  593.   
  594.   
  595.     /**  
  596.      * 查看集群健康信息  
  597.      * @throws Exception  
  598.      */  
  599.         @Test  
  600.         public  void health() throws Exception {  
  601.         Health health =  new Health.Builder().build();  
  602.         JestResult result =  jestClient.execute(health);  
  603.         System.out.println(result.getJsonString());  
  604.     }  
  605.   
  606.     /**  
  607.      * 节点状态  
  608.      * @throws Exception  
  609.      */  
  610.         @Test  
  611.     public  void nodesStats() throws Exception {  
  612.         NodesStats nodesStats =  new NodesStats.Builder().build();  
  613.         JestResult result =  jestClient.execute(nodesStats);  
  614.         System.out.println(result.getJsonString());  
  615.     }  
  616.       
  617.     /**  
  618.      * 分页查询  
  619.      * @throws Exception  
  620.      */  
  621.     @Test  
  622.     public  void searchPage()throws Exception{  
  623.   
  624.     }  
  625.       
  626.         /**  
  627.      * 更新Document  
  628.      * @param index  
  629.      * @param type  
  630.      * @param id  
  631.      * @throws Exception  
  632.      */  
  633.         @Test  
  634.     public  void updateDocument() throws Exception {  
  635.         CsdnBlog article =  new CsdnBlog();  
  636.           
  637.         article.setTitile("中国3颗卫星拍到阅兵现场高清照");  
  638.         article.setContent("据中国资源卫星应用中心报道,9月3日,纪念中国人民抗日战争暨世界反法西斯战争胜利70周年大阅兵在天安门广场举行。资源卫星中心针对此次盛事,综合调度在轨卫星,9月1日至3日连续三天持续观测首都北京天安门附近区域,共计安排5次高分辨率卫星成像。在阅兵当日,高分二号卫星、资源三号卫星及实践九号卫星实现三星联合、密集观测,捕捉到了阅兵现场精彩瞬间。为了保证卫星准确拍摄天安门及周边区域,提高数据处理效率,及时制作合格的光学产品,资源卫星中心运行服务人员从卫星观测计划制定、复核、优化到系统运行保障、光学产品图像制作,提前进行了周密部署,并拟定了应急预案,为圆满完成既定任务奠定了基础。");  
  639.         article.setDate(new Date().toString());  
  640.         article.setAuthor("匿名");  
  641.         article.setView("110");  
  642.         article.setTag("java,android");  
  643.           
  644.         String script =  "{" +  
  645.                 "    \"doc\" : {" +  
  646.                 "        \"title\" : \""+article.getTitile()+"\"," +  
  647.                 "        \"content\" : \""+article.getContent()+"\"," +  
  648.                 "        \"author\" : \""+article.getAuthor()+"\"," +  
  649.                 "        \"view\" : \""+article.getView()+"\"," +  
  650.                 "        \"tag\" : \""+article.getTag()+"\"," +  
  651.                 "        \"date\" : \""+new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(article.getDate())+"\"" +  
  652.                 "    }" +  
  653.                 "}";  
  654.         Update update =  new Update.Builder(script).index(indexName).type(typeName).id("").build();  
  655.         JestResult result =  jestClient.execute(update);  
  656.         System.out.println(result.getJsonString());  
  657.     }  
  658.       
  659.       
  660.        /**  
  661.      * 删除Document  
  662.      * @param index  
  663.      * @param type  
  664.      * @param id  
  665.      * @throws Exception  
  666.      */  
  667.         @Test  
  668.     public  void deleteDocument() throws Exception {  
  669.   
  670.         Delete delete =  new Delete.Builder("").index(indexName).type(typeName).build();  
  671.         JestResult result =  jestClient.execute(delete);  
  672.         System.out.println(result.getJsonString());  
  673.     }  
  674.   
  675.     /**  
  676.      * 获取Document  
  677.      * @param index  
  678.      * @param type  
  679.      * @param id  
  680.      * @throws Exception  
  681.      */  
  682.         @Test  
  683.     public  void getDocument() throws Exception {  
  684.         Get get =  new Get.Builder(indexName,"").type(typeName).build();  
  685.         JestResult result =  jestClient.execute(get);  
  686.         CsdnBlog article =  result.getSourceAsObject(CsdnBlog.class);  
  687.         System.out.println(article.getTitile()+","+article.getContent());  
  688.     }  
  689.       
  690.        /**  
  691.      * Suggestion  
  692.      * @throws Exception  
  693.      */  
  694.         @Test  
  695.     public  void suggest() throws Exception{  
  696.         String suggestionName =  "my-suggestion";  
  697.         Suggest suggest =  new Suggest.Builder("{" +  
  698.                 "  \"" + suggestionName + "\" : {" +  
  699.                 "    \"text\" : \"the amsterdma meetpu\"," +  
  700.                 "    \"term\" : {" +  
  701.                 "      \"field\" : \"body\"" +  
  702.                 "    }" +  
  703.                 "  }" +  
  704.                 "}").build();  
  705.         SuggestResult suggestResult =  jestClient.execute(suggest);  
  706.         System.out.println(suggestResult.isSucceeded());  
  707.         List< SuggestResult.Suggestion >  suggestionList =  suggestResult.getSuggestions(suggestionName);  
  708.         System.out.println(suggestionList.size());  
  709.         for(SuggestResult.Suggestion suggestion:suggestionList){  
  710.             System.out.println(suggestion.text);  
  711.         }  
  712.     }  
  713.       
  714.         /**  
  715.      * 查询全部  
  716.      * @throws Exception  
  717.      */  
  718.         @Test  
  719.     public  void searchAll() throws Exception {  
  720.         SearchSourceBuilder searchSourceBuilder =  new SearchSourceBuilder();  
  721.         searchSourceBuilder.query(QueryBuilders.matchAllQuery());  
  722.         Search search =  new Search.Builder(searchSourceBuilder.toString())  
  723.                 .addIndex(indexName)  
  724.                 .build();  
  725.         SearchResult result =  jestClient.execute(search);  
  726.         System.out.println("本次查询共查到:"+result.getTotal()+"篇文章!");  
  727.         List< Hit < CsdnBlog,Void > >  hits =  result.getHits(CsdnBlog.class);  
  728.         for (Hit< CsdnBlog, Void > hit : hits) {  
  729.             CsdnBlog source =  hit.source;  
  730.             System.out.println("标题:"+source.getTitile());  
  731.             System.out.println("内容:"+source.getContent());  
  732.             System.out.println("浏览数:"+source.getView());  
  733.             System.out.println("标签:"+source.getTag());  
  734.             System.out.println("作者:"+source.getAuthor());  
  735.         }  
  736.     }  
  737.       
  738.       
  739.     /**  
  740.      * 搜索高亮显示  
  741.      * @throws Exception  
  742.      */  
  743.     @Test  
  744.     public void createSearch() throws Exception {  
  745.         SearchSourceBuilder searchSourceBuilder =  new SearchSourceBuilder();  
  746.         searchSourceBuilder.query(QueryBuilders.termQuery("view", "200"));  
  747.         HighlightBuilder highlightBuilder =  new HighlightBuilder();  
  748.         highlightBuilder.field("view");//高亮title  
  749.         highlightBuilder.preTags("< em >").postTags(" </ em >");//高亮标签  
  750.         highlightBuilder.fragmentSize(500);//高亮内容长度  
  751.         searchSourceBuilder.highlighter(highlightBuilder);  
  752.           
  753.         System.out.println(searchSourceBuilder.toString());  
  754.   
  755.         Search search =  new Search.Builder(searchSourceBuilder.toString())  
  756.         .addIndex(indexName)  
  757.         .build();  
  758.           
  759.           
  760.         SearchResult result =  jestClient.execute(search);  
  761.         System.out.println(result.getJsonString());  
  762.         System.out.println("本次查询共查到:"+result.getTotal()+"篇文章!");  
  763.         List< Hit < CsdnBlog,Void > >  hits =  result.getHits(CsdnBlog.class);  
  764.           
  765.         System.out.println(hits.size());  
  766.         for (Hit< CsdnBlog, Void > hit : hits) {  
  767.               
  768.             CsdnBlog source =  hit.source;  
  769.             //获取高亮后的内容  
  770.             Map< String, List < String > >  highlight =  hit.highlight;  
  771.               
  772.               
  773.             List< String >  views =  highlight.get("view");//高亮后的title  
  774.             if(views!=null){  
  775.                 source.setView(views.get(0));  
  776.             }  
  777.             System.out.println("标题:"+source.getTitile());  
  778.             System.out.println("内容:"+source.getContent());  
  779.             System.out.println("浏览数:"+source.getView());  
  780.             System.out.println("标签:"+source.getTag());  
  781.             System.out.println("作者:"+source.getAuthor());  
  782.         }  
  783.     }  
  784.       
  785.       
  786.     /**  
  787.      * 分页  
  788.      * @throws IOException   
  789.      */  
  790.     @Test  
  791.     public void page() throws IOException{  
  792.           
  793.         int pageNumber= 1;  
  794.         int pageSize= 10;  
  795.           
  796.         SearchSourceBuilder searchSourceBuilder =  new SearchSourceBuilder();  
  797.         searchSourceBuilder.query(QueryBuilders.queryStringQuery("JAVA"));  
  798.         searchSourceBuilder.from((pageNumber - 1) * pageSize);//设置起始页  
  799.         searchSourceBuilder.size(pageSize);//设置页大小  
  800.         Search search =  new Search.Builder(searchSourceBuilder.toString())  
  801.                 .addIndex(indexName)// 索引名称  
  802.                 .build();  
  803.         SearchResult result =  jestClient.execute(search);  
  804.         // 自动解析  
  805.         JsonObject jsonObject =  result.getJsonObject();  
  806.         JsonObject hitsobject =  jsonObject.getAsJsonObject("hits");  
  807.         long took =  jsonObject.get("took").getAsLong();  
  808.         long total =  hitsobject.get("total").getAsLong();  
  809.         System.out.println("took:"+took+"  "+"total:"+total);  
  810.     }  
  811.       
  812. }  
package com.fendo.JestClient;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import io.searchbox.core.SearchResult.Hit;
import io.searchbox.core.Suggest;
import io.searchbox.core.SuggestResult;
import io.searchbox.core.Update;

import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.fendo.entity.CsdnBlog;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;

import io.searchbox.client.JestClient;
import io.searchbox.client.JestClientFactory;
import io.searchbox.client.JestResult;
import io.searchbox.client.config.HttpClientConfig;
import io.searchbox.cluster.Health;
import io.searchbox.cluster.NodesInfo;
import io.searchbox.cluster.NodesStats;
import io.searchbox.core.Bulk;
import io.searchbox.core.Count;
import io.searchbox.core.CountResult;
import io.searchbox.core.Delete;
import io.searchbox.core.DocumentResult;
import io.searchbox.core.Get;
import io.searchbox.core.Index;
import io.searchbox.core.Search;
import io.searchbox.core.SearchResult;
import io.searchbox.indices.ClearCache;
import io.searchbox.indices.CloseIndex;
import io.searchbox.indices.CreateIndex;
import io.searchbox.indices.DeleteIndex;
import io.searchbox.indices.Flush;
import io.searchbox.indices.IndicesExists;
import io.searchbox.indices.Optimize;
import io.searchbox.indices.mapping.PutMapping;

/**
 * Elasticserach jestClient示例
 * @author fendo
 *
 */

public class Jest {

	
	private static JestClient jestClient;
    private static String indexName = "article";  
    private static String typeName = "content"; 

    
    @Before
    public void getClient() throws Exception{
		JestClientFactory factory = new JestClientFactory();  
        factory.setHttpClientConfig(new HttpClientConfig  
                               .Builder("http://localhost:9200")  
                               .gson(new GsonBuilder().setDateFormat("yyyy-MM-dd'T'hh:mm:ss").create())  
                               .connTimeout(1500)  
                               .readTimeout(3000)  
                               .multiThreaded(true)  
                               .build());
        jestClient=factory.getObject();
    }
  
    @After
    public void tearDown() throws Exception {  
        closeJestClient(jestClient);  
    }  

      
    /**  
     * 关闭JestClient客户端  
     * @param jestClient  
     * @throws Exception  
     */  
    public void closeJestClient(JestClient jestClient) throws Exception {  
          
        if (jestClient != null) {  
          jestClient.shutdownClient();  
        }  
    }
    
    /**
     * ---------------------------测试--------------------------
     */
    
    /**
     * 创建索引
     * @throws Exception
     */
    @Test  
    public void createIndex() throws Exception {
    	
        JestResult jr = jestClient.execute(new CreateIndex.Builder(indexName).build());  
    	System.out.println(jr.isSucceeded());  
    }  
  
    
    /**
     * Put映射 
     * @throws Exception
     */
    @Test  
    public void createIndexMapping() throws Exception {  
  
        String source = "{\"" + typeName + "\":{\"properties\":{"  
                + "\"author\":{\"type\":\"string\",\"index\":\"not_analyzed\"}"  
                + ",\"title\":{\"type\":\"string\"}"
                + ",\"content\":{\"type\":\"string\"}"
                + ",\"price\":{\"type\":\"string\"}"
                + ",\"view\":{\"type\":\"string\"}"
                + ",\"tag\":{\"type\":\"string\"}"
                + ",\"date\":{\"type\":\"date\",\"format\":\"yyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis\"}"  
                + "}}}";  
        System.out.println(source);  
        
        PutMapping putMapping = new PutMapping.Builder(indexName, typeName, source).build();  
        JestResult jr = jestClient.execute(putMapping);  
        System.out.println(jr.isSucceeded());  
    }
    
    /**
     * 插入多个
     * @throws IOException 
     */
    @Test
    public void insertMultiple() throws IOException{
       	CsdnBlog csdnBlog1=new CsdnBlog();
    	csdnBlog1.setAuthor("AAAA");
    	csdnBlog1.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");
    	csdnBlog1.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");
    	csdnBlog1.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
    	csdnBlog1.setView("100");
    	csdnBlog1.setTag("JAVA,ANDROID,C++,LINUX");
    	
    	
    	CsdnBlog csdnBlog2=new CsdnBlog();
    	csdnBlog2.setAuthor("BBBB");
    	csdnBlog2.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");
    	csdnBlog2.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");
    	csdnBlog2.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
    	csdnBlog2.setView("200");
    	csdnBlog2.setTag("JAVA,ANDROID,C++,LINUX");
    	
    	
    	CsdnBlog csdnBlog3=new CsdnBlog();
    	csdnBlog3.setAuthor("CCCC");
    	csdnBlog3.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");
    	csdnBlog3.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");
    	csdnBlog3.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
    	csdnBlog3.setView("300");
    	csdnBlog3.setTag("JAVA,ANDROID,C++,LINUX");
    	
    	CsdnBlog csdnBlog4=new CsdnBlog();
    	csdnBlog4.setAuthor("CCCC");
    	csdnBlog4.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");
    	csdnBlog4.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");
    	csdnBlog4.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
    	csdnBlog4.setView("400");
    	csdnBlog4.setTag("JAVA,ANDROID,C++,LINUX");
    	
    	
    	Index index1 = new Index.Builder(csdnBlog1).index("article").type("article").build();
		Index index2 = new Index.Builder(csdnBlog2).index("article").type("article").build();
		Index index3 = new Index.Builder(csdnBlog3).index("article").type("article").build();
		Index index4 = new Index.Builder(csdnBlog4).index("article").type("article").build();

		JestResult jestResult1 = jestClient.execute(index1);
		System.out.println(jestResult1.getJsonString());
		JestResult jestResult2 = jestClient.execute(index2);
		System.out.println(jestResult2.getJsonString());
		JestResult jestResult3 = jestClient.execute(index3);
		System.out.println(jestResult3.getJsonString());
		JestResult jestResult4 = jestClient.execute(index3);
		System.out.println(jestResult4.getJsonString());
    }
    
    /**
     * Bulk插入数据
     * @throws IOException 
     */
    @Test
    public void bulkIndex() throws IOException{
    	CsdnBlog csdnBlog1=new CsdnBlog();
    	csdnBlog1.setAuthor("AAAA");
    	csdnBlog1.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");
    	csdnBlog1.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");
    	csdnBlog1.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
    	csdnBlog1.setView("100");
    	csdnBlog1.setTag("JAVA,ANDROID,C++,LINUX");
    	
    	
    	CsdnBlog csdnBlog2=new CsdnBlog();
    	csdnBlog2.setAuthor("BBBB");
    	csdnBlog2.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");
    	csdnBlog2.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");
    	csdnBlog2.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
    	csdnBlog2.setView("200");
    	csdnBlog2.setTag("JAVA,ANDROID,C++,LINUX");
    	
    	
    	CsdnBlog csdnBlog3=new CsdnBlog();
    	csdnBlog3.setAuthor("CCCC");
    	csdnBlog3.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");
    	csdnBlog3.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");
    	csdnBlog3.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
    	csdnBlog3.setView("300");
    	csdnBlog3.setTag("JAVA,ANDROID,C++,LINUX");
    	
    	CsdnBlog csdnBlog4=new CsdnBlog();
    	csdnBlog4.setAuthor("CCCC");
    	csdnBlog4.setTitile("中国获租巴基斯坦瓜达尔港2000亩土地 为期43年");
    	csdnBlog4.setContent("据了解,瓜达尔港务局于今年6月完成了1500亩土地的征收工作,另外500亩的征收工作也将很快完成");
    	csdnBlog4.setDate(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
    	csdnBlog4.setView("400");
    	csdnBlog4.setTag("JAVA,ANDROID,C++,LINUX");
    	
    	Bulk bulk = new Bulk.Builder()
				.defaultIndex(indexName)
				.defaultType(typeName)
				.addAction(Arrays.asList(
						new Index.Builder(csdnBlog1).build(),
						new Index.Builder(csdnBlog2).build(),
						new Index.Builder(csdnBlog3).build(),
						new Index.Builder(csdnBlog4).build()
				)).build();
    	JestResult jestResult=jestClient.execute(bulk);
    	System.out.println(jestResult.getJsonString());
    	
    }
    
    
    
	
    /**
     * 单值完全匹配查询
     * @throws Exception
     */
    @Test  
    public void termQuery() throws Exception {  
          
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();  
        QueryBuilder queryBuilder = QueryBuilders  
            .termQuery("author", "T:o\"m-");//单值完全匹配查询  
        searchSourceBuilder.query(queryBuilder);  
        searchSourceBuilder.size(10);  
        searchSourceBuilder.from(0);  
        String query = searchSourceBuilder.toString();   
        System.out.println(query); 
        
        
        Search search = new Search.Builder(query)  
                .addIndex(indexName)  
                .addType(typeName)  
                .build();  
        SearchResult result = jestClient.execute(search); 
        
        List<Hit<Object, Void>> hits = result.getHits(Object.class);  
        System.out.println("Size:" + hits.size());  
        for (Hit<Object, Void> hit : hits) {  
          Object news = hit.source;  
          System.out.println(news.toString());  
        }  
    }  
    
    
    /**
     * 多值完全匹配查询  
     * @throws Exception
     */
    @Test  
    public void termsQuery() throws Exception {  
          
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();  
        QueryBuilder queryBuilder = QueryBuilders  
            .termsQuery("author", new String[]{ "T:o\"m-", "J,e{r}r;y:" });//多值完全匹配查询  
        searchSourceBuilder.query(queryBuilder);  
        searchSourceBuilder.size(10);  
        searchSourceBuilder.from(0);  
        String query = searchSourceBuilder.toString();   
        System.out.println(query);
        
        Search search = new Search.Builder(query)  
                .addIndex(indexName)  
                .addType(typeName)  
                .build();  
        SearchResult result = jestClient.execute(search); 
        
        List<Hit<Object, Void>> hits = result.getHits(Object.class);  
        System.out.println("Size:" + hits.size());  
        for (Hit<Object, Void> hit : hits) {  
        	Object news = hit.source;  
            System.out.println(news.toString());  
        }  
    }  
     
    
    /**
     * 通配符和正则表达式查询  
     * @throws Exception
     */
    @Test  
    public void wildcardQuery() throws Exception {  
          
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();  
        QueryBuilder queryBuilder = QueryBuilders  
            .wildcardQuery("title", "*:*");//通配符和正则表达式查询  
        searchSourceBuilder.query(queryBuilder);  
        searchSourceBuilder.size(10);  
        searchSourceBuilder.from(0);  
        String query = searchSourceBuilder.toString();      
        System.out.println(query);
        
        
        Search search = new Search.Builder(query)  
                .addIndex(indexName)  
                .addType(typeName)  
                .build();  
        SearchResult result = jestClient.execute(search); 
        
        List<Hit<Object, Void>> hits = result.getHits(Object.class);  
        System.out.println("Size:" + hits.size());  
        for (Hit<Object, Void> hit : hits) {  
          Object news = hit.source;  
          System.out.println(news.toString());  
        }  
    }  
     
    
    /**
     * 前缀查询
     * @throws Exception
     */
    @Test  
    public void prefixQuery() throws Exception {  
          
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();  
        QueryBuilder queryBuilder = QueryBuilders  
            .prefixQuery("name", "T:o");//前缀查询  
        searchSourceBuilder.query(queryBuilder);  
        searchSourceBuilder.size(10);  
        searchSourceBuilder.from(0);  
        String query = searchSourceBuilder.toString();      
        System.out.println(query);  
        
        Search search = new Search.Builder(query)  
                .addIndex(indexName)  
                .addType(typeName)  
                .build();  
        SearchResult result = jestClient.execute(search); 
        
        List<Hit<Object, Void>> hits = result.getHits(Object.class);  
        System.out.println("Size:" + hits.size());  
        for (Hit<Object, Void> hit : hits) {  
          Object news = hit.source;  
          System.out.println(news.toString());  
        }  
    }  
    
    
    /**
     * 区间查询  
     * @throws Exception
     */
    @Test  
    public void rangeQuery() throws Exception {  
          
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();  
        QueryBuilder queryBuilder = QueryBuilders  
            .rangeQuery("birth")  
            .gte("2016-09-01T00:00:00")  
            .lte("2016-10-01T00:00:00")  
            .includeLower(true)  
            .includeUpper(true);//区间查询  
        searchSourceBuilder.query(queryBuilder);  
        searchSourceBuilder.size(10);  
        searchSourceBuilder.from(0);  
        String query = searchSourceBuilder.toString();  
        System.out.println(query);  
        
        Search search = new Search.Builder(query)  
                .addIndex(indexName)  
                .addType(typeName)  
                .build();  
        SearchResult result = jestClient.execute(search); 
        
        List<Hit<Object, Void>> hits = result.getHits(Object.class);  
        System.out.println("Size:" + hits.size());  
        for (Hit<Object, Void> hit : hits) {  
          Object news = hit.source;  
          System.out.println(news.toString());  
        }  
    }  
    
    
    /**
     * 文本检索,应该是将查询的词先分成词库中存在的词,然后分别去检索,存在任一存在的词即返回,查询词分词后是OR的关系。需要转义特殊字符  
     * @throws Exception
     */
    @Test  
    public void queryString() throws Exception {  
          
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();  
        //QueryBuilder queryBuilder = QueryBuilders  
        //    .queryStringQuery(QueryParser.escape("T:o\""));//文本检索,应该是将查询的词先分成词库中存在的词,然后分别去检索,存在任一存在的词即返回,查询词分词后是OR的关系。需要转义特殊字符  
        //searchSourceBuilder.query(queryBuilder);  
        searchSourceBuilder.size(10);  
        searchSourceBuilder.from(0);  
        String query = searchSourceBuilder.toString();   
        System.out.println(query);
        
        Search search = new Search.Builder(query)  
                .addIndex(indexName)  
                .addType(typeName)  
                .build();  
        SearchResult result = jestClient.execute(search); 
        
        List<Hit<Object, Void>> hits = result.getHits(Object.class);  
        System.out.println("Size:" + hits.size());  
        for (Hit<Object, Void> hit : hits) {  
          Object news = hit.source;  
          System.out.println(news.toString());  
        }  
    }  
    
    /**
     * Count文档 
     * @throws Exception
     */
    @Test  
    public void count() throws Exception {  
          
        String[] name = new String[]{ "T:o\"m-", "Jerry" };  
        String from = "2016-09-01T00:00:00";  
        String to = "2016-10-01T00:00:00";  
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();  
        QueryBuilder queryBuilder = QueryBuilders.boolQuery()  
            .must(QueryBuilders.termsQuery("name", name))  
            .must(QueryBuilders.rangeQuery("birth").gte(from).lte(to));  
        searchSourceBuilder.query(queryBuilder);  
        String query = searchSourceBuilder.toString();   
        System.out.println(query); 
       
        Count count = new Count.Builder()  
                .addIndex(indexName)  
                .addType(typeName)  
                .query(query)  
                .build();  
        CountResult results = jestClient.execute(count);   
        
        Double counts = results.getCount();
        System.out.println("Count:" + counts);  
    }  
    
   
    
    /**
     * 根据IDGet文档 
     * @throws Exception
     */
    @Test  
    public void get() throws Exception {  
          
        String id = "2";  
        
        Get get = new Get.Builder(indexName, id).type(typeName).build();          
        JestResult result = jestClient.execute(get);
        
        if (result.isSucceeded()) {  
          Object news = result.getSourceAsObject(Object.class);  
          System.out.println(news.toString());  
        }  
    }  
    
    /**
     * 根据ID删除文档
     * @throws Exception
     */
    @Test  
    public void deleteIndexDocument() throws Exception {  
          
        String id = "2";  
        DocumentResult dr = jestClient.execute(new Delete.Builder(id).index(indexName).type(typeName).build()); 
        boolean result = dr.isSucceeded(); 
        System.out.println(result);  
    }  
    
    /**
     * 删除索引
     * @throws Exception
     */
      @Test  
       public void deleteIndex() throws Exception { 
    
    	JestResult jr = jestClient.execute(new DeleteIndex.Builder(indexName).build()); 
        boolean result = jr.isSucceeded();  
        System.out.println(result);  
      }
    
	/**
	 * 将删除所有的索引
	 * @throws Exception
	 */
        @Test
        public  void deleteIndexAll() throws Exception {
		DeleteIndex deleteIndex = new DeleteIndex.Builder("article").build();
		JestResult result = jestClient.execute(deleteIndex);
		System.out.println(result.getJsonString());
	}
    
    
	/**
	 * 清缓存
	 * @throws Exception
	 */
        @Test
        public  void clearCache() throws Exception {
		ClearCache closeIndex = new ClearCache.Builder().build();
		JestResult result = jestClient.execute(closeIndex);
		System.out.println(result.getJsonString());
	}
    
	/**
	 * 关闭索引
	 * @throws Exception
	 */
        @Test
        public  void closeIndex() throws Exception {
		CloseIndex closeIndex = new CloseIndex.Builder("article").build(); 
		JestResult result = jestClient.execute(closeIndex);
		System.out.println(result.getJsonString());
	}

	/**
	 * 优化索引
	 * @throws Exception
	 */
        @Test
        public  void optimize() throws Exception {
		Optimize optimize = new Optimize.Builder().build(); 
		JestResult result = jestClient.execute(optimize);
		System.out.println(result.getJsonString());
	}

	/**
	 * 刷新索引
	 * @throws Exception
	 */
       @Test
       public  void flush() throws Exception {
		Flush flush = new Flush.Builder().build(); 
		JestResult result = jestClient.execute(flush);
		System.out.println(result.getJsonString());
	}

	/**
	 * 判断索引目录是否存在
	 * @throws Exception
	 */
       @Test
       public  void indicesExists() throws Exception {
		IndicesExists indicesExists = new IndicesExists.Builder("article").build();
		JestResult result = jestClient.execute(indicesExists);
		System.out.println(result.getJsonString());
	}

	/**
	 * 查看节点信息
	 * @throws Exception
	 */
        @Test
        public  void nodesInfo() throws Exception {
		NodesInfo nodesInfo = new NodesInfo.Builder().build();
		JestResult result = jestClient.execute(nodesInfo);
		System.out.println(result.getJsonString());
	}


	/**
	 * 查看集群健康信息
	 * @throws Exception
	 */
        @Test
        public  void health() throws Exception {
		Health health = new Health.Builder().build();
		JestResult result = jestClient.execute(health);
		System.out.println(result.getJsonString());
	}

	/**
	 * 节点状态
	 * @throws Exception
	 */
        @Test
	public  void nodesStats() throws Exception {
		NodesStats nodesStats = new NodesStats.Builder().build();
		JestResult result = jestClient.execute(nodesStats);
		System.out.println(result.getJsonString());
	}
    
    /**
     * 分页查询
     * @throws Exception
     */
    @Test
    public  void searchPage()throws Exception{

    }
    
        /**
	 * 更新Document
	 * @param index
	 * @param type
	 * @param id
	 * @throws Exception
	 */
        @Test
	public  void updateDocument() throws Exception {
		CsdnBlog article = new CsdnBlog();
		
		article.setTitile("中国3颗卫星拍到阅兵现场高清照");
		article.setContent("据中国资源卫星应用中心报道,9月3日,纪念中国人民抗日战争暨世界反法西斯战争胜利70周年大阅兵在天安门广场举行。资源卫星中心针对此次盛事,综合调度在轨卫星,9月1日至3日连续三天持续观测首都北京天安门附近区域,共计安排5次高分辨率卫星成像。在阅兵当日,高分二号卫星、资源三号卫星及实践九号卫星实现三星联合、密集观测,捕捉到了阅兵现场精彩瞬间。为了保证卫星准确拍摄天安门及周边区域,提高数据处理效率,及时制作合格的光学产品,资源卫星中心运行服务人员从卫星观测计划制定、复核、优化到系统运行保障、光学产品图像制作,提前进行了周密部署,并拟定了应急预案,为圆满完成既定任务奠定了基础。");
		article.setDate(new Date().toString());
		article.setAuthor("匿名");
		article.setView("110");
		article.setTag("java,android");
		
		String script = "{" +
				"    \"doc\" : {" +
				"        \"title\" : \""+article.getTitile()+"\"," +
				"        \"content\" : \""+article.getContent()+"\"," +
				"        \"author\" : \""+article.getAuthor()+"\"," +
				"        \"view\" : \""+article.getView()+"\"," +
				"        \"tag\" : \""+article.getTag()+"\"," +
				"        \"date\" : \""+new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(article.getDate())+"\"" +
				"    }" +
				"}";
		Update update = new Update.Builder(script).index(indexName).type(typeName).id("").build();
		JestResult result = jestClient.execute(update);
		System.out.println(result.getJsonString());
	}
	
    
       /**
	 * 删除Document
	 * @param index
	 * @param type
	 * @param id
	 * @throws Exception
	 */
        @Test
	public  void deleteDocument() throws Exception {

		Delete delete = new Delete.Builder("").index(indexName).type(typeName).build();
		JestResult result = jestClient.execute(delete);
		System.out.println(result.getJsonString());
	}

	/**
	 * 获取Document
	 * @param index
	 * @param type
	 * @param id
	 * @throws Exception
	 */
        @Test
	public  void getDocument() throws Exception {
		Get get = new Get.Builder(indexName,"").type(typeName).build();
		JestResult result = jestClient.execute(get);
		CsdnBlog article = result.getSourceAsObject(CsdnBlog.class);
		System.out.println(article.getTitile()+","+article.getContent());
	}
    
       /**
	 * Suggestion
	 * @throws Exception
	 */
        @Test
	public  void suggest() throws Exception{
		String suggestionName = "my-suggestion";
		Suggest suggest = new Suggest.Builder("{" +
				"  \"" + suggestionName + "\" : {" +
				"    \"text\" : \"the amsterdma meetpu\"," +
				"    \"term\" : {" +
				"      \"field\" : \"body\"" +
				"    }" +
				"  }" +
				"}").build();
		SuggestResult suggestResult = jestClient.execute(suggest);
		System.out.println(suggestResult.isSucceeded());
		List<SuggestResult.Suggestion> suggestionList = suggestResult.getSuggestions(suggestionName);
		System.out.println(suggestionList.size());
		for(SuggestResult.Suggestion suggestion:suggestionList){
			System.out.println(suggestion.text);
		}
	}
    
        /**
	 * 查询全部
	 * @throws Exception
	 */
        @Test
 	public  void searchAll() throws Exception {
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		searchSourceBuilder.query(QueryBuilders.matchAllQuery());
		Search search = new Search.Builder(searchSourceBuilder.toString())
				.addIndex(indexName)
				.build();
		SearchResult result = jestClient.execute(search);
		System.out.println("本次查询共查到:"+result.getTotal()+"篇文章!");
		List<Hit<CsdnBlog,Void>> hits = result.getHits(CsdnBlog.class);
		for (Hit<CsdnBlog, Void> hit : hits) {
			CsdnBlog source = hit.source;
			System.out.println("标题:"+source.getTitile());
			System.out.println("内容:"+source.getContent());
			System.out.println("浏览数:"+source.getView());
			System.out.println("标签:"+source.getTag());
			System.out.println("作者:"+source.getAuthor());
		}
	}
    
    
    /**
     * 搜索高亮显示
     * @throws Exception
     */
    @Test
    public void createSearch() throws Exception {
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		searchSourceBuilder.query(QueryBuilders.termQuery("view", "200"));
		HighlightBuilder highlightBuilder = new HighlightBuilder();
		highlightBuilder.field("view");//高亮title
		highlightBuilder.preTags("<em>").postTags("</em>");//高亮标签
		highlightBuilder.fragmentSize(500);//高亮内容长度
		searchSourceBuilder.highlighter(highlightBuilder);
		
		System.out.println(searchSourceBuilder.toString());

		Search search = new Search.Builder(searchSourceBuilder.toString())
        .addIndex(indexName)
        .build();
		
		
		SearchResult result = jestClient.execute(search);
		System.out.println(result.getJsonString());
		System.out.println("本次查询共查到:"+result.getTotal()+"篇文章!");
		List<Hit<CsdnBlog,Void>> hits = result.getHits(CsdnBlog.class);
		
		System.out.println(hits.size());
		for (Hit<CsdnBlog, Void> hit : hits) {
			
			CsdnBlog source = hit.source;
			//获取高亮后的内容
			Map<String, List<String>> highlight = hit.highlight;
			
			
			List<String> views = highlight.get("view");//高亮后的title
			if(views!=null){
				source.setView(views.get(0));
			}
			System.out.println("标题:"+source.getTitile());
			System.out.println("内容:"+source.getContent());
			System.out.println("浏览数:"+source.getView());
			System.out.println("标签:"+source.getTag());
			System.out.println("作者:"+source.getAuthor());
		}
	}
    
    
    /**
     * 分页
     * @throws IOException 
     */
    @Test
    public void page() throws IOException{
    	
    	int pageNumber=1;
    	int pageSize=10;
    	
    	SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    	searchSourceBuilder.query(QueryBuilders.queryStringQuery("JAVA"));
    	searchSourceBuilder.from((pageNumber - 1) * pageSize);//设置起始页
        searchSourceBuilder.size(pageSize);//设置页大小
        Search search = new Search.Builder(searchSourceBuilder.toString())
                .addIndex(indexName)// 索引名称
                .build();
        SearchResult result = jestClient.execute(search);
        // 自动解析
        JsonObject jsonObject = result.getJsonObject();
        JsonObject hitsobject = jsonObject.getAsJsonObject("hits");
        long took = jsonObject.get("took").getAsLong();
        long total = hitsobject.get("total").getAsLong();
        System.out.println("took:"+took+"  "+"total:"+total);
    }
    
}

完整项目如下:download.csdn.net/download/u0…