如题,本文主要讲关于全文搜索elasticsearch中matchQuery和termQuery的区别,附带一点其它查询用法。
准备工作,下载相关jar包,本文所有jar包列表:
apache-log4j-extras-1.2.17.jar
commons-cli-1.3.1.jar
compiler-0.8.13.jar
compress-lzf-1.0.2.jar
elasticsearch-2.3.1.jar
guava-18.0.jar
HdrHistogram-2.1.6.jar
hppc-0.7.1.jar
jackson-core-2.6.2.jar
jackson-dataformat-cbor-2.6.2.jar
jackson-dataformat-smile-2.6.2.jar
jackson-dataformat-yaml-2.6.2.jar
jna-4.1.0.jar
joda-convert-1.2.jar
joda-time-2.8.2.jar
jsr166e-1.1.0.jar
jts-1.13.jar
log4j-1.2.17.jar
lucene-analyzers-common-5.5.0.jar
lucene-backward-codecs-5.5.0.jar
lucene-core-5.5.0.jar
lucene-grouping-5.5.0.jar
lucene-highlighter-5.5.0.jar
lucene-join-5.5.0.jar
lucene-memory-5.5.0.jar
lucene-misc-5.5.0.jar
lucene-queries-5.5.0.jar
lucene-queryparser-5.5.0.jar
lucene-sandbox-5.5.0.jar
lucene-spatial3d-5.5.0.jar
lucene-spatial-5.5.0.jar
lucene-suggest-5.5.0.jar
netty-3.10.5.Final.jar
securesm-1.0.jar
snakeyaml-1.15.jar
spatial4j-0.5.jar
t-digest-3.0.jar
获取java客户端工具类:
package com.syz.es.util;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
public class EsUtil {
private static Client client = null;
public static Client getTransportClient() throws UnknownHostException {
if (client == null
|| ((TransportClient) client).connectedNodes().isEmpty()) {
synchronized (EsUtil.class) {
if (client == null
|| ((TransportClient) client).connectedNodes()
.isEmpty()) {
Settings settings = Settings.settingsBuilder()
.put("cluster.name", "elasticsearch")
.build();
client = TransportClient.builder().settings(settings)
.build()
.addTransportAddresses(
new InetSocketTransportAddress(InetAddress
.getByName("localhost"), 9300));
}
}
}
return client;
}
public static void close(Client client) {
if (client != null) {
client.close();
}
}
}
package com.syz.es.pojo;
public class User {
private String id;
private String id2;
private String name;
private int age;
private double salary;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getId2() {
return id2;
}
public void setId2(String id2) {
this.id2 = id2;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
package com.syz.es.indices;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.Requests;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import com.syz.es.util.EsUtil;
public class IndicesCreate {
public static void main(String[] args) {
Client client = null;
try {
client = EsUtil.getTransportClient();
// delete
client.admin().indices().prepareDelete("product").execute()
.actionGet();
// create
client.admin().indices().prepareCreate("product").execute()
.actionGet();
XContentBuilder mapping = XContentFactory.jsonBuilder()
.startObject().startObject("properties").startObject("id")
.field("type", "string").endObject().startObject("id2")
.field("type", "string").field("index", "not_analyzed")
.endObject().startObject("name").field("type", "string")
.endObject().startObject("age").field("type", "integer")
.endObject().startObject("salary").field("type", "double")
.endObject().endObject();
PutMappingRequest paramPutMappingRequest = Requests
.putMappingRequest("product").type("user").source(mapping);
client.admin().indices().putMapping(paramPutMappingRequest)
.actionGet();
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
}
package com.syz.es.indices;
import java.io.IOException;
import java.util.Random;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import com.syz.es.pojo.User;
import com.syz.es.util.EsUtil;
public class IndicesIndex {
private static final Random r = new Random();
private static final String pool = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String symbol = ".*&?-+@%";
public static void main(String[] args) {
Client client = null;
try {
client = EsUtil.getTransportClient();
System.out.println("number--------");
indexNumber(client);
System.out.println("lower--------");
indexLower(client);
System.out.println("upper--------");
indexUpper(client);
System.out.println("mixed--------");
indexMixed(client);
System.out.println("symbol--------");
indexSymbol(client);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
private static void indexNumber(Client client) {
for (int i = 0; i < 10; i++) {
User u = new User();
String id = 10000 + i + "";
String id2 = id;
String name = "张三";
int age = r.nextInt(100);
double salary = r.nextDouble() * 10000;
u.setId(id);
u.setId2(id2);
u.setName(name);
u.setAge(age);
u.setSalary(salary);
String json = generateJson(u);
System.out.println(i + "==data index begin:" + json);
IndexResponse response = client.prepareIndex("product", "user")
.setSource(json).get();
System.out.println(i + "==data index end:" + response.getId());
}
}
private static void indexLower(Client client) {
for (int i = 0; i < 10; i++) {
User u = new User();
String id = getRandomLower();
String id2 = id;
String name = "李四";
int age = r.nextInt(100);
double salary = r.nextDouble() * 10000;
u.setId(id);
u.setId2(id2);
u.setName(name);
u.setAge(age);
u.setSalary(salary);
String json = generateJson(u);
System.out.println(i + "==data index begin:" + json);
IndexResponse response = client.prepareIndex("product", "user")
.setSource(json).get();
System.out.println(i + "==data index end:" + response.getId());
}
}
private static void indexUpper(Client client) {
for (int i = 0; i < 10; i++) {
User u = new User();
String id = getRandomUpper();
String id2 = id;
String name = "王二麻子";
int age = r.nextInt(100);
double salary = r.nextDouble() * 10000;
u.setId(id);
u.setId2(id2);
u.setName(name);
u.setAge(age);
u.setSalary(salary);
String json = generateJson(u);
System.out.println(i + "==data index begin:" + json);
IndexResponse response = client.prepareIndex("product", "user")
.setSource(json).get();
System.out.println(i + "==data index end:" + response.getId());
}
}
private static void indexMixed(Client client) {
for (int i = 0; i < 10; i++) {
User u = new User();
String id = getRandomMixed();
String id2 = id;
String name = "店小二";
int age = r.nextInt(100);
double salary = r.nextDouble() * 10000;
u.setId(id);
u.setId2(id2);
u.setName(name);
u.setAge(age);
u.setSalary(salary);
String json = generateJson(u);
System.out.println(i + "==data index begin:" + json);
IndexResponse response = client.prepareIndex("product", "user")
.setSource(json).get();
System.out.println(i + "==data index end:" + response.getId());
}
}
private static void indexSymbol(Client client) {
for (int i = 0; i < 10; i++) {
User u = new User();
String id = getRandomSymbol();
String id2 = id;
String name = "屠夫";
int age = r.nextInt(100);
double salary = r.nextDouble() * 10000;
u.setId(id);
u.setId2(id2);
u.setName(name);
u.setAge(age);
u.setSalary(salary);
String json = generateJson(u);
System.out.println(i + "==data index begin:" + json);
IndexResponse response = client.prepareIndex("product", "user")
.setSource(json).get();
System.out.println(i + "==data index end:" + response.getId());
}
}
private static String getRandomLower() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 20; i++) {
int cidx = r.nextInt(26);
char c = (char) ('a' + cidx);
sb.append(c);
}
return sb.toString();
}
private static String getRandomUpper() {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 20; i++) {
int cidx = r.nextInt(26);
char c = (char) ('A' + cidx);
sb.append(c);
}
return sb.toString();
}
private static String getRandomMixed() {
StringBuilder sb = new StringBuilder();
int psize = pool.length();
for (int i = 0; i < 20; i++) {
int cidx = r.nextInt(psize);
char c = pool.charAt(cidx);
sb.append(c);
}
return sb.toString();
}
private static String getRandomSymbol() {
StringBuilder sb = new StringBuilder();
int psize = pool.length();
for (int i = 0; i < 5; i++) {
int cidx = r.nextInt(psize);
char c = pool.charAt(cidx);
sb.append(c);
}
int cidx2 = r.nextInt(symbol.length());
char c2 = symbol.charAt(cidx2);
sb.append(c2);
for (int i = 0; i < 14; i++) {
int cidx = r.nextInt(psize);
char c = pool.charAt(cidx);
sb.append(c);
}
return sb.toString();
}
private static String generateJson(User user) {
String json = "";
try {
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
.startObject();
contentBuilder.field("id", user.getId());
contentBuilder.field("id2", user.getId2());
contentBuilder.field("name", user.getName());
contentBuilder.field("age", user.getAge());
contentBuilder.field("salary", user.getSalary());
json = contentBuilder.endObject().string();
} catch (IOException e) {
e.printStackTrace();
}
return json;
}
}
辅助类:
package com.syz.es.search;
import java.util.Map;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
public class Printer {
public static void print(SearchHits hits) {
for (SearchHit hit : hits) {
Map map = hit.getSource();
System.out.println(map);
}
}
}
matchQuery:
package com.syz.es.search;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import com.syz.es.util.EsUtil;
public class Match {
public static void main(String[] args) {
matchAll();
matchAllSize();
matchQuery();
}
private static void matchAll() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.matchAllQuery();
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).get();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
private static void matchAllSize() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.matchAllQuery();
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).setSize(3).get();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
/**
* 默认的standard analyzer分词规则:
* 去掉大部分标点符号,并以此分割原词为多个词,把分分割后的词转为小写放入token组中。
* 对于not-analyzed的词,直接把原词放入token组中。
* matchQuery的机制是:先检查字段类型是否是analyzed,如果是,则先分词,再去去匹配token;如果不是,则直接去匹配token。
* id=id2,默认分词,id2不分词。
* 以wwIF5-vP3J4l3GJ6VN3h为例:
* id是的token组是[wwif5,vp3j4l3gj6vn3h]
* id2的token组是[wwIF5-vP3J4l3GJ6VN3h]
* 可以预计以下结果:
* 1.matchQuery("id", "字符串"),"字符串"分词后有[wwif5,vp3j4l3gj6vn3h]其中之一时,有值。
* 如:wwIF5-vP3J4l3GJ6VN3h,wwif5-vp3j4l3gj6vn3h,wwIF5,wwif5,wwIF5-6666等等。
* 2.matchQuery("id2", "wwIF5-vP3J4l3GJ6VN3h"),有值。
* 特别说明:
* 在创建索引时,如果没有指定"index":"not_analyzed"
* 会使用默认的analyzer进行分词。当然你可以指定analyzer。
* 在浏览器中输入:
* http://localhost:9200/_analyze?pretty&analyzer=standard&text=J4Kz1%26L
* bvjoQFE9gHC7H
* 可以看到J4Kz1&LbvjoQFE9gHC7H被分成了:j4kz1和lbvjoqfe9ghc7h
* %26是&符号,&?等符号是浏览器特殊符号,你懂的,可以用其它符号代替查看结果。
*/
private static void matchQuery() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.matchQuery("id",
"wwif56,vp3j4l3gj6vn3h");
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).execute().actionGet();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
}
package com.syz.es.search;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import com.syz.es.util.EsUtil;
public class Term {
public static void main(String[] args) {
termQuery();
}
/**
* 默认的standard analyzer分词规则:
* 去掉大部分标点符号,并以此分割原词为多个词,把分分割后的词转为小写放入token组中。
* 对于not-analyzed的词,直接把原词放入token组中。
* termQuery的机制是:直接去匹配token。
* id=id2,默认分词,id2不分词。
* 以wwIF5-vP3J4l3GJ6VN3h为例:
* id是的token组是[wwif5,vp3j4l3gj6vn3h]
* id2的token组是[wwIF5-vP3J4l3GJ6VN3h]
* 可以预计以下结果:
* 1.termQuery("id", "wwif5"),有值。
* 2.termQuery("id", "vp3j4l3gj6vn3h"),有值。
* 3.termQuery("id2", "wwIF5-vP3J4l3GJ6VN3h"),有值。
*/
private static void termQuery() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.termQuery("id", "wwif5");
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).execute().actionGet();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
}
1.为了方便在全文文本字段中进行这些类型的查询,Elasticsearch首先对文本分析(analyzes),然后使用结果建立一个倒排索引。
2.Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的位置组成。
一些其它查询:
package com.syz.es.search;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import com.syz.es.util.EsUtil;
public class MatchBoolean {
public static void main(String[] args) {
matchBoolean1();
matchBoolean2();
}
private static void matchBoolean1() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("age", 16))
.must(QueryBuilders.matchQuery("name", "李四"));
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).get();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
private static void matchBoolean2() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("age", 16))
.must(QueryBuilders.matchQuery("name", "李四"));
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).get();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
}
package com.syz.es.search;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import com.syz.es.util.EsUtil;
public class Terms {
public static void main(String[] args) {
termsQuery();
}
private static void termsQuery() {
Client client = null;
try {
client = EsUtil.getTransportClient();
// termsQuery的第二个参数可以是数组,也可以是集合
QueryBuilder query = QueryBuilders.termsQuery("age", new int[] {
11, 16 });
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).execute().actionGet();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
}
package com.syz.es.search;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import com.syz.es.util.EsUtil;
public class Prefix {
public static void main(String[] args) {
prefixQuery();
}
/**
* 以b3IAs@HhVBZPC6tVfyaK为例
*/
private static void prefixQuery() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.prefixQuery("id2",
"b3IAs@HhVBZPC6tVfyaK");
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).execute().actionGet();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
}
package com.syz.es.search;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import com.syz.es.util.EsUtil;
public class Range {
public static void main(String[] args) {
rangeQuery();
}
private static void rangeQuery() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.rangeQuery("age").gt(10).lt(20);
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).execute().actionGet();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
}
package com.syz.es.search;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import com.syz.es.util.EsUtil;
public class Regexp {
public static void main(String[] args) {
regexpQuery();
}
private static void regexpQuery() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.regexpQuery("id2",
"[a-z,A-Z]{5}\\+.*");
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).setFrom(0).setSize(50)
.execute().actionGet();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
}
package com.syz.es.search;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import com.syz.es.util.EsUtil;
public class Wildcard {
public static void main(String[] args) {
wildcardQuery1();
wildcardQuery2();
}
private static void wildcardQuery1() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.wildcardQuery("id", "1*");
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).execute().actionGet();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
private static void wildcardQuery2() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.wildcardQuery("id", "1000?");
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query).execute().actionGet();
SearchHits hits = response.getHits();
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
}
package com.syz.es.search;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.metrics.avg.InternalAvg;
import org.elasticsearch.search.aggregations.metrics.sum.InternalSum;
import com.syz.es.util.EsUtil;
public class Avg {
public static void main(String[] args) {
avgQuery();
}
private static void avgQuery() {
Client client = null;
try {
client = EsUtil.getTransportClient();
QueryBuilder query = QueryBuilders.matchQuery("name", "张三");
SearchResponse response = client.prepareSearch("product")
.setTypes("user").setQuery(query)
.addAggregation(
AggregationBuilders.avg("age_avg").field("age"))
.addAggregation(
AggregationBuilders.sum("salary_sum").field(
"salary"))
.execute().actionGet();
SearchHits hits = response.getHits();
InternalAvg agg = response.getAggregations().get("age_avg");
System.out.println(agg.getName() + "\t" + agg.getValue());
InternalSum agg2 = response.getAggregations().get("salary_sum");
System.out.println(agg2.getName() + "\t" + agg2.getValue());
long total = hits.getTotalHits();
System.out.println("total:" + total);
int len = hits.getHits().length;
System.out.println("len:" + len);
Printer.print(hits);
} catch (Exception e) {
e.printStackTrace();
} finally {
EsUtil.close(client);
}
}
}