1衡怀、配置
/**
* 連接池
*/
private static String POOL_SIZE = "5";
TransportClient client;
//es 客戶端名稱 例如my-application
private static final String ES_CLUSTER_NAME = "es.cluster.name";
//服務(wù)地址
private static final String ES_HOST_NAME = "es.host.name";
//端口號 例如 默認(rèn)是 9300
private static final String ES_PORT = "es.port";
//es搜索歷史索引名稱
private static final String SEARCH_HISTORY = "myFirstIndex";
2澄惊、初始化
public void init() {
// 配置信息
Settings esSetting = Settings.builder()
.put("cluster.name", AppContext.current().getConfig().getProperty(ES_CLUSTER_NAME))
.put("thread_pool.search.size", Integer.parseInt(POOL_SIZE))//增加線程池個數(shù)撒穷,暫時設(shè)為5
.build();
//配置信息Settings自定義
client = new PreBuiltTransportClient(esSetting);
TransportAddress transportAddress = null;
try {
transportAddress = new TransportAddress
(InetAddress.getByName(AppContext.current().getConfig().getProperty(ES_HOST_NAME))
, Integer.valueOf(AppContext.current().getConfig().getProperty(ES_PORT)));
} catch (UnknownHostException e) {
e.printStackTrace();
}
client.addTransportAddresses(transportAddress);
}
3捕儒、使用方法 - 增刪改查(封裝好的)
新增 prepareIndex
/**
*根據(jù)id隐圾,新增實體數(shù)據(jù)望几,如果id存在會默認(rèn)更新實體數(shù)據(jù)绩脆。參數(shù) jsonObject 是json格式
**/
public IndexResponse getDocHistoryIndex(JSONObject jsonObject, String id) {
IndexResponse response = getClient().prepareIndex(SEARCH_HISTORY, "_doc", id)
.setSource(jsonObject.toString(), XContentType.JSON).get();
return response;
}
更新 prepareUpdate
/**
*根據(jù)id,和實體數(shù)據(jù)更新
* @param jsonObject
* @param id
* @return
*/
public UpdateResponse updateDocHistoryIndex(JSONObject jsonObject, String id) {
UpdateResponse updateResponse = getClient().prepareUpdate(SEARCH_HISTORY, "_doc", id)
.setDoc(jsonObject.toString(), XContentType.JSON).execute().actionGet();
return updateResponse;
}
查詢 獲取 SearchRequestBuilder對象
/**
*獲取 SearchRequestBuilder對象
**/
public SearchRequestBuilder prepareHistorySearch() {
SearchRequestBuilder searchRequestBuilder = getClient().prepareSearch(SEARCH_HISTORY).
setSearchType(SearchType.DFS_QUERY_THEN_FETCH);
return searchRequestBuilder;
}
刪除 prepareDelete
/**
*根據(jù)id刪除
**/
public DeleteResponse prepareHistoryDelete(String documentId) {
DeleteResponse deleteResponse = getClient().prepareDelete(SEARCH_HISTORY, "_doc", documentId).get();
return deleteResponse;
}
根據(jù)id查詢 prepareGet
public GetResponse getHistoryById(String id) {
GetRequestBuilder getRequestBuilder = getClient().prepareGet(SEARCH_HISTORY, "_doc", id);
GetResponse response = getRequestBuilder.get();
return response;
}
批量更新某個字段 UpdateByQueryRequestBuilder(查詢并更新)
/**
*先查詢結(jié)果集--然后 批量更新某個字段
*/
public UpdateByQueryRequestBuilder updateByQueryRequestBuilder() {
UpdateByQueryRequestBuilder updateByQuery = new UpdateByQueryRequestBuilder(client, UpdateByQueryAction.INSTANCE)
.source(SEARCH_HISTORY);
return updateByQuery;
}
//例子:
/**
* 批量更新某個字段值 業(yè)務(wù)是:根據(jù)條件查出結(jié)果然后.script腳本對要更新的字段操作,如把結(jié)果集字段isDelete 狀態(tài)改成1 批量邏輯刪除操作橄妆。
*/
public Result clearAllHistory() {
Result result = new Result();
try {
UpdateByQueryRequestBuilder updateByQuery = clientUtil.updateByQueryRequestBuilder()
//查詢要修改的結(jié)果集
.filter(QueryBuilders.termQuery("isDelete", 0))
//修改操作
.script(new Script("ctx._source['isDelete'] = '1'"));
//響應(yīng)結(jié)果集
BulkByScrollResponse response = updateByQuery.get();
long updated = response.getUpdated();
result.setMessage("刪除" + updated + "個");
} catch (Exception e) {
e.printStackTrace();
result.setSuccess(false);
result.setMessage(TipMessage.DELETE_FAIL);
}
return result;
}
高亮字段處理 HighlightField
/**
* 高亮結(jié)果集 特殊處理
*
* @param esDocForm 查出來的對象
* @SearchHit
* @param highlightField 要高亮的字段
*@content 要處理的字段內(nèi)容
例如:查出來一篇文檔衙伶,我只要匹配到的關(guān)鍵字那一小段內(nèi)容,供前端顯示使用(百度文檔形式)
*/
private void setSearchResponse(EsDocForm esDocForm, SearchHit next, String highlightField, String content) {
StringBuffer stringBuffer = new StringBuffer();
HighlightField highlightDocNameField = next.getHighlightFields().get(highlightField);
Map<String, HighlightField> highlightFields = next.getHighlightFields();
HighlightField highlightContent = highlightFields.get(content);
//處理文檔內(nèi)容
if (highlightContent != null) {
Text[] contentText = highlightContent.getFragments();
//出來文檔內(nèi)容里關(guān)鍵字提取
if (contentText != null) {
//只取一段
esDocForm.setContent(contentText[0].string() + "...");
}
}
if (highlightDocNameField != null) {
Text[] docNameText = highlightDocNameField.getFragments();
if (docNameText != null) {
for (Text str : docNameText) {
stringBuffer.append(str.string());
}
esDocForm.setDocName(stringBuffer.toString());
}
}
}
統(tǒng)計AggregationBuilder
/**
* 統(tǒng)計查詢 根據(jù)時間段 統(tǒng)計不同類型的總數(shù)
*例:要查詢出7天內(nèi)害碾,不同文件類型文件有多少矢劲,如pdf、doc類型有多少個
*/
//部分代碼
boolQueryBuilder 是你的查詢條件 searchFiled 是你的分類字段
AggregationBuilder oneAgg
= AggregationBuilders.terms(searchFiled).field(searchFiled);
SearchRequestBuilder searchRequestBuilder = clientUtil.prepareDocSearch().setQuery(boolQueryBuilder).addAggregation(oneAgg);
SearchResponse searchResponse = searchRequestBuilder.get();
關(guān)閉資源
/**
* 關(guān)閉
*/
public void close() {
if (client != null) {
client.close();
}
}
5.6版本之后可使用高級客戶端Java High Level REST Client初始化需要Java 1.8慌随,并依賴于Elasticsearch核心項目芬沉,客戶端版本與客戶端開發(fā)的Elasticsearch版本相同,它接受與TransportClient相同的請求參數(shù)阁猜,并返回相同的響應(yīng)對象