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