Elasticsearch基础——常用API操作(SpringBoot整合ElasticSearch)

学完elasticsearch的API操作,为了防止遗忘,写篇博客记录下来,方便以后使用。

1.创建一个SpringBoot项目,添加elasticsearch的依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

通过在pom.xml文件中加入下面配置,设置elasticsearch的版本

<properties>
        <elasticsearch.version>7.6.1</elasticsearch.version>
 </properties>

2.创建配置文件,来配置elasticsearch的ip和端口号以及使用的协议

在这里插入图片描述
配置代码如下:

@Configuration
public class ElasticSearchClientConfig {

    @Bean
    public RestHighLevelClient restHighLevelClient(){

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

        return client;
    }
}

在bean包下创建一个实体类,用来测试上传数据

package com.hist.testesapi.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@ConfigurationProperties(value = "user")
public class User {

    private String name;
    private Integer id;
    private String sex;
}

为了能够方便将对象转为json字符串,引入fastjson依赖

 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>

3.配置完成后,开始Elasticsearch的常用API的测试

API的测试在测试类中完成

注入客户端对象

@SpringBootTest
class TestEsApiApplicationTests {

    @Autowired
    RestHighLevelClient restHighLevelClient;
}
3.1测试获取索引,判断其是否存在
@Test
    void testExistsIndex() throws IOException {
        GetIndexRequest getIndexRequest = new GetIndexRequest("index");
        boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

3.2测试创建索引

  @Test
    void testCreateIndex() throws IOException {
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("index");
        AcknowledgedResponse response = restHighLevelClient.indices().create(createIndexRequest,RequestOptions.DEFAULT);
        System.out.println(response);
    }

3.3测试删除索引


    @Test
    void testDeleteIndex(){
        DeleteIndexRequest request = new DeleteIndexRequest("index");
        AcknowledgedResponse delete = restHighLevelClient.indices().delete(request , RequestOptions.DEFAULT);
        System.out.println(delete.isAcknowledged()); 
    }

3.4测试删除文档

    @Test
    void  testAddDoucment2() throws IOException {
        //创建对象
        User user = new User("李四", 1, "男");
        //创建请求
        IndexRequest request = new IndexRequest("index");
        //规划put
        request.id("1");
        request.timeout("1s"); //超时时间
        //将我们的数据放入请求中
        request.source(JSON.toJSONString(user),XContentType.JSON);
        
        //客户端发送请求,获取响应结果
        IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);
        System.out.println(indexResponse.toString());//打印结果
        System.out.println(indexResponse.status()); //打印状态
    }

3.5获取文档,判断是否存在

   @Test
    void testIsExistsDoucment() throws IOException {

        GetRequest getRequest = new GetRequest("index", "1");
        //不获取返回的_source的上下文
        getRequest.fetchSourceContext(new FetchSourceContext(false));
        getRequest.storedFields("_none_");
        boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
        System.out.println(exists);
    }

3.6获取文档的内容

    @Test
    void testGetDocument() throws IOException {
        GetRequest getRequest = new GetRequest("index", "1");
        GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);

        //打印文档内容
        System.out.println(getResponse.getSourceAsString());
        //打印返回的对象
        System.out.println(getResponse);
    }

3.7更新文档的信息

    @Test
    void testUpdateRequest(){
        UpdateRequest updateRequest = new UpdateRequest("index", "1");
        updateRequest.timeout(new TimeValue(1,TimeUnit.MILLISECONDS));
        
        //创建对象
        User user = new User("aaa", 1, "女");
        updateRequest.doc(JSON.toJSONString(user),XContentType.JSON);
        UpdateResponse updateResponse = restHighLevelClient.update(, RequestOptions.DEFAULT);
        //打印结果的状态
        System.out.println(updateResponse.status());
    }
3.8删除文档记录
 @Test
    void testDeleteRequest() throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest("index", "1");
        deleteRequest.timeout(new TimeValue(10,TimeUnit.MILLISECONDS));
        DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        //删除状态
        System.out.println(deleteResponse.status());
    }
3.8批量插入数量——指定id
   @Test
    void testBulkRequest() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");
        ArrayList<User> userArrayList = new ArrayList<>();
        userArrayList.add(new User("tom1",1,"man"));
        userArrayList.add(new User("tom2",2,"man"));
        userArrayList.add(new User("tom3",3,"man"));
        userArrayList.add(new User("tom4",4,"man"));
        userArrayList.add(new User("tom5",5,"man"));
        userArrayList.add(new User("tom6",6,"man"));

        //批处理请求
        for (int i = 0; i > userArrayList.size(); i++){
            bulkRequest.add(
                    new IndexRequest("index").id(""+(i+1)).source(
                            JSON.toJSONString(userArrayList.get(i)),XContentType.JSON));
        }
        //执行插入
        BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        //查看插入返回的状态值
        System.out.println(bulkResponse.status());
    }
3.9批量插入,不指定id
//批量插入
    @Test
    void testBulkRequest() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout("10s");
        ArrayList<User> userList = new ArrayList<>();
        userList.add(new User("hist1",1,"man"));
        userList.add(new User("hist2",2,"man"));
        userList.add(new User("hist3",3,"man"));
        userList.add(new User("hist4",4,"man"));
        userList.add(new User("hist5",5,"man"));
        userList.add(new User("hist6",6,"man"));

        //不指定插入的id
        for (int i = 0; i < userList.size(); i++) {
            //批量更新和批量删除,就在这里修改对应的请求就可以了
            bulkRequest.add(
                    new IndexRequest("hudashuai").source(JSON.toJSONString(userList.get(i)),XContentType.JSON)
            );
        }
        BulkResponse bulk = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        System.out.println(bulk.status());
    }
3.10查询
 //查询
    //    SearchRequest  搜索请求
    //    SearchSourceBuilder 条件构造
    //    HighlightBuilder   构建高亮
    //    TermQueryBuilder   精确查询
    //    MatchAllQueryBuilder 匹配所有
    //    xxx QueryBuilder 对应我们刚刚看到的命令
@Test
    void testSearch() throws IOException {
        SearchRequest searchRequest = new SearchRequest("index");

        //构建搜索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
//        QueryBuilders.termQuery() 精确匹配
//        QueryBuilders.matchAllQuery()匹配所有
        //下面测试精确匹配
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "tom1");
        searchSourceBuilder.query(termQueryBuilder);
        //设置超时时间
        searchSourceBuilder.timeout(new TimeValue(30,TimeUnit.MILLISECONDS));
        searchRequest.source(searchSourceBuilder);
        //执行搜索
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        System.out.println(JSON.toJSONString(searchResponse.getHits()));
        System.out.println("====================");

        for (SearchHit hit : searchResponse.getHits().getHits()) {
            System.out.println(hit.getSourceAsMap()); //打印结果
        }

    }
3.11高亮查询
 //高亮
    @Test
    void testHightLighter() throws IOException {
        //条件搜索
        SearchRequest searchRequest = new SearchRequest("index");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        //分页
        searchSourceBuilder.from(1);
        searchSourceBuilder.size(10);

        //精确匹配
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "tom");
        searchSourceBuilder.query(termQueryBuilder);
        searchSourceBuilder.timeout(new TimeValue(60,TimeUnit.MILLISECONDS));

        //高亮
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        //设置高亮字段
        highlightBuilder.field("name");
        //设置多个高亮显示为false,根据需求也可以设置为true
        highlightBuilder.requireFieldMatch(false);

        //字段前缀
        highlightBuilder.preTags("<span style='color:red;'");
        //后缀
        highlightBuilder.postTags("</span>");

        searchSourceBuilder.highlighter(highlightBuilder);


        //执行搜索
        searchRequest.source(searchSourceBuilder);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        //解析结果
        ArrayList<Map<String,Object>> list = new ArrayList<>();

        for (SearchHit hit : searchResponse.getHits()) {
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            HighlightField name = highlightFields.get("name"); //获取高亮后的字段
            //获取原先的结果
            Map<String, Object> sourceAsMap = hit.getSourceAsMap();
            //解析高亮字段,将原来的字段换位我们高亮的字段即可
            if(name != null){
                Text[] fragments = name.fragments();
                String newName = "";
                for (Text fragment : fragments) {
                    newName += fragment;
                }
                //将高亮字段替换掉原来的内容
                sourceAsMap.put("name",newName);
            }
            list.add(sourceAsMap);
        }
        for (Map<String, Object> stringObjectMap : list) {
            System.out.println(stringObjectMap); //打印看一下结果
        }
    }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值