ES的java客户端

ES的java客户端

添加依赖
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.10.2</version>
</dependency>
复制代码
索引管理
  1. 创建索引

    • 创建一个RestHightLevelClient对象,相当于和服务端建立连接
    • 使用client的索引管理的对象,indices()返回索引管理对象
  2. 创建索并设置settings信息

    • CreateIndexRequest对象中设置settings即可
  3. 创建索引应设置mapping信息

    {
    	"properties":{
    		"id":{
    			"type":"long"
    		},
    		"title":{
    			"type":"text",
    			"analyzer":"ik_smart",
    			"store":true
    		},
    		"content":{
    			"type":"text",
    			"analyzer":"ik_smart",
    			"store":true
    		}
    	}
    }
    复制代码
  4. 删除索引库

    • DeleteIndexRequest对象,其中包含索引库的名称即可
    • indeces().delete(request);
案例
public class IndexManagerTest {
    
    public RestHighLevelClient client = null;
    @Before
    public void init() {
        //1、和服务端**建立连接**
        client = new RestHighLevelClient(RestClient.builder(
                new HttpHost("xxx.xxx.xxx.xxx", 9200, "http"),
                new HttpHost("xxx.xxx.xxx.xxx", 9200, "http"),
                new HttpHost("xxx.xxx.xxx.xxx", 9200, "http")
        ));

    }

    @Test
    public void createIndex() throws IOException {
        //创建名为test的索引库
        client.indices().create(new CreateIndexRequest("test"), RequestOptions.DEFAULT);
    }

    @Test
    public void createIndexWithSetting() throws Exception {
		//创建名为test1的索引库并设置setting
        CreateIndexRequest request = new CreateIndexRequest("test1")
                .settings(
                        Settings.builder()
                                .put("number_of_shards", 5)
                                .put("number_of_replicas", 1)
                                .build()
                );
        boolean acknowledged = client.indices().create(request, RequestOptions.DEFAULT).isAcknowledged();
        System.out.println(acknowledged);
    }

    @Test
    public void putMapping() throws Exception {
        String mappingStr = "{\n" +
                "\t\"properties\":{\n" +
                "\t\t\"id\":{\n" +
                "\t\t\t\"type\":\"long\"\n" +
                "\t\t},\n" +
                "\t\t\"title\":{\n" +
                "\t\t\t\"type\":\"text\",\n" +
                "\t\t\t\"analyzer\":\"ik_max_word\",\n" +
                "\t\t\t\"store\":true\n" +
                "\t\t},\n" +
                "\t\t\"content\":{\n" +
                "\t\t\t\"type\":\"text\",\n" +
                "\t\t\t\"analyzer\":\"ik_max_word\",\n" +
                "\t\t\t\"store\":true\n" +
                "\t\t},\n" +
                "\t\t\"comment\":{\n" +
                "\t\t\t\"type\":\"text\",\n" +
                "\t\t\t\"analyzer\":\"ik_max_word\",\n" +
                "\t\t\t\"store\":true\n" +
                "\t\t},\n" +
                "\t\t\"mobile\":{\n" +
                "\t\t\t\"type\":\"keyword\",\n" +
                "\t\t\t\"store\":true\n" +
                "\t\t}\n" +
                "\t}\n" +
                "}";
		//创建完成之后设置setting
        PutMappingRequest request = new PutMappingRequest("test")
                .source(mappingStr, XContentType.JSON);
        boolean acknowledged = client.indices().putMapping(request, RequestOptions.DEFAULT).isAcknowledged();
        System.out.println(acknowledged);
    }

    @Test
    public void createIndexWithMapping() throws Exception {
        XContentBuilder builder = XContentFactory.jsonBuilder()
                .startObject()
                    .startObject("properties")
                        .startObject("id")
                            .field("type", "long")
                        .endObject()
                        .startObject("title")
                            .field("type", "text")
                            .field("store", true)
                            .field("analyzer", "ik_max_word")
                        .endObject()
                        .startObject("content")
                            .field("type", "text")
                            .field("store", true)
                            .field("analyzer", "ik_max_word")
                        .endObject()
                        .startObject("comment")
                            .field("type", "text")
                            .field("store", true)
                            .field("analyzer", "ik_max_word")
                        .endObject()
                        .startObject("mobile")
                            .field("type", "keyword")
                            .field("store", true)
                        .endObject()
                    .endObject()
                .endObject();
        /*String mappingStr = "{\n" +
                "\t\"properties\":{\n" +
                "\t\t\"id\":{\n" +
                "\t\t\t\"type\":\"long\"\n" +
                "\t\t},\n" +
                "\t\t\"title\":{\n" +
                "\t\t\t\"type\":\"text\",\n" +
                "\t\t\t\"analyzer\":\"ik_max_word\",\n" +
                "\t\t\t\"store\":true\n" +
                "\t\t},\n" +
                "\t\t\"content\":{\n" +
                "\t\t\t\"type\":\"text\",\n" +
                "\t\t\t\"analyzer\":\"ik_max_word\",\n" +
                "\t\t\t\"store\":true\n" +
                "\t\t},\n" +
                "\t\t\"comment\":{\n" +
                "\t\t\t\"type\":\"text\",\n" +
                "\t\t\t\"analyzer\":\"ik_max_word\",\n" +
                "\t\t\t\"store\":true\n" +
                "\t\t},\n" +
                "\t\t\"mobile\":{\n" +
                "\t\t\t\"type\":\"keyword\",\n" +
                "\t\t\t\"store\":true\n" +
                "\t\t}\n" +
                "\t}\n" +
                "}";*/
        String json = XContentHelper.convertToJson(BytesReference.bytes(builder), true, true, builder.contentType());
        System.out.println(json);
		//创建索引库test3并设置Setting和Mapping
        CreateIndexRequest request = new CreateIndexRequest("test3")
                .settings(
                        Settings.builder()
                                .put("number_of_shards", 5)
                                .put("number_of_replicas", 1)
                                .build()
                )
                //.mapping(mappingStr, XContentType.JSON);
                .mapping(builder);
        boolean acknowledged = client.indices().create(request, RequestOptions.DEFAULT).isAcknowledged();
        System.out.println(acknowledged);
    }

    @Test
    public void deleteIndex() throws Exception {
        //删除test3索引库
        client.indices().delete(new DeleteIndexRequest("test3"), RequestOptions.DEFAULT);
    }
}
复制代码
文档管理
  1. 添加文档

    • 使用RestHightLevelClient对象
    • 使用client对象的index方法添加文档
    • 创建IndexRequest对象,其中包含了索引库名称、文档id、文档的内容
  2. 更新文档

    • 使用RestHightLevelClient对象
    • 使用client对象的update方法更新文档
    • 创建UpdateRequest对象,其中包含了索引库名称、文档id、文档的内容
  3. 删除文档

    • 使用RestHightLevelClient对象
    • 使用client对象的delete方法删除文档
    • 创建UpdateRequest对象,其中包含了索引库名称、文档id
  4. 批量操作bulk

    • 使用RestHightLevelClient对象
    • 使用client对象的bulk方法,其中包含了索引库名称、文档id、文档的内容
    • 创建BulkRequest对象,使用add方法添加要批量处理的请求
      • IndexRequest
      • DeleteRequest
      • UpdateRequest
案例
public class DocumentManagerTest {
    public RestHighLevelClient client = null;
    @Before
    public void init() {
        client = new RestHighLevelClient(RestClient.builder(
                new HttpHost("192.168.68.129", 9200, "http"),
                new HttpHost("192.168.68.130", 9200, "http"),
                new HttpHost("192.168.68.131", 9200, "http")
        ));
    }

    @Test
    public void addDocument() throws IOException {
        String item = "{\"id\":1, \"title\":\"知名艺人迷之操作让人看呆了..\", \"content\":\"看呆了..\", \"comment\":\"娱乐\", \"mobile\":\"13900112233\"}";
        IndexResponse response = client.index(new IndexRequest()
                    .index("test")
                    .id("1")
                    .source(item, XContentType.JSON)
                , RequestOptions.DEFAULT);
        System.out.println(response);

    }
    @Test
    public void updateDocument() throws Exception {
        String item = "{\"id\":1, \"title\":\"bbfdfbf\", \"content\":\"bsgdfbgf\", \"comment\":\"娱乐\", \"mobile\":\"13900112239\"}";
        UpdateResponse response = client.update((new UpdateRequest()
                        .index("test")
                        .id("1")
                        .doc(item, XContentType.JSON))
                , RequestOptions.DEFAULT);
        System.out.println(response);
    }
    @Test
    public void deleteDocument() throws Exception {
        DeleteRequest request = new DeleteRequest("test","1");
        System.out.println(request);
        DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
        System.out.println(response);
    }
    @Test
    public void bulkDocument() throws IOException {
        JSONArray jsonArray = JSONArray.parseArray("自定义一些json字符串数据");
        BulkRequest bulkRequest = new BulkRequest();
        jsonArray.stream()
                .forEach(item -> {
                    IndexRequest indexRequest = new IndexRequest();
                    indexRequest.index("test")
                            .id(((JSONObject) item).getString("id"))
                            .source(((JSONObject) item).toJSONString(), XContentType.JSON);
                    bulkRequest.add(indexRequest);
                });
        client.bulk(bulkRequest, RequestOptions.DEFAULT);
    }
    @Test
    public void getDocumentById() throws Exception {
        GetResponse response = client.get(new GetRequest("test", "1"), RequestOptions.DEFAULT);
        System.out.println(response);
        Map<String, Object> source = response.getSource();
        System.out.println(source);
    }
}
复制代码
文档搜索
  1. 步骤

    • 创建一个client对象

    • 使用client的search方法实现查询操作

    • 需要SearchRequest参数

      //创建查询条件请求体
      SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
      searchSourceBuilder
          //查询条件
          .query(QueryBuilders.multiMatchQuery("最喜爱的电影","title", "content"))
          //过滤条件
          .postFilter(QueryBuilders.termQuery("title", "开心"))				
          //分页条件
          .from(0)
          .size(10)
          //高亮条件
          .highlighter(
          	new HighlightBuilder()
                       .field("title")
                       .field("content")
                       .preTags("<em>")
                       .postTags("</em>")
      		);
      //创建SearchRequest对象
      SearchRequest searchRequest = new SearchRequest();
      searchRequest.indices("blog1");//request对象中需要有索引的名称
      searchRequest.source(searchSourceBuilder);//request对象中需要包含请求体
      //执行查询
      SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
      复制代码
    • request对象中需要有索引的名称

    • request对象中需要包含请求体(SearchSourceBuilder

    • 请求体中包含查询条件,分页条件、过滤条件、高亮条件等

    • 执行查询

    • 从查询结果中取数据

  2. 返回结果

    • total().value属性:命中的所有的记录数

    • 默认是有分页的,默认是返回前10条记录

    • 文档是包含在searchHits数组中

      SearchHits hits = searchResponse.getHits();
              System.out.println("总记录数:" + hits.getTotalHits().value);
              SearchHit[] searchHits = hits.getHits();
              Stream.of(searchHits)
                      .forEach(e->{
                          Map<String, HighlightField> highlightFields = e.getHighlightFields();//高亮结果
                          String source = e.getSourceAsString();
                          System.out.println(source);
                          System.out.println(highlightFields);
      
                      });
      复制代码
  3. 查询条件

    • 封装到SearchRequest对象中,其中查询条件需要封装到SearchSourceBuilder中
      • 查询条件:QueryBuilders工具类创建
      • 分页学习:from、size
      • 过滤条件:filter实现过滤,过滤条件可以有多个
    //创建查询条件请求体
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    searchSourceBuilder
        //查询条件
        .query(QueryBuilders.multiMatchQuery("最喜爱的电影","title", "content"))
        //过滤条件
        .postFilter(QueryBuilders.termQuery("title", "开心"))				
        //分页条件
        .from(0)
        .size(10)
        //高亮条件
        .highlighter(
        	new HighlightBuilder()
                     .field("title")
                     .field("content")
                     .preTags("<em>")
                     .postTags("</em>")
    		);
    复制代码

猜你喜欢

转载自juejin.im/post/7001094063013232648