elastisearch java api
package com.app.elasticsrv;
import org.apache.lucene.queryparser.flexible.core.builders.QueryBuilder;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.search.MatchQuery;
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.BucketOrder;
import org.elasticsearch.search.aggregations.bucket.range.AbstractRangeBuilder;
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregationBuilder;
import org.elasticsearch.search.aggregations.bucket.range.RangeAggregator.Range;
import org.elasticsearch.search.aggregations.metrics.cardinality.CardinalityAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.max.MaxAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.min.MinAggregationBuilder;
import org.elasticsearch.search.aggregations.metrics.sum.SumAggregationBuilder;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import static org.elasticsearch.index.query.QueryBuilders.*;
import java.io.FileFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import com.app.util.Utils;
import com.cedarsoftware.util.io.JsonWriter;
import com.fasterxml.jackson.core.json.JsonWriteContext;
public class Srcher {
private String keyWord = null; // 검색 대상
private String elastIndex = null; // 검색 대상 index
private RestHighLevelClient _client = null;
private SearchRequest searchRequest = null; // 요청
private SearchResponse searchResponse = null; // 응답
private int from; // pagination
private int size; // pagination
private Srcher(Builder builder) {
this.keyWord = builder.keyWord;
this.elastIndex = builder.elastIndex;
this.from = builder.from;
this.size = builder.size;
this.searchRequest = builder.searchRequest;
this._client = new Elasrver().srvSetting();
}
public void searchDefault() {
System.out.println("tst : " + this.keyWord);
this.searchRequest = new SearchRequest(this.elastIndex);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.query(matchQuery("name", this.keyWord))
.from(this.from)
.size(this.size)
.timeout(new TimeValue(60, TimeUnit.SECONDS));
// request
searchRequest.source(sourceBuilder);
// response
try {
this.searchResponse = this._client.search(this.searchRequest, RequestOptions.DEFAULT);
SearchHits hits = this.searchResponse.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // end of searchDefault function
/**
* aggregation : Cardinality
*/
public void resultAggregation() {
// 날짜를 기준으로 aggregation을 한다면 추천 단어로 사용할 수 있다.
CardinalityAggregationBuilder aggregation = AggregationBuilders
.cardinality("age_count")
.field("age");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.aggregation(aggregation);
// request
searchRequest.source(sourceBuilder);
// response
try {
this.searchResponse = this._client.search(this.searchRequest, RequestOptions.DEFAULT);
SearchHits hits = this.searchResponse.getHits();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // end of resultAggregation function
/**
* sum aggregation
*/
public void sumAggregationTest() {
AggregationBuilder aggregation = AggregationBuilders
.sum("total_age")
.field("age");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.query(matchQuery("name", "kim"))
.aggregation(aggregation);
// 요청
searchRequest.source(sourceBuilder);
try {
this.searchResponse = this._client.search(this.searchRequest, RequestOptions.DEFAULT);
// JSON 으로 변환
JSONObject jsonObj = Utils.fromStringToJson(this.searchResponse.toString());
System.out.println(jsonObj.get("aggregations"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // end of resultAggregation function
public void testAggregation() {
AggregationBuilder aggregation = AggregationBuilders
.cardinality("age_count")
.field("age")
.precisionThreshold(100);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.aggregation(aggregation);
// 요청
searchRequest.source(sourceBuilder);
try {
this.searchResponse = this._client.search(this.searchRequest, RequestOptions.DEFAULT);
// JSON 으로 변환
JSONObject jsonObj = Utils.fromStringToJson(this.searchResponse.toString());
System.out.println(jsonObj.get("aggregations"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// ===============================================================================================
// 추천 키워드
// =================================
public void dateAggregationTest() {
/**
* cardinality로 date 별로 aggregation을 진행한다.
*/
AggregationBuilder aggregation = AggregationBuilders
.cardinality("date_count")
.field("date")
.precisionThreshold(100);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.aggregation(aggregation);
Map<String, Object> responseData = null;
Map<String, String> tmpData = null;
Set<String> dateCollectSet = new HashSet<String>(); // 날짜 데이터를 담는다.
// 요청
searchRequest.source(sourceBuilder);
try {
this.searchResponse = this._client.search(this.searchRequest, RequestOptions.DEFAULT);
// JSON 으로 변환 -----------------------------------------------------------------
JSONObject jsonObj = Utils.fromStringToJson(this.searchResponse.toString());
JSONObject resltObj = (JSONObject) jsonObj.get("hits");
JSONArray hitObj = (JSONArray) resltObj.get("hits");
// -----------------------------------------------------------------------------
for (int i = 0; i < hitObj.size(); i++) {
responseData = (Map<String, Object>) hitObj.get(i);
tmpData = (Map<String, String>) responseData.get("_source");
//System.out.println(tmpData.get("date"));
dateCollectSet.add(tmpData.get("date"));
}
dateCollectSet.forEach(dateParam -> {
JSONObject resultObj = null;
AggregationBuilder sumAggregation = null;
SearchSourceBuilder sourceBuilderSum = null;
Map<String, Object> dataDict = null;
long countValue;
// =================================================================
sumAggregation = AggregationBuilders // <=== sum aggregation
.sum("total_date")
.field("date");
// =================================================================
sourceBuilderSum = new SearchSourceBuilder()
.query(matchQuery("date", dateParam))
.aggregation(sumAggregation);
// 요청
searchRequest.source(sourceBuilderSum);
try {
this.searchResponse = this._client.search(this.searchRequest, RequestOptions.DEFAULT);
// JSON 으로 변환
resultObj = Utils.fromStringToJson(this.searchResponse.toString());
dataDict = (Map<String, Object>) resultObj.get("hits");
countValue = (long) dataDict.get("total");
System.out.println(countValue + " : " + dateParam);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/*
AggregationBuilder aggregation = AggregationBuilders
.range("date aggregation")
.field("date")
.format("yyyy-MM-dd")
.addRange("2019-03-25", );
*/
} // end of dateAggregationTest function
/**
* ==============================================================================
* date count
* 2019-03-26
* ==============================================================================
*/
public void recommandQueryTest1() {
// tophit
BucketOrder order = null;
AggregationBuilder aggregation = AggregationBuilders
.terms("date_info")
.field("date")
.order(order.count(false));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.aggregation(aggregation);
searchRequest.source(sourceBuilder);
try {
this.searchResponse = this._client.search(this.searchRequest, RequestOptions.DEFAULT);
// JSON 으로 변환
JSONObject jsonObj = Utils.fromStringToJson(this.searchResponse.toString());
System.out.println(jsonObj);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // end of resultAggregation function
/**
* ==============================================================================
* Recommand demo code
* Aggregation Query (date range)
* 2019-03-26
* @author KimJunHyeon
* @param
* ==============================================================================
*/
public void recommandQueryTest2() {
AggregationBuilder aggregation = AggregationBuilders
.dateRange("date_range")
.field("date")
.format("yyyy-MM-dd")
.addUnboundedTo("now+2d/d")
.addUnboundedFrom("now-10d/d")
.subAggregation(
AggregationBuilders
.terms("words")
.field("word")
.size(2)
.order(BucketOrder.count(false))
);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.aggregation(aggregation);
// Elastic search server request
searchRequest.source(sourceBuilder);
try {
this.searchResponse = this._client.search(this.searchRequest, RequestOptions.DEFAULT);
JSONObject jsonObj = Utils.fromStringToJson(this.searchResponse.toString());
JSONObject dateRageObj = (JSONObject) jsonObj.get("aggregations");
Map<String, Map<String, Object>> testElement = dateRageObj;
JSONArray jsonArry = (JSONArray) testElement.get("date_range#date_range").get("buckets");
JSONObject tmpObj = null;
Map<String, Object> result = null;
for (int i = 0; i < jsonArry.size(); i++) {
tmpObj = (JSONObject) jsonArry.get(i);
result = (Map<String, Object>) tmpObj.get("sterms#words");
JSONArray jsonArrySub = (JSONArray) result.get("buckets");
for (int j = 0; j < jsonArrySub.size(); j++) {
JSONObject jsonObject = (JSONObject) jsonArrySub.get(j);
System.out.println(jsonObject.get("key"));
}
System.out.println(jsonArrySub);
//System.out.println(JsonWriter.formatJson(tmpObj.get("sterms#words").toString()));
}
//System.out.println(JsonWriter.formatJson(jsonObj.get("aggregations").toString()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // end of resultAggregation function
/**
* aggregation : 최댓값
*/
public void rangeAggregationTest2() {
AggregationBuilder aggregation = AggregationBuilders
.range("age_count")
.field("age")
.addRange(10.0, 12.0);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
.query(matchQuery("name", "kim"))
.aggregation(aggregation);
// 요청
searchRequest.source(sourceBuilder);
try {
this.searchResponse = this._client.search(this.searchRequest, RequestOptions.DEFAULT);
// JSON 으로 변환
JSONObject jsonObj = Utils.fromStringToJson(this.searchResponse.toString());
System.out.println(jsonObj.get("aggregations"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // end of resultAggregation function
public void clientNodeDie() {
if (_client != null) {
try {
_client.close();
System.out.println("client node die !!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
*
* @author user
* builder pattern
*/
public static class Builder {
private String keyWord = null; // 검색 대상
private String elastIndex = null; // 검색 대상 index
private SearchRequest searchRequest = null;
private int from; // pagination
private int size; // pagination
/**
* 검색 대상
* @param keyWord
*/
public Builder(String keyWord) {
if (keyWord == null) {
throw new IllegalArgumentException("keyWord can not be null");
}
else {
this.keyWord = keyWord;
}
}
/**
* 검색 페이지 설정
* @param from
* @param size
* @return
*/
public Builder withPagination(int from, int size) {
this.from = from;
this.size = size;
return this;
}
/**
* 검색 인덱스 설정
* @param elastIndex
* @return
*/
public Builder withIndex (String elastIndex) {
this.elastIndex = elastIndex;
searchRequest = new SearchRequest(this.elastIndex);
return this;
}
/**
*
* @return
*/
public Srcher build() {
return new Srcher(this);
}
}
}
'ELK > elasticsearch' 카테고리의 다른 글
특정 데이터 count (0) | 2019.04.10 |
---|---|
Elasticsearch basic01 (0) | 2019.04.02 |
elasticsearch python 주말에 정리할 것 (0) | 2019.03.18 |
공부중 (0) | 2019.03.18 |
java api - nestedQuery (0) | 2019.03.12 |