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()
- );
- }
- }