java操作ELasticSearch


基於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));

   }

  結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM