Elasticsearch學習系列六(Es Java客戶端操作)

說明:Es提供了多種不同的客戶端:

  • TransportClient:傳統客戶端,預計8.0版本會下掉

  • RestClient:官方推薦,它又包括兩種

    • Java Low Level REST Client
    • Java High Level REST Client

    ES在6.0後提供Java High Level Rest Client,這兩種官方更推薦使用High Level

接下來我們開始使用Java客戶端進行操作。

環境搭建

  1. 引入依賴
<dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.3.0</version>
        <exclusions>
            <exclusion>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>7.3.0</version>
</dependency>
  1. 配置Es連接信息
@Configuration
public class ElasticsearchConfig {

    private String hosts = "192.168.56.115:9200";

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        String[] hostArray= new String[]{hosts};
        HttpHost[] httpHosts=new HttpHost[hostArray.length];
        for (int i=0;i<hostArray.length;i++){
            String host = hostArray[i];
            String[] split = host.split(":");
            httpHosts[i]=new HttpHost(split[0],Integer.valueOf(split[1]),"http");
        }
        return new RestHighLevelClient(RestClient.builder(httpHosts));

    }
}

ES API操作

  1. 創建索引
@Test
public void createIndex() throws IOException {
    CreateIndexRequest createIndexRequest=new CreateIndexRequest("es_java");
    //設置參數
    createIndexRequest.settings(Settings.builder().put("number_of_shards","1").put("number_of_replicas","0"));
    XContentBuilder xContentBuilder=XContentFactory.jsonBuilder()
            .startObject()
            .field("properties")
            .startObject()
            .field("description")
            .startObject().field("type","text")
            .field("analyzer","ik_max_word")
            .endObject()
            .field("name").startObject()
            .field("type","keyword")
            .endObject()
            .field("pic").startObject()
            .field("type","text")
            .field("index",false)
            .endObject()
            .field("studymodel")
            .startObject()
            .field("type","keyword")
            .endObject()
            .endObject().endObject();
    createIndexRequest.mapping(xContentBuilder);

    //操作索引的客戶端
    IndicesClient indices = client.indices();
    CreateIndexResponse createIndexResponse = indices.create(createIndexRequest, RequestOptions.DEFAULT);
    boolean acknowledged = createIndexResponse.isAcknowledged();
    System.out.println("創建結果:"+acknowledged);

}

通過json的方式創建索引

@Test
    public void createIndexByJson() throws IOException {
        CreateIndexRequest createIndexRequest=new CreateIndexRequest("es_java");
        //設置參數
        createIndexRequest.settings(Settings.builder().put("number_of_shards","1").put("number_of_replicas","0"));
        createIndexRequest.mapping("{\n" +
                "    \"properties\": {\n" +
                "      \"description\": {\n" +
                "        \"type\": \"text\",\n" +
                "        \"analyzer\": \"ik_max_word\"\n" +
                "      },\n" +
                "      \"name\": {\n" +
                "        \"type\": \"keyword\"\n" +
                "      },\n" +
                "      \"pic\": {\n" +
                "        \"type\": \"text\",\n" +
                "        \"index\": false\n" +
                "      },\n" +
                "      \"studymodel\": {\n" +
                "        \"type\": \"keyword\"\n" +
                "      }\n" +
                "    }\n" +
                "  }.",XContentType.JSON);
        //操作索引的客戶端
        IndicesClient indices = client.indices();
        CreateIndexResponse createIndexResponse = indices.create(createIndexRequest, RequestOptions.DEFAULT);
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println("創建結果:"+acknowledged);
    }
  1. 刪除索引
@Test
public void deleteIndex() throws IOException {
    DeleteIndexRequest deleteIndexRequest=new DeleteIndexRequest("es_java");
    IndicesClient indices = client.indices();
    AcknowledgedResponse acknowledgedResponse = indices.delete(deleteIndexRequest, RequestOptions.DEFAULT);
    System.out.println(acknowledgedResponse.isAcknowledged());

}
  1. 添加文檔
@Test
public void testAddDoc() throws IOException {
    IndexRequest indexRequest=new IndexRequest("es_java","_doc");
    indexRequest.id("1");
    Map<String,Object> jsonMap=new HashMap<>();
    jsonMap.put("name","spring cloud實戰");
    jsonMap.put("description","本課程主要從四個章節進行講解: 1.微服務架構入門\n" +
            "2.spring cloud 基礎入門 3.實戰Spring Boot 4.註冊中心eureka");
    jsonMap.put("studymodel","20001");
    jsonMap.put("name","spring cloud實戰");
    jsonMap.put("pic","ttt.jpg");
    indexRequest.source(jsonMap);
    IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
    System.out.println(indexResponse.getResult());
}
  1. 查詢文檔
@Test
public void testGetDoc() throws IOException {
    GetRequest getRequest=new GetRequest("es_java","1");
    GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
    Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
    System.out.println(sourceAsMap);
}
  1. match搜索
@Test
public void testSearchAll() throws IOException {
    SearchRequest searchRequest=new SearchRequest("es_java");
    SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
    seachDoc(searchRequest, searchSourceBuilder);

}

private void seachDoc(SearchRequest searchRequest, SearchSourceBuilder searchSourceBuilder) throws IOException {
    //第一個參數代表結果集包含什麼字段,第二個參數代表結果集不包括哪些字段
    searchSourceBuilder.fetchSource(new String[]{"name","studymodel","description","pic"},new String[]{});
    searchRequest.source(searchSourceBuilder);
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);

    //搜索結果
    SearchHits hits = searchResponse.getHits();
    //匹配的記錄數
    TotalHits totalHits = hits.getTotalHits();
    for (SearchHit hit:hits){
        String id = hit.getId();
        //源文檔內容
        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
        System.out.println("文檔的id:"+id);
        System.out.println(sourceAsMap);
    }
}
  1. term搜索
@Test
public void testTermQuery() throws IOException {
    SearchRequest searchRequest=new SearchRequest("es_java");
    SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
    searchSourceBuilder.query(QueryBuilders.termQuery("name","spring"));
    seachDoc(searchRequest,searchSourceBuilder);
}
  1. 分頁搜索及排序
@Test
public void testSearchPage() throws IOException {
    SearchRequest searchRequest=new SearchRequest("es_java");
    SearchSourceBuilder searchSourceBuilder=new SearchSourceBuilder();
    searchSourceBuilder.from(0);
    searchSourceBuilder.size(2);
    searchSourceBuilder.sort("name",SortOrder.DESC);
    searchSourceBuilder.query(QueryBuilders.matchAllQuery());
    seachDoc(searchRequest,searchSourceBuilder);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章