ElasticSearch第八篇:springboot集成Elasticsearch,以及索引和文档的原生API操作详解,超详细!!!!!!!!!!!!!!

1.进入官网https://www.elastic.co/cn/

2.查找api文档

3.找到该导入的依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.6.1</version>
</dependency>

4.找对象,初始化:

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));

如果是单机,则new一个。如果是集群,则new多个,构建参数不用多说,一眼就懂吧?而且用完之后需要关闭客户端:

client.close();

5.分析类中的方法,配置项目!

项目创建完之后,打开pom发现es的客户端版本是7.6.2的,跟我所使用的版本不一致:

我们要保证版本一致,如下图:

6.编写配置类:

@Configuration
public class EsConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        //此处如果是集群配置,那么在buider里new多个HttpHost即可,使用逗号隔开
        RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("192.168.141.128", 9200, "http")));
        return client;
    }
}

到此,springboot与es的集成就完成了,接下来开始索引和文档api的使用!!!

1.索引的创建:

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;

    /**
     * 索引的创建
     */
    @Test
    void createIndex() throws IOException {
        CreateIndexRequest request=new CreateIndexRequest("xrj_index");
        CreateIndexResponse response=restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
        System.out.println(response);
    }
}

2.获取索引:

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;

    /**
     * 获取索引,判断索引是否存在
     */
    @Test
    void getIndex() throws IOException {
        GetIndexRequest request=new GetIndexRequest("bujingyi");
        boolean response=restHighLevelClient.indices().exists(request,RequestOptions.DEFAULT);
        System.out.println(response);
    }

}

3.删除索引:

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;


    /**
     *删除索引
     */
    @Test
    void deleteIndex() throws IOException {
        DeleteIndexRequest request=new DeleteIndexRequest("xrj_index");
        AcknowledgedResponse response=restHighLevelClient.indices().delete(request,RequestOptions.DEFAULT);
        System.out.println(response.isAcknowledged());
    }
}

4.创建文档:

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;


   /**
     *创建文档
     */
    @Test
    void addDocument() throws IOException {
        //创建对象
        Qcpage qcpage=new Qcpage();
        qcpage.setCompany("彩讯科技股份有限公司").setData("2020-06-03 21:18:12").setJob("应用开发工程师").setPlace("深圳南山").setSalar("9000/月");

        //创建请求,请求哪个索引库
        IndexRequest request=new IndexRequest("51job");

        //规则 PUT /51job/_doc/1
        request.id("1"); //设置文档id

        //设置请求超时时间
        request.timeout("1s");

        //将数据放入请求
        request.source(JSON.toJSONString(qcpage), XContentType.JSON);

        //客户端发送请求
       IndexResponse response = restHighLevelClient.index(request,RequestOptions.DEFAULT);

        System.out.println(response.toString());
        System.out.println(response.status());
    }
}

5.判断文档是否存在:

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;

    /**
     *获取文档 ,判断是否存在
     */
    @Test
    void docIsExists() throws IOException {
        //创建请求,设置索引和文档id
        GetRequest request=new GetRequest("51job","1");

        //不获取返回的_source上下文了
        request.fetchSourceContext(new FetchSourceContext(false));
        request.storedFields("_none_");

        boolean exists=restHighLevelClient.exists(request,RequestOptions.DEFAULT);
        System.out.println(exists);
    }
}

5.获取文档信息:

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;

    /**
     *获取文档信息
     */
    @Test
    void getDocument() throws IOException {
        //设置索引和文档id
        GetRequest request=new GetRequest("51job","1");
        GetResponse response=restHighLevelClient.get(request,RequestOptions.DEFAULT);
        System.out.println(response.getSourceAsString());
        System.out.println(response);
    }
}

打印的结果如下:

{"company":"彩讯科技股份有限公司","data":"2020-06-03 21:18:12","job":"应用开发工程师","place":"深圳南山","salar":"9000/月"}
{"_index":"51job","_type":"_doc","_id":"1","_version":1,"_seq_no":0,"_primary_term":1,"found":true,"_source":{"company":"彩讯科技股份有限公司","data":"2020-06-03 21:18:12","job":"应用开发工程师","place":"深圳南山","salar":"9000/月"}}

6.更新文档信息:

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;

   /**
     *更新文档信息
     */
    @Test
    void updateDocument() throws IOException {
        //设置更新的索引和文档id
        UpdateRequest request = new UpdateRequest("51job","1");
        request.timeout("1s");

        //创建一个实体类用于存放需要修改的字段内容
        Qcpage qcpage = new Qcpage();
        qcpage.setCompany("中国移动").setSalar("15000/月");

        //设置更新语法的doc内容
        request.doc(JSON.toJSONString(qcpage),XContentType.JSON);
        UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
        System.out.println(response.status());
    }
}

7.删除文档信息:

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;

    /**
     *删除文档信息
     */
    @Test
    void deleteDocument() throws IOException {
        //设置更新的索引和文档id
        DeleteRequest request = new DeleteRequest("51job", "1");
        request.timeout("1s");

        DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
        System.out.println(response.status());
    }
}

8.扩展:批量插入数据(批处理,一个例子即可,举一反三)

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;

    /**
     *批处理请求
     */
    @Test
    void bulkRequest() throws IOException {
        BulkRequest request = new BulkRequest();
        request.timeout("1s");
        List<Qcpage> list=new ArrayList<>();
        list.add(new Qcpage("招待前台","中国移动","深圳南山","8000/月","2020-06-03 22:23:45"));
        list.add(new Qcpage("java后台开发工程师","中国移动","深圳龙华","9000/月","2020-06-03 22:23:45"));
        list.add(new Qcpage("vue开发工程师","彩讯科技股份有限公司","深圳龙岗","11000/月","2020-06-03 22:23:45"));
        list.add(new Qcpage("运维工程师","中国联通","深圳福田","14000/月","2020-06-03 22:23:45"));
        list.add(new Qcpage("测试工程师","中国电信","深圳宝安","12000/月","2020-06-03 22:23:45"));
        list.add(new Qcpage("全栈工程师","富士康","深圳清湖","8000/月","2020-06-03 22:23:45"));

        for (int i = 0; i <list.size() ; i++) {
            request.add(new IndexRequest("51job")
                        .id(""+i+1)
                        .source(JSON.toJSONString(list.get(i)),XContentType.JSON));
        }
        BulkResponse response = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
        System.out.println(response.hasFailures());
    }
}

9.负责查询(以下代码查询bujingyi索引库中,那么字段包含芒果,或者年龄为14的文档,并分页,从索引为0的开始,取三个)

@SpringBootTest
class EsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;

    /**
     *复杂查询
     */
    @Test
    void serachDocument() throws IOException {
        SearchRequest request = new SearchRequest("bujingyi");

        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));

        MatchQueryBuilder matchQuery1 = QueryBuilders.matchQuery("name","芒果");
        MatchQueryBuilder matchQuery2 = QueryBuilders.matchQuery("age",14);
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.should(matchQuery1);
        boolQueryBuilder.should(matchQuery2);


        sourceBuilder.query(boolQueryBuilder).from(0).size(3);
        request.source(sourceBuilder);

        SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
        System.out.println(JSON.toJSONString(response.getHits()));
        System.out.println("=====================================");
        for (SearchHit searchHit:response.getHits().getHits()) {
            System.out.println(searchHit.getSourceAsMap());
        }
    }
}

到此,springboot集成es,并如何对原生的索引和文档api的操作就结束了,其实并不难,一个套路而已,多练习就好了。。。

猜你喜欢

转载自blog.csdn.net/weixin_46792649/article/details/106522936