基於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)); }
結果: