官方文档详见:http://www.elasticsearch.org/guide/en/elasticsearch/client/java-api/current/
本次测试使用Maven坐标如下:
<dependency>
<groupId>org.elasticsearchgroupId>
<artifactId>elasticsearchartifactId>
<version>2.2.1version>
dependency>
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
<version>2.3version>
dependency>
一、获取与关闭客户端方式:这里只用一种,另一种详见官网
public static void main(String[] args) throws UnknownHostException {
// on startup
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.200.129"), 9300));
// on shutdown
client.close();
}
二、创建索引方式:
(1)第一种方式:
//此处可以使用jackson包下ObjectMapper解析,本次使用gson
public static void indexCreate(Client client ) {
Map<String,Object> map = Maps.newHashMap();
map.put("title", "今晚打老虎");
map.put("body", "号称是赌圣的存在,1937年某一天今晚打老虎");
map.put("publish", "2016-12-5");
String s = new Gson().toJson(map);//
IndexResponse res = null;
/*第一个参数索引名称,第二个参数类型名称,与关系型数据库对应大致为:索引相当于数据库名,类型相当于表名*/
res = client.prepareIndex("chupengfei","xiaofei").setSource(s).execute().actionGet();
System.out.println(res);
//------------------------------------------------------------------
// 索引名称
String _index = res.getIndex();
System.out.println("_index: "+_index);
// 类型名称
String _type = res.getType();
System.out.println("_type: "+_type);
// 文档id
String _id = res.getId();
System.out.println("_id: "+_id);
// 版本(if it's the first time you index this document, you will get: 1)
long _version = res.getVersion();
System.out.println("_version: "+_version);
// 是否被创建is true if the document is a new one, false if it has been updated
boolean created = res.isCreated();
System.out.println("created: "+created);
// on shutdown
client.close();
}
(2)第二种方式:
//Elasticsearch提供内置的助手生成JSON内容
public static void indexCreate(Client client ) {
String jsonSource = "";
try {
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
.startObject();
contentBuilder.field("title", "今晚打老虎");
contentBuilder.field("body", "号称是赌圣的存在,1937年某一天今晚打老虎");
contentBuilder.field("publish", "2016-12-5");
jsonSource = contentBuilder.endObject().string();
} catch (IOException e) {
e.printStackTrace();
}
IndexResponse res = null;
res = client.prepareIndex("chupengfei","xiaofei").setSource(jsonSource ).execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}
三、获取索引方式:
public static void indexGet(Client client ) {
SearchResponse res = null;
res = client.prepareSearch("chupengfei").setTypes("xiaofei").get();
System.out.println(res);
// on shutdown
client.close();
}
四、删除索引方式:
public static void indexDelete(Client client, String id ) {
DeleteResponse res = null;
res = client.prepareDelete("api_test","type_test", id).execute().actionGet();
System.out.println(res.isFound());
// on shutdown
client.close();
}
五、更新索引方式:
public static void update(Client client ) throws IOException, InterruptedException, ExecutionException {
UpdateRequest req = new UpdateRequest();
req.index("search_test");
req.type("article");
req.id("5");
req.doc(jsonBuilder().startObject().field("title", "褚鹏飞222").field("body", "阳光大男孩").endObject());
client.update(req).get();
client.close();
}
六、批量更新索引方式:
public static void bulkUpdate(Client client ) throws IOException, InterruptedException, ExecutionException {
BulkRequestBuilder req = client.prepareBulk();
req.add(client.prepareIndex("search_test","article","2")
.setSource(jsonBuilder()
.startObject()
.field("title","bulk title 02 04-05")));
req.add(client.prepareIndex("search_test","article","3")
.setSource(jsonBuilder()
.startObject()
.field("title","bulk title 03 04-05")));
req.add(client.prepareIndex("search_test","article","4")
.setSource(jsonBuilder()
.startObject()
.field("title","bulk title 04 04-05")));
BulkResponse res = req.execute().actionGet();
if (res.hasFailures()){
System.out.println("Error");
} else {
System.out.println("Done");
}
client.close();
}
七、使用java api 实现简单查询:
(1)方式一:
public static void matchAllQuery(Client client ) {
SearchResponse res = null;
QueryBuilder qb = QueryBuilders.matchAllQuery();
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.setFrom(0)
.setSize(10)
.execute().actionGet();
for (SearchHit hit: res.getHits().getHits()){
System.out.println(hit.getSourceAsString());
}
// on shutdown
client.close();
}
(2)方式二:
public static void matchQuery(Client client ) {
SearchResponse res = null;
QueryBuilder qb = QueryBuilders.matchQuery("title", "bulk");
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.setFrom(0)
.setSize(10)
.execute().actionGet();
for (SearchHit hit: res.getHits().getHits()){
System.out.println(hit.getSourceAsString());
}
// on shutdown
client.close();
}
(3)方式三:
public static void multiMatchQuery(Client client ) {
SearchResponse res = null;
QueryBuilder qb = QueryBuilders
.multiMatchQuery("article","title", "body");
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.setFrom(0)
.setSize(10)
.execute().actionGet();
for (SearchHit hit: res.getHits().getHits()) {
System.out.println(hit.getSourceAsString());
}
// on shutdown
client.close();
}
(4)方式四:
public static void commonTermQuery(Client client ) {
SearchResponse res = null;
QueryBuilder qb = QueryBuilders
.commonTermsQuery("title","article");
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.setFrom(0)
.setSize(10)
.execute().actionGet();
for (SearchHit hit: res.getHits().getHits()) {
System.out.println(hit.getSourceAsString());
}
// on shutdown
client.close();
//common terms query
}
(5)方式五:
public static void termQuery(Client client ) {
SearchResponse res = null;
/*QueryBuilder qb = QueryBuilders
.termQuery("title","bulk");*/
QueryBuilder qb = QueryBuilders
.termsQuery("title","bulk");
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.addHighlightedField("title")
.setHighlighterPreTags("")
.setHighlighterPostTags("")
.setFrom(0)
.setSize(10)
.execute().actionGet();
for (SearchHit hit: res.getHits()) {
Map result = hit.highlightFields();
HighlightField highlightedSummary = result.get("title");
Text[] titleTexts = highlightedSummary.getFragments();
String allFragments = "";
for (Text text: titleTexts){
allFragments += text;
}
System.out.println(result);
System.out.println(allFragments);
}
// on shutdown
client.close();
//common terms query
}
(6)方式六:
public static void rangeQuery(Client client ) {
SearchResponse res = null;
QueryBuilder qb = QueryBuilders
.rangeQuery("like")
.gte(5)
.lt(7);
// QueryBuilder qb = QueryBuilders
// .rangeQuery("like")
// .from(5)
// .to(7)
// .includeLower(true)
// .includeUpper(false);
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.setFrom(0)
.setSize(10)
.execute().actionGet();
for (SearchHit hit: res.getHits().getHits()) {
System.out.println(hit.getSourceAsString());
}
// on shutdown
client.close();
//common terms query
}
(7)方式七:
public static void othersQuery(Client client ) {
SearchResponse res = null;
QueryBuilder qb = QueryBuilders.existsQuery("str");
//QueryBuilder qb = QueryBuilders.prefixQuery("name", "prefix");
//QueryBuilder qb = QueryBuilders.wildcardQuery("user", "k?mc*");
//QueryBuilder qb = QueryBuilders.regexpQuery("user", "k.*y");
//QueryBuilder qb = QueryBuilders.fuzzyQuery("name", "kimzhy");
//QueryBuilder qb = QueryBuilders.typeQuery("my_type");
//QueryBuilder qb = QueryBuilders.idsQuery("my_type","type2").addIds("1","2","5");
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.setFrom(0)
.setSize(10)
.execute().actionGet();
for (SearchHit hit: res.getHits().getHits()) {
System.out.println(hit.getSourceAsString());
}
// on shutdown
client.close();
//common terms query
}
八、使用java api 实现复合查询:
(1)方式一:
public static void constantScoreQuery(Client client ) {
SearchResponse res = null;
QueryBuilder qb = QueryBuilders
.constantScoreQuery(QueryBuilders.termQuery("title","article"))
.boost(2.0f);
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.setFrom(0)
.setSize(10)
.execute().actionGet();
for (SearchHit hit: res.getHits().getHits()) {
System.out.println(hit.getSourceAsString());
}
// on shutdown
client.close();
}
(2)方式二:
public static void booQuery(Client client ) {
SearchResponse res = null;
QueryBuilder qb = QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery("title","article"))
.mustNot(QueryBuilders.termQuery("title","relevance"))
.should(QueryBuilders.termQuery("title","article"))
.filter(QueryBuilders.termQuery("title","article"));
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.setFrom(0)
.setSize(10)
.execute().actionGet();
for (SearchHit hit: res.getHits().getHits()){
System.out.println(hit.getSourceAsString());
}
// on shutdown
client.close();
}
(3)方式三:
public static void disMaxQuery(Client client ) {
SearchResponse res = null;
QueryBuilder qb = QueryBuilders
.disMaxQuery()
.add(QueryBuilders.termQuery("title","article"))
.add(QueryBuilders.termQuery("title","relevance")).boost(1.2f).tieBreaker(0.7f);
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(qb)
.setFrom(0)
.setSize(10)
.execute().actionGet();
for (SearchHit hit: res.getHits().getHits()) {
System.out.println(hit.getSourceAsString());
}
// on shutdown
client.close();
}
九、使用java api 实现聚合查询:
(1)方式一:
public static void avgQuery(Client client ) {
SearchResponse res = null;
AvgBuilder agg = AggregationBuilders
.avg("avg_num")
.field("like");
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(10)
.execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}
(2)方式二:
public static void minQuery(Client client ) {
SearchResponse res = null;
MinBuilder agg = AggregationBuilders
.min("min_num")
.field("like");
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(10)
.execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}
(3)方式三:
public static void maxQuery(Client client ) {
SearchResponse res = null;
MaxBuilder agg = AggregationBuilders
.max("max_num")
.field("like");
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(10)
.execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}
(4)方式四:
public static void extendedStatsQuery(Client client ) {
SearchResponse res = null;
ExtendedStatsBuilder agg = AggregationBuilders
.extendedStats("extended_stats_num")
.field("like");
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(10)
.execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}
(5)方式五:
@SuppressWarnings("rawtypes")
public static void valueCountQuery(Client client ) {
SearchResponse res = null;
MetricsAggregationBuilder agg =
AggregationBuilders
.count("agg")
.field("like");
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(10)
.execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}
(6)方式六:
public static void percentileQuery(Client client ) {
SearchResponse res = null;
PercentilesBuilder agg = AggregationBuilders
.percentiles("percentile_num")
.field("like")
.percentiles(95,99,99.9);
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(10)
.execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}
(7)方式七:
public static void percentileRankQuery(Client client ) {
SearchResponse res = null;
PercentileRanksBuilder agg = AggregationBuilders
.percentileRanks("percentile_rank_num")
.field("like")
.percentiles(3,5);
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(10)
.execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}
(8)方式八:
@SuppressWarnings("rawtypes")
public static void rangeQuery(Client client ) {
SearchResponse res = null;
AggregationBuilder agg =
AggregationBuilders
.range("agg")
.field("like")
.addUnboundedTo(3)
.addRange(3, 5)
.addUnboundedFrom(5);
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(0)
.execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}
(9)方式九:
@SuppressWarnings("rawtypes")
public static void histogramQuery(Client client ) {
SearchResponse res = null;
AggregationBuilder agg =
AggregationBuilders
.histogram("agg")
.field("like")
.interval(2);
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(0)
.execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}
(10)方式十:
@SuppressWarnings("rawtypes")
public static void dateHistogramQuery(Client client ) {
SearchResponse res = null;
AggregationBuilder agg =
AggregationBuilders
.dateHistogram("agg")
.field("publish_date")
.interval(DateHistogramInterval.YEAR)
.minDocCount(1);
res = client.prepareSearch("search_test")
.setTypes("article")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.addAggregation(agg)
.setFrom(0)
.setSize(0)
.execute().actionGet();
System.out.println(res);
// on shutdown
client.close();
}