基於springboot:
user:
@Data //getset
@AllArgsConstructor //有參構造函數
@NoArgsConstructor //無參構造函數
@Component //聲明它是spring的一個組件
public class User {
private String name;
private int age;
}
測試添加文檔:
@Test
void testAddDocument() throws IOException {
//創建對象
User user = new User("ElasticSearch", 3);
//創建請求
IndexRequest request = new IndexRequest("index1");
//規則
request.id("1");
request.timeout(TimeValue.timeValueSeconds(1));
//將數據放入請求
request.source(JSON.toJSONString(user), XContentType.JSON);
//客戶端發送請求
IndexResponse index = client.index(request, RequestOptions.DEFAULT);
System.out.println(index.toString());
}
結果:

測試文檔是否存在
@Test
void testIsExists() throws IOException {
GetRequest request = new GetRequest("index1", "1");
//不獲取 _source 上下文
request.fetchSourceContext(new FetchSourceContext(false));
boolean exists = client.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
結果:

獲取文檔內容
/*獲取文檔內容*/
@Test
void testGetDocument() throws IOException {
GetRequest request = new GetRequest("index1", "1");
GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString());//打印文檔內容
System.out.println(getResponse);
}
結果 :

更新文檔內容:
@Test
void testUpdateRequest() throws IOException {
UpdateRequest request = new UpdateRequest("index1", "1");
request.timeout("1s");
User user = new User("ElasticSearch學習", 18);
request.doc(JSON.toJSONString(user),XContentType.JSON);
UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
System.out.println(response.status());
}
結果:

刪除文檔內容
/*刪除文檔內容*/
@Test
void testDeleteRequest() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("index1", "1");
deleteRequest.timeout("1s");
DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());
}
結果:

批量插入:
/*批量插入*/
@Test
void testBulkRequest() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<Object> arrayList = new ArrayList<>();
arrayList.add(new User("張三",12));
arrayList.add(new User("李四",15));
arrayList.add(new User("王五",22));
arrayList.add(new User("趙七",26));
arrayList.add(new User("王八",31));
arrayList.add(new User("擎九",20));
for (int i = 0; i <arrayList.size() ; i++) {
bulkRequest.add(
new IndexRequest("index1")
.id(""+(i+1)) //id可要可不要
//轉json數據
.source(JSON.toJSONString(arrayList.get(i)),XContentType.JSON));
}
BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulk.hasFailures());//是否失敗
}
結果:

精確條件查詢
//精確條件查詢
@Test
void testSearch() throws IOException {
SearchRequest searchRequest = new SearchRequest("index1");
//構建搜索條件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//條件查詢 如果查詢條件為中文 需要在屬性添加 .keyword 例如: QueryBuilders.termQuery("name.keyword","張三");
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name.keyword","張三");
//查詢所有
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
// 分頁
/*一頁多少條*/
sourceBuilder.size(20);
/*從第幾個開始*/
sourceBuilder.from(0);
sourceBuilder.query(termQueryBuilder);
// sourceBuilder.query();查詢所有
//設置查詢時間 如果過了60s將不再查詢
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(searchResponse.getHits()));
System.out.println("+++++++++++++");
for (SearchHit documentFields : searchResponse.getHits().getHits()) {
System.out.println(documentFields.getSourceAsMap());
}
}
結果:

模糊查詢
//模糊查詢
@Test
void testFuzzyQuery() throws IOException{
SearchRequest searchRequest = new SearchRequest("index1");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("name","張"));
searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(searchSourceBuilder);
SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(response.getHits());
for (SearchHit searchHit : response.getHits().getHits()) {
System.out.println(searchHit.getSourceAsMap());
}
}
結果:

高亮搜索:
//高亮搜索
@Test
void testHighlightSearch() throws IOException {
//搜索條件
SearchRequest searchRequest = new SearchRequest("index");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder .query(QueryBuilders.matchQuery("name.keyword","張三")) //精確匹配
.timeout(new TimeValue(60, TimeUnit.SECONDS))
.highlighter(new HighlightBuilder()
.field("name.keyword") //搜索字段
.requireFieldMatch(false) // 只需一個高亮
.preTags("<span style='coler:red'>")
.postTags("</span>"));
//執行搜索
searchRequest.source(searchSourceBuilder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
//解析結果
List<Object> queryList = new LinkedList<>();
for (SearchHit documentFields : search.getHits().getHits()) {
Map<String, Object> sourceAsMap = documentFields.getSourceAsMap();//原來的結果
HighlightField field = documentFields.getHighlightFields().get("name.keyword");
//解析高亮的字段,將原來的字段替換成高亮字段
Text[] texts = field.fragments();
String n_text ="";
for (Text text : texts) {
n_text+= text;
}
sourceAsMap.put("name",n_text);//高亮字段替換原來的內容
queryList.add(sourceAsMap);
}
queryList.forEach((a)-> System.out.println(a));
}
結果:

