Elasticsearch系列(五)----JAVA客户端之TransportClient操作详解

Elasticsearch JAVA操作有三种客户端:


1、TransportClient

2、JestClient

3、RestClient


还有种是2.3中有的NodeClient,在5.5.1中好像没有了。还有种是spring-data-elasticsearch,这里先以TransportClient来讲解CRUD,所用环境为:


JDK1.8

ES5.5.1

TransportClient5.5.1



POM.XML文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.fendo</groupId>
  <artifactId>TransportClient</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>TransportClient Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
   <!-- 初始化框架的版本号 -->
	<properties>
		<spring.version>4.2.7.RELEASE</spring.version>
	</properties>
  
  <dependencies>

	<dependency>
	    <groupId>junit</groupId>
	    <artifactId>junit</artifactId>
	    <version>4.12</version>
	</dependency>

    <!-- 加入ServletAPI -->
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>javax.servlet-api</artifactId>
	    <version>3.1.0</version>
	    <scope>provided</scope>
	</dependency>
	<dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.2.0.Final</version>
     </dependency>
		
		<!-- MySQL依赖 start -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.38</version>
		</dependency>

		<!-- MySQL依赖 end -->
		
	
		<!-- 加入MyBatis 依赖 start -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.5</version>
		</dependency>
		<!-- 加入MyBatis 依赖 end -->

		<!-- Log4j start -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>

		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-1.2-api</artifactId>
		    <version>2.7</version>
		</dependency>
	
		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-slf4j-impl</artifactId>
		    <version>2.7</version>
		</dependency>
		
		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-core</artifactId>
		    <version>2.7</version>
		</dependency>
		
		<!-- Log4j end -->


		<!-- 引用c3p0 依赖 start-->
		<dependency>
		    <groupId>com.mchange</groupId>
		    <artifactId>c3p0</artifactId>
		    <version>0.9.2.1</version>
		</dependency>
		<!-- 引用c3p0 依赖 end-->

		<!-- 引用插件依赖:MyBatis整合Spring -->
		<dependency>
		    <groupId>org.mybatis</groupId>
		    <artifactId>mybatis-spring</artifactId>
		    <version>1.3.0</version>
		</dependency>
    
    	        <!-- JSTL -->
		<dependency>  
		    <groupId>javax.servlet</groupId>  
		    <artifactId>jstl</artifactId>  
		    <version>1.2</version>  
		</dependency>  
		  
		<!--  -->
		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-core</artifactId>
		    <version>2.9.0</version>
		</dependency>
		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-databind</artifactId>
		    <version>2.9.0</version>
		</dependency>
		<dependency>
		    <groupId>com.fasterxml.jackson.core</groupId>
		    <artifactId>jackson-annotations</artifactId>
		    <version>2.9.0</version>
		</dependency>
		


	<dependency>
	    <groupId>com.alibaba</groupId>
	    <artifactId>fastjson</artifactId>
	    <version>1.2.12</version>
	</dependency>
			
			
			
	<!-- Elasticserach5 -->
	<dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>5.5.1</version>
        </dependency>
		
		
   <!-- 	<dependency>
		    <groupId>org.elasticsearch.module</groupId>
		    <artifactId>reindex</artifactId>
		    <version>2.4.3</version>
		</dependency> -->
		
		
	<dependency>
              <groupId>com.google.collections</groupId>
	      <artifactId>google-collections</artifactId>
	       <version>1.0</version>
	</dependency>
		
	<!-- transport客户端 -->
	<dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.5.1</version>
        </dependency>

	<!-- IK分词器 -->
	<dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch-analysis-ik</artifactId>
            <version>5.5.1</version>
        </dependency>
        

		
  </dependencies>
  
  <repositories>
        <repository>
            <id>spring-libs-snapshot</id>
            <name>Spring Snapshot Repository</name>
            <url>http://repo.spring.io/libs-snapshot</url>
        </repository>
        <repository>
            <id>elasticsearch-releases</id>
            <url>https://artifacts.elastic.co/maven</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
  
  <build>
    <finalName>TransportClient</finalName>
         <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
  </build>
</project>


详细代码如下:

package com.fendo.temp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutionException;

import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.get.MultiGetItemResponse;
import org.elasticsearch.action.get.MultiGetResponse;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.admin.indices.analyze.AnalyzeRequest;
import org.elasticsearch.action.admin.indices.analyze.AnalyzeResponse;
import org.elasticsearch.script.Script;
import org.elasticsearch.script.ScriptType;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.MatchPhrasePrefixQueryBuilder;
import org.elasticsearch.index.query.MatchPhraseQueryBuilder;
import org.elasticsearch.action.search.MultiSearchResponse;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.search.join.ScoreMode;
import org.elasticsearch.action.admin.indices.create.CreateIndexRequestBuilder;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsRequest;
import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilder;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;
import org.elasticsearch.search.aggregations.bucket.terms.TermsAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.sum.Sum;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.FieldSortBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.elasticsearch.action.bulk.BackoffPolicy;
import org.elasticsearch.action.bulk.BulkItemResponse;
import org.elasticsearch.action.bulk.BulkProcessor;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.common.unit.ByteSizeUnit;
import org.elasticsearch.common.unit.ByteSizeValue;
import org.elasticsearch.common.unit.TimeValue;

import org.wltea.analyzer.lucene.IKAnalyzer;
import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;

import com.alibaba.fastjson.JSONObject;



public class TransportClientTest {

	
	private TransportClient client;
	
	
	private final static String article="article";
	private final static String content="content";
	
	@Before
	public void getClient() throws Exception{
        //设置集群名称
        Settings settings = Settings.builder().put("cluster.name", "my-application").build();// 集群名
        //创建client
        client  = new PreBuiltTransportClient(settings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
	}
	
	/**
	 * -----------------------------------------增(创建索引,增加映射,新增文档)
	 */
	
	
	/**
	 * 创建索引的四种方法
	 */
	
	@Test
	public void JSON(){
		String json = "{" +
		        "\"id\":\"kimchy\"," +
		        "\"postDate\":\"2013-01-30\"," +
		        "\"message\":\"trying out Elasticsearch\"" +
		    "}";

	}
	
	/**
	 * 创建索引并添加映射
	 * @throws IOException 
	 */
	@Test
	public void CreateIndexAndMapping() throws Exception{
		        
        CreateIndexRequestBuilder  cib=client.admin().indices().prepareCreate(article);
	        XContentBuilder mapping = XContentFactory.jsonBuilder()
	                .startObject()
	                    .startObject("properties") //设置之定义字段
	                      .startObject("author")
	                        .field("type","string") //设置数据类型
	                      .endObject()
	                      .startObject("title")
	                         .field("type","string")
	                      .endObject()
	                      .startObject("content")
	                         .field("type","string")
	                      .endObject()
	                      .startObject("price")
	                         .field("type","string")
	                      .endObject()
	                      .startObject("view")
	                         .field("type","string")
	                      .endObject()
	                      .startObject("tag")
	                         .field("type","string")
	                      .endObject()
	                      .startObject("date")
	                         .field("type","date")  //设置Date类型
	                         .field("format","yyyy-MM-dd HH:mm:ss") //设置Date的格式
	                      .endObject()
	                  .endObject()
	                .endObject();
	        cib.addMapping(content, mapping);
	        
	        CreateIndexResponse res=cib.execute().actionGet();
	        
	        System.out.println("----------添加映射成功----------");
	}
	
	/**
	 *  创建索引并添加文档
	 * @throws Exception
	 */
	@Test
	public void addIndexAndDocument() throws Exception{
				
		Date time = new Date();

		IndexResponse response = client.prepareIndex(article, content)
		.setSource(XContentFactory.jsonBuilder().startObject()
	    .field("id","447")
		.field("author","fendo")
		.field("title","192.138.1.2")
		.field("content","这是JAVA有关的书籍")
		.field("price","20")
		.field("view","100")
		.field("tag","a,b,c,d,e,f")
		.field("date",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time))
		.endObject())
		.get();
		System.out.println("添加索引成功,版本号:"+response.getVersion());
	}
	

	/**
	 * -------------------------------------Bulk---------------------------------
	 */
	
	
	/**
	 * bulkRequest
	 * @throws Exception
	 */
    @Test
    public void bulkRequest() throws Exception {
        BulkRequestBuilder bulkRequest = client.prepareBulk();

        Date time = new Date();
        
        // either use client#prepare, or use Requests# to directly build index/delete requests
        bulkRequest.add(client.prepareIndex(article, content, "199")
                .setSource(XContentFactory.jsonBuilder()
                        .startObject()
                        .field("id","199")
                		.field("author","fendo")
                		.field("title","BULK")
                		.field("content","这是BULK有关的书籍")
                		.field("price","40")
                		.field("view","300")
                		.field("tag","a,b,c")
                		.field("date",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time))
                        .endObject()
                )
        );

        bulkRequest.add(client.prepareIndex(article,content, "101")
                .setSource(XContentFactory.jsonBuilder()
                		.startObject()
                		.field("id","101")
                		.field("author","fendo")
                		.field("title","ACKSE")
                		.field("content","这是ACKSE有关的书籍")
                		.field("price","50")
                		.field("view","200")
                		.field("tag","a,b,c")
                		.field("date",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time))
                        .endObject()
                )
        );

        BulkResponse bulkResponse = bulkRequest.get();
        if (bulkResponse.hasFailures()) {
            // process failures by iterating through each bulk response item
        	//System.out.println(bulkResponse.getTook());
        }
    }
	
    
    
    /**设置自动提交文档
     * BulkProcessor
     * @throws Exception
     */
    @Test
    public void autoBulkProcessor() throws Exception {
        
		BulkProcessor bulkProcessor = BulkProcessor.builder(client,
	    new BulkProcessor.Listener() {
	        @Override
	        public void beforeBulk(long executionId,
	                               BulkRequest request) {
	        	//提交前调用
	
	        }
	
	        @Override
	        public void afterBulk(long executionId,
	                              BulkRequest request,
	                              BulkResponse response) {
	        	//提交结束后调用(无论成功或失败)
	        	System.out.println( "提交" + response.getItems().length + "个文档,用时"+ response.getTookInMillis() + "MS" + (response.hasFailures() ? " 有文档提交失败!" : ""));
	
	        }
	
	        @Override
	        public void afterBulk(long executionId,
	                              BulkRequest request,
	                              Throwable failure) {
	        	 //提交结束且失败时调用
	        	 System.out.println( " 有文档提交失败!after failure=" + failure);
	
	        }
	    })
		//当请求超过10000个(default=1000)或者总大小超过1GB(default=5MB)时,触发批量提交动作。
	    .setBulkActions(10000)//文档数量达到1000时提交
	    .setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB))//总文档体积达到5MB时提交 
	    .setFlushInterval(TimeValue.timeValueSeconds(5))//每5S提交一次(无论文档数量、体积是否达到阈值)
	    .setConcurrentRequests(1)//加1后为可并行的提交请求数,即设为0代表只可1个请求并行,设为1为2个并行
	    .setBackoffPolicy(
	            BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3))
	    .build();
    	
        //提交单个
        //String json = "{\"id\":\"66\",\"author\":\"ckse\",\"title\":\"windows编程\",\"content\":\"windows 32 API编程\",\"price\":\"99\",\"view\":\"222\",\"date\":\"2017-08-01 17:21:18\"}";
        //bulkProcessor.add(new IndexRequest("设置的index name", "设置的type name","要插入的文档的ID").source(json));//添加文档,以便自动提交
	     for(int i=0;i<80080;i++){
	          //业务对象
	          String json = "{\"id\":\""+i+"\",\"author\":\"ckse\",\"title\":\"windows编程\",\"content\":\"windows 32 API编程\",\"price\":\"99\",\"view\":\"222\",\"date\":\"2017-08-01 17:21:18\"}";
	          System.out.println(json);
	          bulkProcessor.add(new IndexRequest("article", "content",""+i).source(json));//添加文档,以便自动提交

	     }
	     
	     System.out.println("创建成功!!!");

    }
	
    //手动 批量更新
    @Test
    public void multipleBulkProcessor() throws Exception {

	     BulkRequestBuilder bulkRequest = client.prepareBulk();
	     for(int i=500;i<1000;i++){
	          //业务对象
	          String jsons = "{\"id\":\""+i+"\",\"author\":\"ckse\",\"title\":\"windows编程\",\"content\":\"windows 32 API编程\",\"price\":\"99\",\"view\":\"222\",\"date\":\"2017-08-01 17:21:18\"}";
	          IndexRequestBuilder indexRequest = client.prepareIndex("article", "content")
	                  //指定不重复的ID
	                  .setSource(jsons).setId(String.valueOf(i));
	          //添加到builder中
	          bulkRequest.add(indexRequest);
	     }
	     BulkResponse bulkResponse = bulkRequest.execute().actionGet();
	     if (bulkResponse.hasFailures()) {
	          // process failures by iterating through each bulk response item
	          System.out.println(bulkResponse.buildFailureMessage());
	     }
	     System.out.println("创建成功!!!"); 
    }
    
	/**
	 * 使用Bulk批量添加导入数据
	 * 
	 */
	@Test
	public void ImportBulk(){
		FileReader fr = null;
		BufferedReader bfr = null;
		String line=null;
		try {
                File file = new File("F:\\Source\\Elasticsearch\\TransportClient\\src\\main\\resources\\bulk.txt");
		        fr=new FileReader(file);
		        bfr=new BufferedReader(fr);
		        BulkRequestBuilder bulkRequest=client.prepareBulk();
		        int count=0;
		        while((line=bfr.readLine())!=null){
		            bulkRequest.add(client.prepareIndex(article,content).setSource(line));
		            if (count%10==0) {
		                bulkRequest.execute().actionGet();
		            }
		            count++;
		        }
		        bulkRequest.execute().actionGet();
		        System.out.println("导入成功!!!");
		} catch (Exception e) {
				e.printStackTrace();
		}finally {
	        try {
				bfr.close();
		        fr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	/**
	 * 使用Bulk批量导出数据
	 * @throws ExecutionException 
	 * @throws InterruptedException 
	 */
	@Test
	public void ExportBulk() throws Exception{
		
	
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
        SearchResponse response = client.prepareSearch("article").setQuery(queryBuilder).get();
        
        SearchHits resultHits = response.getHits();

        System.out.println(JSONObject.toJSON(resultHits));
        
        FileWriter fw=null;
        BufferedWriter bfw =null;
        try {
            File file = new File("F:\\Source\\Elasticsearch\\TransportClient\\src\\main\\resources\\bulk.txt");
            fw = new FileWriter(article);
            bfw = new BufferedWriter(fw);

            if (resultHits.getHits().length == 0) {
                System.out.println("查到0条数据!");

            } else {
                for (int i = 0; i < resultHits.getHits().length; i++) {
                    String jsonStr = resultHits.getHits()[i]
                            .getSourceAsString();
                    System.out.println(jsonStr);
                    bfw.write(jsonStr);
                    bfw.write("\n");
                }
            }
		} catch (Exception e) {
		   e.printStackTrace();
		}finally {
	        try {
				bfw.close();
		        fw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	/**
	 * -----------------------------------------删(删除索引,删除文档)
	 */
	
	
	/**
	 * 删除整个索引库
	 */
	@Test
	public void deleteAllIndex(){
		
		String indexName="article";
		
		/**
		 * 两种方式如下:
		 */
		
		//1)
		//可以根据DeleteIndexResponse对象的isAcknowledged()方法判断删除是否成功,返回值为boolean类型.
		DeleteIndexResponse dResponse = client.admin().indices().prepareDelete(indexName)
                .execute().actionGet();
		System.out.println("是否删除成功:"+dResponse.isAcknowledged());

		
		//2)
		//如果传人的indexName不存在会出现异常.可以先判断索引是否存在:
		IndicesExistsRequest inExistsRequest = new IndicesExistsRequest(indexName);
		
		IndicesExistsResponse inExistsResponse = client.admin().indices()
                .exists(inExistsRequest).actionGet();
		
		//根据IndicesExistsResponse对象的isExists()方法的boolean返回值可以判断索引库是否存在.
		System.out.println("是否删除成功:"+inExistsResponse.isExists());
	}
	

	/**
	 * 通过ID删除
	 */
	@Test
	public void deleteById(){
		DeleteResponse dResponse = client.prepareDelete(article,content, "AV49wyfCWmWw7AxKFxeb").execute().actionGet();
		if ("OK".equals(dResponse.status())) {
            System.out.println("删除成功");
        } else {
            System.out.println("删除失败");
        }
	}
	
	
	/**
	 * 通过Query delete删除
	 */
	@Test
	public void queryDelete() {
//		   String guid="AV49wyfCWmWw7AxKFxeb";
//		   String author="kkkkk";
//		   DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
//		         .source(article)
//		         .filter(QueryBuilders.boolQuery().must(QueryBuilders.termQuery("id", guid)).must(QueryBuilders.termQuery("author", author)).must(QueryBuilders.typeQuery(content)))
//		         .get();
	}
	
	
	/**
	 * 使用matchAllQuery删除所有文档
	 */
	@Test
	public void deleteAll(){
//		   DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
//	         .source(article)
//	         .filter(QueryBuilders.matchAllQuery())
//	         .get();
	}
	
	
	/**
	 * bulk批量通过指定id删除方法
	 */
	@Test
	public void batchUndercarriageFamilies() {
	   List<String> publishIds=new ArrayList<>();
	   publishIds.add("AV49wyfCWmWw7AxKFxeY");
	   publishIds.add("AV49wyfCWmWw7AxKFxea");
	   BulkRequestBuilder builder=client.prepareBulk();
	   for(String publishId:publishIds){
		  System.out.println(publishId);
	      builder.add(client.prepareDelete(article, content, publishId).request());
	      
	   }
	   BulkResponse bulkResponse = builder.get();
	   System.out.println(bulkResponse.status());
	}
	
	

	
	/**
	 * -----------------------------------------改()
	 */
	
	
	/**
	 * 更新文档
	 * @throws Exception
	 */
	@Test
	public void updateDocument() throws Exception{
		
		Date time = new Date();

		//创建修改请求
		UpdateRequest updateRequest = new UpdateRequest();
		updateRequest.index(article);
		updateRequest.type(content);
		updateRequest.id("AV4xv5gAZLX8AvCc6ZWZ");
		updateRequest.doc(XContentFactory.jsonBuilder()
		.startObject()
		.field("author","FKSE")
		.field("title","JAVA思想")
		.field("content","注意:这是JAVA有关的书籍")
		.field("date",new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time))
		.endObject());
		
		UpdateResponse response = client.update(updateRequest).get();
		System.out.println("更新索引成功");
	}
	
	
	
	/**
	 * -----------------------------有问题:要引入:reindex
	 */
	
	
	/**
	 * UpdateByQueryRequestBuilder
	 * @throws Exception
	 */
    @Test
    public void updateByQueryRequestBuilder() throws Exception {
//        UpdateByQueryRequestBuilder updateByQueryRequestBuilder = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);
//        updateByQueryRequestBuilder
//                .script(new Script(ScriptType.INLINE,"painless","ctx_source.likes++",null))
//                .source()
//                .setQuery(QueryBuilders.termQuery("author","kkkkk"))
//                .setIndices(article)
//                .get();
    }
	
    
    /**
     * updateByQueryRequestBuilders
     */
    @Test
    public void updateByQueryRequestBuilders(){
    	
//    	Map<String, Object> maps=new HashMap<>();
//    	maps.put("orgin_session_id", 10);
//    	maps.put("orgin_session_id", 11);
//    	maps.put("orgin_session_id", 12);
//    	maps.put("orgin_session_id", 13);
//    	
//    	Set<Map<String, Object>> docs = new HashSet<>();
//    	docs.add(maps);
//    	
//    	UpdateByQueryRequestBuilder  ubqrb = UpdateByQueryAction.INSTANCE.newRequestBuilder(client);
//        for (Map<String, Object> doc : docs) {
//            if (doc==null || doc.isEmpty()){
//                return;
//            }
//            Script script = new Script("ctx._source.price = ctx._version");
//            
//            System.out.println(doc.get("orgin_session_id"));
//            
//            //BulkIndexByScrollResponse
//            BulkByScrollResponse scrollResponse = ubqrb.source(article).script(script)
//                            .filter(QueryBuilders.matchAllQuery()).get();
//            for (BulkItemResponse.Failure failure : scrollResponse.getBulkFailures()) {
//            	System.out.println(failure.getMessage());
//            }
//        }
    }
	
    /**
     * prepareUpdate
     * @throws Exception
     */
    @Test
    public void prepareUpdate() throws Exception {
    	
        XContentBuilder endObject = XContentFactory.jsonBuilder().startObject().field("author","AAAAAAAAAAAAAAA").endObject();
        UpdateResponse response = client.prepareUpdate(article, content, "AV49wyfCWmWw7AxKFxeb").setDoc(endObject).get();
        System.out.println(response.getVersion());
        
    }
    
    
	/**
	 * -----------------------------------------查()
	 */
	
    
    
	/**
	 * 根据index、type、id进行查询
	 */
	@Test
	public void searchByIndex(){
		
		GetResponse response = client.prepareGet(article,content,"AV49wyfCWmWw7AxKFxec").execute()  
                .actionGet();  
        String json = response.getSourceAsString();  
        if (null != json) {  
        	System.out.println(json);
        } else {  
            System.out.println("未查询到任何结果!");  
        }  
	}
    
    
	/**
     * 查询article索引下的所有数据 
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-query-dsl-match-all-query.html'>
     * @throws Exception
     */
	@Test
    public  void matchAllQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
        SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit searchHit : response.getHits()) {
            println(searchHit);
        }
    }
	
	
	/**
	 * 查询article索引下的articledate的所有数据 
	 * @throws Exception
	 */
	@Test
    public void searchmethod1() throws Exception{
        SearchResponse response = client.prepareSearch(article).setTypes(content).get();
        println(response);
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
	
	/**
	 * spanFirstQuery
	 */
	@Test
	public void spanFirstQuery(){
		
		 // Span First  
		QueryBuilder queryBuilder =QueryBuilders.spanFirstQuery(  
                QueryBuilders.spanTermQuery("title", "C"),  // Query  
                30000                                             // Max查询范围的结束位置  
        );
        SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit searchHit : response.getHits()) {
            println(searchHit);
        }
	}
	
	
	/**
	 * spanNearQuery
	 */
	@Test
	public void spanNearQuery(){
		  
        // Span Near TODO NotSolved  
		QueryBuilder queryBuilder =QueryBuilders.spanNearQuery(QueryBuilders.spanTermQuery("title", "C"),1000)  
                .addClause(QueryBuilders.spanTermQuery("name", "葫芦580娃")) // Span Term Queries  
                .addClause(QueryBuilders.spanTermQuery("name", "葫芦3812娃"))  
                .addClause(QueryBuilders.spanTermQuery("name", "葫芦7139娃"));
        SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit searchHit : response.getHits()) {
            println(searchHit);
        }
	}
	
	/**
	 * spanNotQuery
	 */
	@Test
	public void spanNotQuery(){
		 // Span Not TODO NotSolved  
		QueryBuilder queryBuilder =QueryBuilders.spanNotQuery(QueryBuilders.spanTermQuery("title", "C"), null);  
        SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit searchHit : response.getHits()) {
            println(searchHit);
        }
	}
	
	/**
	 * spanOrQuery
	 */
	@Test
	public void spanOrQuery(){
		QueryBuilder queryBuilder =QueryBuilders.spanOrQuery(QueryBuilders.spanTermQuery("title", "C"));
        SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit searchHit : response.getHits()) {
            println(searchHit);
        }
	}
	
	
	public void moreLikeThisQuery(){

	}
	
	 /**
     * 指定单查询条件
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-full-text-queries.html#java-query-dsl-simple-query-string-query'>
     * @throws Exception
     */
	@Test
    public  void matchQuery() throws Exception{
        QueryBuilder qb = QueryBuilders.matchQuery(
                "title" , 
                "C"   
            );
        SearchResponse response = client.prepareSearch(article).setQuery(qb).get();
        for (SearchHit searchHit : response.getHits()) {
            println(searchHit);
        }
    }
	
	

	
	/**
     * termQuery 查询
     * @throws Exception
     */
	@Test
	public void termQuery() throws Exception{

        QueryBuilder queryBuilder = QueryBuilders.termQuery("id","11");
        SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }

	/**
     * termQuery 查询
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-term-level-queries.html'>
     * @throws Exception
     */
	@Test
    public  void termsQuerys() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.termsQuery("id","1","2");    
        SearchResponse response = client.prepareSearch("article").setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
	
	 /**
     * 范围查询RangeQuery
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-term-level-queries.html'>
     * @throws Exception
     */
	@Test
    public void rangeQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.rangeQuery("price")   
                .from(1)                            
                .to(100)                             
                .includeLower(false)                 
                .includeUpper(false);
        // A simplified form using gte, gt, lt or lte
        QueryBuilder _qb = QueryBuilders.rangeQuery("price")   
            .gte("10")                        
            .lt("20");
        SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
	
	
	/**
	 * multiMatchQuery 查询  
	 * multiMatchQuery针对的是多个field,当fieldNames有多个参数时,如field1和field2,那查询的结果中,要么field1中包含text,要么field2中包含text。
	 */
	@Test
	public void multiMatchQuery(){
		QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery("JAVA编程思想","title", "content");
		SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }	
	}
	
	/**
	 * MultiMatchQueryBuilder
	 * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-full-text-queries.html#java-query-dsl-simple-query-string-query'>
	 * @throws Exception
	 */
    @Test
    public void MultiMatchQueryBuilder() throws Exception {
        MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery("JAVA编程思想","title", "content");

        multiMatchQueryBuilder.analyzer("standard");
        multiMatchQueryBuilder.cutoffFrequency(0.001f);
        multiMatchQueryBuilder.field("title",20);
        multiMatchQueryBuilder.fuzziness(Fuzziness.TWO);
        multiMatchQueryBuilder.maxExpansions(100);
        multiMatchQueryBuilder.prefixLength(10);
        multiMatchQueryBuilder.tieBreaker(20);
        multiMatchQueryBuilder.type(MultiMatchQueryBuilder.Type.BEST_FIELDS);
        multiMatchQueryBuilder.boost(20);



       SearchResponse searchResponse =  client.prepareSearch()
                .setIndices(article)
                .setTypes(content)
                .setQuery(multiMatchQueryBuilder)
                .execute()
                .actionGet();

       for (SearchHit  searchHit: searchResponse.getHits()) {
           println(searchHit);
       }	
    }
    
    
    /**
     * MatchQueryBuilder
     * @throws Exception
     */
    @Test
    public void MatchQueryBuilder() throws Exception {
    	
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title","JAVA编程思想");
        matchQueryBuilder.fuzziness(Fuzziness.AUTO);
        SearchResponse searchResponse = client.prepareSearch()
                .setIndices(article)
                .setTypes(content)
                .setQuery(matchQueryBuilder)
                .execute()
                .actionGet();
        println(searchResponse);
    }
    
	
	 /**
     * 和matchQuery一样
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-full-text-queries.html#java-query-dsl-simple-query-string-query'>
     * @throws Exception
     */
	@Test
    public  void commonTermsQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.commonTermsQuery("id",    
                "1");
		SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }	
    }
	
	
	/**
	 * MultiGetResponse  查询多个xxx的值
	 * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-multi-get.html'>
	 * @throws Exception
	 */
    @Test
    public void MultiGetResponse() throws Exception {
        MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
                .add(article, content, "526")
                .add(article, content, "572", "582", "613")
                .get();
        for (MultiGetItemResponse itemResponse : multiGetItemResponses) {
            GetResponse response = itemResponse.getResponse();
            if (response.isExists()) {
                String json = response.getSourceAsString();
                System.out.println(json);
            }
        }
    }
	
    /**
     * +包含 -除外
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-full-text-queries.html#java-query-dsl-simple-query-string-query'>
     * @throws Exception
     */
	@Test
    public void queryStringQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("*:*");       
		SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }	
    }
	
	/**
     * +包含 -除外
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-full-text-queries.html#java-query-dsl-simple-query-string-query'>
     * @throws Exception
     */
	@Test
    public void simpleQueryStringQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.simpleQueryStringQuery("+id:1");         
		SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }	
    }


	 /**
     * existsQuery
     * 匹配含有id字段的记录
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-term-level-queries.html'>
     * @throws Exception
     */
	@Test
    public void existsQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.existsQuery("id"); 
		SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }	
    }
	
	
	 /**
     * prefixQuery  匹配包含具有指定前缀的术语的文档的查询
     * 匹配title中前缀为JAVA的记录
     * 匹配分词前缀 如果字段没分词,就匹配整个字段前缀
     * 前缀匹配(比如我要查询的是192.168.1.12,但是当输入192.168、192.168.1、192.168.1.1等的情况都会有相应结果返回,只不过是个范围)
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-term-level-queries.html'>
     * @throws Exception
     */
	@Test
    public void prefixQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.prefixQuery(
                "title",    
                "192.138"     
            );
		SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
	
	
	/**
	 * MatchPhrasePrefixQueryBuilder  为提供的字段名称和文本创建一个类型为“PHRASE_PREFIX”的匹配查询。
	 * @throws Exception
	 */
    @Test
    public void MatchPhrasePrefixQueryBuilder() throws Exception {
        String key = "C++";
        MatchPhrasePrefixQueryBuilder matchPhrasePrefixQueryBuilder = QueryBuilders.matchPhrasePrefixQuery("title",key);

        matchPhrasePrefixQueryBuilder.boost(10);
        matchPhrasePrefixQueryBuilder.analyzer("standard");
        matchPhrasePrefixQueryBuilder.slop(2);
        matchPhrasePrefixQueryBuilder.maxExpansions(100);

        SearchResponse searchResponse = client.prepareSearch()
                .setIndices(article)
                .setTypes(content)
                .setQuery(matchPhrasePrefixQueryBuilder)
                .execute()
                .actionGet();
        for (SearchHit  searchHit: searchResponse.getHits()) {
            println(searchHit);
        }
    }
	

	/**
     * wildcardQuery
     * 通配符
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-term-level-queries.html'>
     * @throws Exception
     */
	@Test
    public void wildcardQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.wildcardQuery("author", "*e");//J?V*
		SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }

    /**
     * fuzzyQuery  使用模糊查询匹配文档的查询
     * @throws Exception
     */
	@Test
    public  void fuzzyQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery(
                "author",     
                "e"    
            );
		SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }


	/**
	 * boolQuery 匹配与其他查询的布尔组合匹配的文档的查询。
	 * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-compound-queries.html'>
	 * @throws Exception
	 */
	@Test
	public void BoostQuery() throws Exception{
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
                .should(QueryBuilders.termQuery("author","eeee")).boost(100) //设置此查询的权重。 匹配此查询的文件(除正常权重之外)的得分乘以提供的提升。
                .should(QueryBuilders.termQuery("id","AV5NF_Dbhqf-jFOFkksT").boost(1));

        SearchResponse response=client.prepareSearch("article").setQuery(boolQueryBuilder).execute().get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
        
	}
	
	
	/**
	 * boolQuery
	 * @throws Exception
	 */
    @Test
    public void boolQuery() throws Exception {
        QueryBuilder qb = QueryBuilders.boolQuery()
                .must(QueryBuilders.termQuery("author", "eeee"))
                .must(QueryBuilders.termQuery("title", "JAVA思想"))
                .mustNot(QueryBuilders.termQuery("content", "C++")) //添加不得出现在匹配文档中的查询。
                .should(QueryBuilders.termQuery("id", "AV5NF_Dbhqf-jFOFkksT"))//添加应该与返回的文档匹配的子句。 对于具有no的布尔查询,子句必须一个或多个SHOULD子句且必须与文档匹配,用于布尔值查询匹配。 不允许null值。
                .filter(QueryBuilders.termQuery("price", "30.3"));//添加一个查询,必须出现在匹配的文档中,但会不贡献得分。 不允许null值。
        SearchResponse response=client.prepareSearch().setQuery(qb).execute().actionGet();
        
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
	

    /**
     * boostingQuery
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-compound-queries.html'>
     * @throws Exception
     */
    @Test
    public void boostingQuery() throws Exception {
        QueryBuilder qb = QueryBuilders.boostingQuery(
                QueryBuilders.termQuery("id","AV5NF_Dbhqf-jFOFkksR"),
                QueryBuilders.termQuery("title","C"))
                .negativeBoost(0.2f);//设置负增强因子。
        SearchResponse response=client.prepareSearch().setQuery(qb).execute().actionGet();
        
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
    
    
    
    /**
     * constantScoreQuery
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-compound-queries.html'>
     * @throws Exception
     */
    @Test
    public void constantScoreQuery() throws Exception {
        QueryBuilder qb = QueryBuilders.constantScoreQuery(
                QueryBuilders.termQuery("title","C")
        ).boost(2.0f);
        SearchResponse response=client.prepareSearch().setQuery(qb).execute().actionGet();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
    
    /**
     * disMaxQuery
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-compound-queries.html'>
     * @throws Exception
     */
    @Test
    public void disMaxQuery() throws Exception {
        QueryBuilder qb = QueryBuilders.disMaxQuery()
                .add(QueryBuilders.termQuery("id", "512"))
                .add(QueryBuilders.termQuery("author", "ckse"))
                .boost(1.2f)
                .tieBreaker(0.7f);
        SearchResponse response=client.prepareSearch().setQuery(qb).execute().actionGet();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
    
    
    /**
     * functionScoreQuery
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-compound-queries.html'>
     * @throws Exception
     */
    @Test
    public void functionScoreQuery() throws Exception {
        FunctionScoreQueryBuilder.FilterFunctionBuilder[] functions = {
                new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                        QueryBuilders.matchQuery("id", "512"),
                        ScoreFunctionBuilders.randomFunction("ABCDEF")),
                new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                        ScoreFunctionBuilders.exponentialDecayFunction("age", 0L, 1L))
        };
        QueryBuilder qb = QueryBuilders.functionScoreQuery(functions);
        SearchResponse response=client.prepareSearch().setQuery(qb).execute().actionGet();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
    
    
	/**
	 * regexpQuery 匹配包含具有指定正则表达式的术语的文档的查询。
	 * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-term-level-queries.html'>
	 * @throws Exception
	 */
    @Test
    public void regexpQuery() throws Exception {
        QueryBuilder qb = QueryBuilders.regexpQuery(
                "title",
                "*J");
        SearchResponse response=client.prepareSearch().setQuery(qb).execute().actionGet();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
	
    /**
     * typeQuery
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-term-level-queries.html'>
     * @throws Exception
     */
	@Test
    public  void typeQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.typeQuery("data");
		SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }

    /**
     * idsQuery
     * 类型是可选的
     * 指定type和id进行查询。
     * <a href='https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-term-level-queries.html'>
     * @throws Exception
     */
	@Test
    public  void idsQuery() throws Exception{
        QueryBuilder queryBuilder = QueryBuilders.idsQuery(content) 
                .addIds("512", "520", "531");
		SearchResponse response = client.prepareSearch(article).setQuery(queryBuilder).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }
	
	/**
	 * group 分组查询
	 */
	@Test
	public void group(){

	
	}
	
	/**
	 * Aggregation
	 */
    @Test
    public void Aggregation()
    {

    	BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();  
		//添加时间范围过滤  
        boolQueryBuilder.must(QueryBuilders.rangeQuery("@timestamp").format("yyyy-MM-dd HH:mm:ss").gte("").lte(""));  
        AggregationBuilder aggregationBuilder = AggregationBuilders
        		//terms(查询字段别名).field(分组字段) 
                .terms("").field("")  
                .order(Terms.Order.aggregation("", false))  
                .size(10)  
                .subAggregation(AggregationBuilders.count("").field(""));  
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch("article").setTypes("articledate")  
                .setQuery(boolQueryBuilder)  
                .addAggregation(aggregationBuilder)  
                .setSize(0);  
  
        SearchResponse sr = searchRequestBuilder.execute().actionGet();  
        Terms genders = sr.getAggregations().get("");//统计字段别名
        for (Terms.Bucket entry : genders.getBuckets()) 
		{ 
		  System.out.println((String) entry.getKey()+"-("+entry.getDocCount()+")"); 
		}
        
        
        //如想group by 时间,并且按天来进行分组
        AggregationBuilder aggregation = AggregationBuilders  
                .dateHistogram("agg")  
                .field("@timestamp")  
                .format("yyyy-MM-dd")  
                .dateHistogramInterval(DateHistogramInterval.DAY); 
        //可能有新需求,group by 时间,姓名
        //AggregationBuilder nameAgg = AggregationBuilders.terms(姓名别名).field(姓名).size(10);  
        //aggregation.subAggregation(nameAgg); 
        
        //可以能需要进行名称统计,但是需要distinct
        //aggregation.subAggregation(AggregationBuilders.cardinality(别名).field(姓名)) 
        
        //其他如下
//        (1)统计某个字段的数量  
//        ValueCountBuilder vcb=  AggregationBuilders.count("count_uid").field("uid");  
//      (2)去重统计某个字段的数量(有少量误差)  
//       CardinalityBuilder cb= AggregationBuilders.cardinality("distinct_count_uid").field("uid");  
//      (3)聚合过滤  
//      FilterAggregationBuilder fab= AggregationBuilders.filter("uid_filter").filter(QueryBuilders.queryStringQuery("uid:001"));  
//      (4)按某个字段分组  
//      TermsBuilder tb=  AggregationBuilders.terms("group_name").field("name");  
//      (5)求和  
//      SumBuilder  sumBuilder= AggregationBuilders.sum("sum_price").field("price");  
//      (6)求平均  
//      AvgBuilder ab= AggregationBuilders.avg("avg_price").field("price");  
//      (7)求最大值  
//      MaxBuilder mb= AggregationBuilders.max("max_price").field("price");   
//      (8)求最小值  
//      MinBuilder min= AggregationBuilders.min("min_price").field("price");  
//      (9)按日期间隔分组  
//      DateHistogramBuilder dhb= AggregationBuilders.dateHistogram("dh").field("date");  
//      (10)获取聚合里面的结果  
//      TopHitsBuilder thb=  AggregationBuilders.topHits("top_result");  
//      (11)嵌套的聚合  
//      NestedBuilder nb= AggregationBuilders.nested("negsted_path").path("quests");  
//      (12)反转嵌套  
//      AggregationBuilders.reverseNested("res_negsted").path("kps ");  
        
        
    }
	
	
	/**
	 * MultiSearchResponse 多字段检索
	 */
	@Test
	public void MultiSearchResponse(){
		
		
		SearchRequestBuilder srb1 = client.prepareSearch().setQuery(QueryBuilders.queryStringQuery("JAVA"));
        SearchRequestBuilder srb2 = client.prepareSearch().setQuery(QueryBuilders.matchQuery("title", "C"));

        MultiSearchResponse sr = client.prepareMultiSearch().add(srb1).add(srb2).get();

        for (MultiSearchResponse.Item item : sr.getResponses()) {
            SearchResponse response = item.getResponse();
            for (SearchHit searchHit : response.getHits()) {
                println(searchHit);
            }
        }
	}
	
	
	
	
	/**
	 * 复杂查询
	 */
	@Test
	public void complexSearch1(){
		int page=1;
		int pageSize=10;
		String keyword="";
		
		BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
		
		if(keyword!=null&&!keyword.equals("")){
		   QueryBuilder nameBuilder=QueryBuilders.matchQuery("zuName", keyword).analyzer("ik_max_word").boost(10);
		   QueryBuilder labelBuilder=QueryBuilders.matchQuery("zuLabelName", keyword).analyzer("ik_max_word").boost(10);
		   QueryBuilder categoryBuilder=QueryBuilders.matchQuery("categoryName", keyword).analyzer("ik_max_word").boost(10);
		   boolQueryBuilder.should(nameBuilder).should(labelBuilder).should(categoryBuilder);
		}else{
		   boolQueryBuilder.must(QueryBuilders.matchAllQuery());
		}
		SearchResponse response=client.prepareSearch("article").setTypes("articledate")
		      .setQuery(boolQueryBuilder)
		      .setFrom((page-1)*pageSize).setSize(pageSize)
		      .setExplain(true)
		      .get();

		SearchHits hits=response.getHits();
	}
	
	/**
	 * 复杂查询2
	 */
	@Test
	public void complexSearch2(){
		
		String relatedValue="fendo";
		String userId="1234";
		int page=1;
		int pageSize=10;
		
		BoolQueryBuilder builders=new BoolQueryBuilder();
		//加上条件
		builders.must(QueryBuilders.termQuery("userId", userId));
		if(relatedValue=="fendo"){
		   builders.must(QueryBuilders.nestedQuery("related4ZuValue",
		         QueryBuilders.boolQuery()
		                  .must(QueryBuilders.termQuery("related4ZuValue.nameValue", ""))
		                  //.must(QueryBuilders.rangeQuery("endTime").lte(LongformStringDate(System.currentTimeMillis())))
		         ,ScoreMode.None));
		}else{
		   builders.must(QueryBuilders.nestedQuery("related4ZuValue", QueryBuilders.termQuery("related4ZuValue.nameValue", ""), 
		         ScoreMode.None));
		}
		SearchResponse response=client.prepareSearch("article").setTypes("articledate")
		      .setQuery(builders).setFrom((page-1)*pageSize)
		      .setSize(pageSize)
		      .get();
		SearchHits hits=response.getHits();
	}
	
	
	/**
	 * 取查询结果总和count
	 */
	@Test
	public void countSum() {
		
		   int relatedValue=1;
		   String userId="111";
		   BoolQueryBuilder builders=new BoolQueryBuilder();
		   builders.must(QueryBuilders.termQuery("userId", userId));
		   if(relatedValue==1){
			   builders.must(QueryBuilders.nestedQuery("related4ZuValue",QueryBuilders.boolQuery()
	                     .must(QueryBuilders.termQuery("related4ZuValue.nameValue", "123"))
	                     .must(QueryBuilders.rangeQuery("endTime").lte(""))
	            ,ScoreMode.None));
		                     
		   }else{
		      builders.must(QueryBuilders.nestedQuery("related4ZuValue", QueryBuilders.termQuery("related4ZuValue.nameValue", "111"), 
		            ScoreMode.None));
		   }
		   SearchResponse response=client.prepareSearch("article").setTypes("articledate")
		         .setQuery(builders)
		         .setSize(1)
		         .get();
		   SearchHits hits=response.getHits();
		   System.out.println(hits.getTotalHits());
		}
	
	
	
	/**
	 * 聚合求和sum
	 * @param keyword
	 * @param startTime
	 * @param endTime
	 */
	@Test
	public void getPlatformZuOrdersTotalAmount() {
		
		   String keyword="";
		   String startTime="";
		   String endTime="";
		
		   BoolQueryBuilder boolQueryBuilder=QueryBuilders.boolQuery();
		   if(keyword==null||keyword.equals("")){
		      QueryBuilder queryBuilder=QueryBuilders.matchAllQuery();
		      boolQueryBuilder.must(queryBuilder);
		   }else{
		      QueryBuilder zuNameBuilder=QueryBuilders.matchQuery("zuName", keyword);
		      QueryBuilder buyerNameBuilder=QueryBuilders.matchQuery("buyerName", keyword);
		      QueryBuilder sellerNameBuilder=QueryBuilders.matchQuery("sellerName", keyword);
		      boolQueryBuilder.should(zuNameBuilder).should(buyerNameBuilder).should(sellerNameBuilder);
		      
		   }
		   if(!startTime.equals("")){
		      QueryBuilder addTimeBuilder=QueryBuilders.rangeQuery("addTime").from(startTime).to(endTime);
		      boolQueryBuilder.must(addTimeBuilder);
		   }
		   SearchResponse response=client.prepareSearch("article").setTypes("articledate")
		         .setQuery(boolQueryBuilder)
		         .addAggregation(AggregationBuilders.sum("price").field("price"))
		         .get();
		   Sum sum=response.getAggregations().get("price");
		   System.out.println(sum.getValue());
		}
	
	
	/**
	 * ---------------------------分页
	 */
	
	
	/**
	 * 使用Scroll方法分页
	 */
	@Test
	public void queryPageScroll(){
		
		QueryBuilder qb = QueryBuilders.termQuery("id", "1");

        SearchResponse scrollResp = client.prepareSearch("article")
                .addSort(FieldSortBuilder.DOC_FIELD_NAME, SortOrder.ASC)
                .setScroll(new TimeValue(60000))
                .setQuery(qb)
                .setSize(1).get(); 
        do {
            for (SearchHit hit : scrollResp.getHits().getHits()) {
                println(hit);
            }
            scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
        } while(scrollResp.getHits().getHits().length != 0); 
	}
	
	
	/**
     * 分页
     * @throws Exception
     */
	@Test
    public void fenye() throws Exception {

        SearchResponse response = client.prepareSearch("article")
                .setQuery(QueryBuilders.matchAllQuery())
                .setFrom(10) 
                .setSize(20)
                .execute().actionGet();
        for (SearchHit searchHit : response.getHits()) {
            println(searchHit);
        }

    }
	
	
    /**
     * 高亮
     * @throws Exception
     */
	@Test
    public void highlighter() throws Exception{


         QueryBuilder matchQuery = QueryBuilders.matchQuery("author", "fendo");
            HighlightBuilder hiBuilder=new HighlightBuilder();
            hiBuilder.preTags("<h2>");
            hiBuilder.postTags("</h2>");
            hiBuilder.field("author");
            // 搜索数据
            SearchResponse response = client.prepareSearch("article")
                    .setQuery(matchQuery)
                    .highlighter(hiBuilder)
                    .execute().actionGet();
            for (SearchHit searchHit : response.getHits()) {
                println(searchHit);
            }
    }
	
	
	
	
	
	/**
	 * ---------------------------分词器
	 */
	
	/**
	 * AnalyzeRequest 分词器
	 * <a href='https://www.elastic.co/guide/cn/elasticsearch/guide/current/standard-tokenizer.html'>
	 * @throws Exception
	 */
    @Test
    public void AnalyzeRequest() throws Exception {
        AnalyzeRequest analyzeRequest = new AnalyzeRequest();
        analyzeRequest.text("My œsophagus caused a débâcle");
        /**
         * whitespace (空白字符)分词器按空白字符 —— 空格、tabs、换行符等等进行简单拆分
         * letter 分词器 ,采用另外一种策略,按照任何非字符进行拆分
         * standard 分词器使用 Unicode 文本分割算法
         */
        analyzeRequest.addTokenFilter("standard");
        analyzeRequest.addCharFilter("asciifolding");
        ActionFuture<AnalyzeResponse> analyzeResponseActionFuture =  client.admin().indices().analyze(analyzeRequest);
        List<AnalyzeResponse.AnalyzeToken> analyzeTokens =  analyzeResponseActionFuture.actionGet().getTokens();
        for (AnalyzeResponse.AnalyzeToken analyzeToken : analyzeTokens){
            System.out.println(analyzeToken.getTerm());
        }
    }
	
    /**
     * IK分词器
     * @param args
     * @throws IOException
     */
    public  void IKAnalyzer(String []args) throws IOException {
        Settings settings  = Settings.EMPTY;
        IKAnalyzer analyzer = new IKAnalyzer();
        String text = "中华人民共和国国歌";
        StringReader stringReader = new StringReader(text);
        TokenStream tokenStream = analyzer.tokenStream("",stringReader);
        tokenStream.reset();
        CharTermAttribute term=tokenStream.getAttribute(CharTermAttribute.class);
        while(tokenStream.incrementToken()){
            System.out.print(term.toString()+"—");
        }
        stringReader.close();
        tokenStream.close();
    }
   
    /**
     * 输出结果SearchResponse
     * @param response
     */
    public static void println(SearchResponse response){
        System.err.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
        System.err.println(
                "getFailedShards : " + response.getFailedShards() + "\n" +
                "getNumReducePhases : " + response.getNumReducePhases() + "\n" +
                "getScrollId : " + response.getScrollId() +  "\n" +
                "getTookInMillis : " + response.getTookInMillis() + "\n" + 
                "getTotalShards : " + response.getTotalShards() +  "\n" +
                "getAggregations : " + response.getAggregations() + "\n" + 
                "getProfileResults : " + response.getProfileResults() + "\n" + 
                "getShardFailures : " + response.getShardFailures() + "\n" + 
                "getSuggest : " + response.getSuggest() + "\n" + 
                "getTook : " + response.getTook() + "\n" + 
                "isTerminatedEarly : " + response.isTerminatedEarly() + "\n" + 
                "isTimedOut : " + response.isTimedOut() + "\n" + 
                "remoteAddress : " + response.remoteAddress() + "\n" + 
                "status : " + response.status() + "\n" + 
                "getHits : " + response.getHits() 
                );
    }

    /**
     * 输出结果SearchResponse
     * @param response
     */
    public static void println(SearchHit searchHit){
        System.err.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
        System.err.println( 
                "docId : " + searchHit.docId() + "\n" +
                "getId : " + searchHit.getId() + "\n" +
                "getIndex : " + searchHit.getIndex()+ "\n" +
                "getScore : " + searchHit.getScore() + "\n" +
                "getSourceAsString : " + searchHit.getSourceAsString() + "\n" +
                "getType : " + searchHit.getType() + "\n" +
                "getVersion : " + searchHit.getVersion() + "\n" +
                "fieldsOrNull : " + searchHit.fieldsOrNull() + "\n" +
                "getExplanation : " + searchHit.getExplanation() + "\n" +
                "getFields : " + searchHit.getFields() + "\n" +
                "highlightFields : " + searchHit.highlightFields() + "\n" +
                "hasSource : " + searchHit.hasSource()
                );
    }

	
}


完整项目如下:http://download.csdn.net/download/u011781521/9964499

  • 12
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值