```java
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHost;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Test;
import java.io.IOException;
@Slf4j
public class DocumentOperation {
/**
* 新增文檔
*/
@Test
public void insertDocument() throws IOException {
//獲取elasticsearch客戶端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//創建請求對象
IndexRequest request = new IndexRequest();
//設置索引與此次新增的文檔id
request.index("user").id("1001");
//插入的數據
User user = User.builder().name("zhangsan").age(30).sex("男").build();
//向elasticsearch插入數據,必須將數據轉換位JSON格式
ObjectMapper mapper = new ObjectMapper();
String userJson = mapper.writeValueAsString(user);
request.source(userJson, XContentType.JSON);
//發送請求并獲取響應
IndexResponse response = client.index(request, RequestOptions.DEFAULT);
log.info("{}", response.toString());
//IndexResponse[index=user,type=_doc,id=1001,version=1,
// result=created,seqNo=0,primaryTerm=1,shards={"total":2,"successful":1,"failed":0}]
//關閉連接
client.close();
}
/**
* 查詢文檔
*/
@Test
public void searchDocument() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//設置查詢的索引與文檔id
GetRequest request = new GetRequest().index("user").id("1001");
//發送請求并獲取響應
GetResponse response = client.get(request, RequestOptions.DEFAULT);
log.info(response.toString());
//{"_index":"user","_type":"_doc","_id":"1001","_version":1,"_seq_no":0,"
// _primary_term":1,"found":true,"_source":{"name":"zhangsan","sex":"男","age":30}}
}
/**
* 修改文檔
* 如果文檔不存在則拋出異常
*/
@Test
public void updateDocument() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
UpdateRequest request = new UpdateRequest();
//要修改的索引與文檔id
request.index("user").id("1001");
//要修改的字段
request.doc(XContentType.JSON, "age", 26, "sex", "女");
//發送請求并獲取響應
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
log.info(response.toString());
//UpdateResponse[index=user,type=_doc,id=1001,version=2,seqNo=1,primaryTerm=1,
// result=updated,shards=ShardInfo{total=2, successful=1, failures=[]}]
client.close();
}
/**
* 刪除文檔
*/
@Test
public void deleteDocument() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//設置索引與文檔id
DeleteRequest request = new DeleteRequest().index("user").id("1001");
//客戶端發送請求,獲取響應對象
DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
//DeleteResponse[index=user,type=_doc,id=1001,version=8,result=deleted
// ,shards=ShardInfo{total=2, successful=1, failures=[]}]
log.info(response.toString());
client.close();
}
/**
* 批量新增
*/
@Test
public void batchInsertDocument() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//批量請求對象
BulkRequest request = new BulkRequest();
//批量添加數據
request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age", 30, "sex", "男"));
request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi", "age", 30, "sex", "女"));
request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu", "age", 40, "sex", "男"));
request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "wangwu1", "age", 40, "sex", "女"));
request.add(new IndexRequest().index("user").id("1005").source(XContentType.JSON, "name", "wangwu2", "age", 50, "sex", "男"));
request.add(new IndexRequest().index("user").id("1006").source(XContentType.JSON, "name", "wangwu3", "age", 50, "sex", "男"));
request.add(new IndexRequest().index("user").id("1007").source(XContentType.JSON, "name", "wangwu44", "age", 60, "sex", "男"));
request.add(new IndexRequest().index("user").id("1008").source(XContentType.JSON, "name", "wangwu555", "age", 60, "sex", "男"));
request.add(new IndexRequest().index("user").id("1009").source(XContentType.JSON, "name", "wangwu66666", "age", 60, "sex", "男"));
//發送請求并獲取響應
BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
//_took(花費的時間),59ms
log.info("_took(花費的時間),{}", response.getTook());
client.close();
}
/**
* 批量刪除
*/
@Test
public void batchDeletDocument() throws IOException {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(new HttpHost("localhost", 9200, "http"))
);
//批量刪除數據
BulkRequest request = new BulkRequest();
//批量刪除
request.add(new DeleteRequest().index("user").id("1001"));
request.add(new DeleteRequest().index("user").id("1002"));
request.add(new DeleteRequest().index("user").id("1003"));
//發送請求并獲取響應
BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
//_took(花費的時間),119ms
log.info("_took(花費的時間),{}", response.getTook());
client.close();
}
}
```
- Elasticsearch是什么
- 全文搜索引擎
- Elasticsearch與Solr
- 數據結構
- 安裝Elasticsearch
- Linux單機安裝
- Windows單機安裝
- 安裝Kibana
- Linux安裝
- Windows安裝
- es基本語句
- 索引操作
- 文檔操作
- 映射操作
- 高級查詢
- es-JavaAPI
- maven依賴
- 索引操作
- 文檔操作
- 高級查詢
- es集群搭建
- Linux集群搭建
- Windows集群搭建
- 核心概念
- 索引(Index)
- 類型(Type)
- 文檔(Document)
- 字段(Field)
- 映射(Mapping)
- 分片(Shards)
- 副本(Replicas)
- 分配(Allocation)
- 系統架構
- 分布式集群
- 單節點集群
- 故障轉移
- 水平擴容
- 應對故障
- 路由計算
- 分片控制
- 寫流程
- 讀流程
- 更新流程
- 多文檔操作流程
- 分片原理
- 倒排索引
- 文檔搜索
- 動態更新索引
- 近實時搜索
- 持久化變更
- 段合并
- 文檔分析
- 內置分析器
- 分析器使用場景
- 測試分析器
- 指定分析器
- 自定義分析器
- 文檔處理
- 文檔沖突
- 樂觀并發控制
- 外部系統版本控制
- es優化
- 硬件選擇
- 分片策略
- 合理設置分片數
- 推遲分片分配
- 路由選擇
- 寫入速度優化
- 批量數據提交
- 優化存儲設備
- 合理使用合并
- 減少Refresh的次數
- 加大Flush設置
- 減少副本的數量
- 內存設置
- 重要配置
- es常見問題
- 為什么要使用Elasticsearch
- master選舉流程
- 集群腦裂問題
- 索引文檔流程
- 更新和刪除文檔流程
- 搜索流程
- ES部署在Linux時的優化方法
- GC方面ES需要注意的點
- ES對大數據量的聚合實現
- 并發時保證讀寫一致性
- 字典樹
- ES的倒排索引
- Spring Data Elasticsearch
- 環境搭建
- 索引操作
- 文檔操作