Elasticsearch简单学习

1、依赖的导入

xml 复制代码
<!--ES依赖-->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

2、客户端链接

java 复制代码
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://localhost:9200")));

3、索引库的相关操作

1、索引库的创建
java 复制代码
@Test
void createTestIndex() throws IOException {
    /*创建索引库*/
    //1.创建Request对象,索引库名称必须为小写字母
    CreateIndexRequest request = new CreateIndexRequest("test_index");

    String source = "{\n" +
        "        \"mappings\":{\n" +
        "        \"properties\":{\n" +
        "            \"id\":{\n" +
        "                \"type\":\"integer\"\n" +
        "            },\n" +
        "            \"name\":{\n" +
        "                \"type\":\"text\",\n" +
        "                \"analyzer\":\"ik_max_word\"\n" +
        "            },\n" +
        "            \"age\":{\n" +
        "                \"type\":\"integer\"\n" +
        "            },\n" +
        "            \"sex\":{\n" +
        "                \"type\":\"keyword\"\n" +
        "            },\n" +
        "            \"bossId\":{\n" +
        "                \"type\":\"integer\"\n" +
        "            },\n" +
        "            \"departmentId\":{\n" +
        "                \"type\":\"integer\"\n" +
        "            }\n" +
        "        }\n" +
        "    }\n" +
        "}";

    //2.准备请求的参数:DSL语句
    request.source(source, XContentType.JSON);

    //3.发请求
    client.indices().create(request, RequestOptions.DEFAULT);
}
2、判断索引库是否存在
java 复制代码
@Test
void existsTestIndex() throws IOException {
    /*判断索引库是否存在*/
    //1.创建Request对象,名称必须为小写字母
    GetIndexRequest request = new GetIndexRequest("test_index");

    //2.发请求
    boolean is = client.indices().exists(request, RequestOptions.DEFAULT);
    System.out.println(is);
}
3、删除索引库
java 复制代码
@Test
void deleteTestIndex() throws IOException {
    /*删除索引库*/
    //1.创建Request对象,名称必须为小写字母
    DeleteIndexRequest request = new DeleteIndexRequest("test_index");

    //2.发请求
    client.indices().delete(request, RequestOptions.DEFAULT);
}

4、文档的操作

1、创建文档
java 复制代码
@Test
void createDocTest() throws IOException {
    //从数据库中获取数据对象
    Employee employee = employeeMapper.selectAllById(1);

    //1. 创建Request对象
    IndexRequest request = new IndexRequest("test_index").id(employee.getId().toString());

    //2.准备json文档
    String source = JSON.toJSONString(employee);
    //2.1准备json文档
    request.source(source, XContentType.JSON);

    //3.发请求
    client.index(request, RequestOptions.DEFAULT);
}
2、获取指定的文档
java 复制代码
@Test
void getDocTest() throws IOException {
    //1.创建Request对象
    GetRequest request = new GetRequest("test_index","1");
    //2.发请求,得到结果
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    //3.解析结果
    String json = response.getSourceAsString();
    System.out.println(json);
    Employee employee = JSON.parseObject(json, Employee.class);
    System.out.println(employee);
}
3、更新文档
java 复制代码
@Test
void updateDocTest() throws IOException {
    //1.创建Request对象
    UpdateRequest request = new UpdateRequest("test_index","1");

    //2.准备DSL语句
    request.doc(
        "age",18
    );

    //3.发请求
    client.update(request,RequestOptions.DEFAULT);
}
4、删除文档
java 复制代码
@Test
void deleteDocTest() throws IOException {
    //1.创建Request对象
    DeleteRequest request = new DeleteRequest("test_index","1");
    //2.发请求
    client.delete(request,RequestOptions.DEFAULT);
}
5、批量操作(创建)
java 复制代码
@Test
void batchCreateDocTest() throws IOException {
    //1.创建Request对象
    BulkRequest request = new BulkRequest();

    //2.准备DSL语句,批量增加文档
    List<Employee> employees = employeeMapper.selectAll();
    for(Employee e : employees){
        request.add(new IndexRequest("test_index")
                    .id(e.getId().toString())
                    .source(JSON.toJSONString(e),XContentType.JSON));
    }

    //3.发请求
    client.bulk(request,RequestOptions.DEFAULT);
}

5、搜索文档

1、分词查询-查询全部
java 复制代码
@Test
void matchAllTest() throws IOException {  //分词查询
    //1.准备Request
    SearchRequest request = new SearchRequest("test_index");

    //2.组织DSL参数
    request.source() // 查询全部
        .query(QueryBuilders.matchAllQuery());

    //3.发送请求
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);

    //4.解析结果
    SearchHits searchHits = response.getHits();

    //4.1获取总条数
    long total = searchHits.getTotalHits().value;
    System.out.println("总共有:" + total + "条数据");

    //4.2获取文档数组
    SearchHit[] hits = searchHits.getHits();

    //4.3遍历数组
    for(SearchHit h : hits){
        String json = h.getSourceAsString();
        Employee employee = JSON.parseObject(json, Employee.class);
        System.out.println(employee);
    }
}
2、分词查询-指定字段
java 复制代码
@Test
void matchQueryTest() throws IOException { //分词查询
    //1.准备Request
    SearchRequest request = new SearchRequest("test_index");

    //2.组织DSL参数
    request.source() //查询指定字段的值,也可以指定多个字段 .multiMatchQuery()
        .query(QueryBuilders.matchQuery("name","晨"));

    //3.发送请求
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);

    //4.解析结果
    SearchHits searchHits = response.getHits();

    //4.1获取总条数
    long total = searchHits.getTotalHits().value;
    System.out.println("总共有:" + total + "条数据");

    //4.2获取文档数组
    SearchHit[] hits = searchHits.getHits();

    //4.3遍历数组
    for(SearchHit h : hits){
        String json = h.getSourceAsString();
        Employee employee = JSON.parseObject(json, Employee.class);
        System.out.println(employee);
    }
}
3、精确查询
java 复制代码
@Test
void termQueryTest() throws IOException {  //精确查询
    //1.准备Request
    SearchRequest request = new SearchRequest("test_index");

    //2.组织DSL参数
    request.source() //精确查询只能查询 非text(分词字段),如果查询分词字段,则自动采用模糊分词查询
        .query(QueryBuilders.termQuery("age","33"));

    //3.发送请求
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);

    //4.解析结果
    SearchHits searchHits = response.getHits();

    //4.1获取总条数
    long total = searchHits.getTotalHits().value;
    System.out.println("总共有:" + total + "条数据");

    //4.2获取文档数组
    SearchHit[] hits = searchHits.getHits();

    //4.3遍历数组
    for(SearchHit h : hits){
        String json = h.getSourceAsString();
        Employee employee = JSON.parseObject(json, Employee.class);
        System.out.println(employee);
    }
}
4、范围查询
java 复制代码
@Test
void rangeQueryTest() throws IOException {  //范围查询
    //1.准备Request
    SearchRequest request = new SearchRequest("test_index");

    //2.组织DSL参数
    request.source() //范围查询,gte:大于等于,lte:小于等于,gt:大于,lt:小于
        .query(QueryBuilders.rangeQuery("age").gte(30).lte(35));

    //3.发送请求
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);

    //4.解析结果
    SearchHits searchHits = response.getHits();

    //4.1获取总条数
    long total = searchHits.getTotalHits().value;
    System.out.println("总共有:" + total + "条数据");

    //4.2获取文档数组
    SearchHit[] hits = searchHits.getHits();

    //4.3遍历数组
    for(SearchHit h : hits){
        String json = h.getSourceAsString();
        Employee employee = JSON.parseObject(json, Employee.class);
        System.out.println(employee);
    }
}
5、复合查询
java 复制代码
@Test
void boolQueryTest() throws IOException {  //复合查询
    //1.准备Request
    SearchRequest request = new SearchRequest("test_index");

    //2.1创建复合查询对象
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();

    //2.2添加查询条件
    boolQuery.must(QueryBuilders.matchQuery("name","雨"));
    boolQuery.filter(QueryBuilders.rangeQuery("age").gte(20).lte(35));

    //2.3组织DSL参数
    request.source()
        .query(boolQuery);

    //3.发送请求
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);

    //4.解析结果
    SearchHits searchHits = response.getHits();

    //4.1获取总条数
    long total = searchHits.getTotalHits().value;
    System.out.println("总共有:" + total + "条数据");

    //4.2获取文档数组
    SearchHit[] hits = searchHits.getHits();

    //4.3遍历数组
    for(SearchHit h : hits){
        String json = h.getSourceAsString();
        Employee employee = JSON.parseObject(json, Employee.class);
        System.out.println(employee);
    }
}
6、分页排序查询
java 复制代码
@Test
void pageSortQueryTest() throws IOException {  //分页、排序查询
    // 页码,每页大小
    int page = 3,size = 10;

    //1.准备Request
    SearchRequest request = new SearchRequest("test_index");

    //2组织DSL参数
    request.source()
        .from((page-1)*size) // 包含form,(page-1)*size,是前端传过来的页码和每页条数
        .size(size)
        .sort("id", SortOrder.ASC)
        .query(QueryBuilders.matchAllQuery());

    //3.发送请求
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);

    //4.解析结果
    SearchHits searchHits = response.getHits();

    //4.1获取总条数
    long total = searchHits.getTotalHits().value;
    System.out.println("总共有:" + total + "条数据");

    //4.2获取文档数组
    SearchHit[] hits = searchHits.getHits();

    //4.3遍历数组
    for(SearchHit h : hits){
        String json = h.getSourceAsString();
        Employee employee = JSON.parseObject(json, Employee.class);
        System.out.println(employee);
    }
}
6、高亮查询
java 复制代码
@Test
void highLightQueryTest() throws IOException {  //高亮查询
    //1.准备Request
    SearchRequest request = new SearchRequest("test_index");

    //2组织DSL参数
    request.source()
        .highlighter(new HighlightBuilder() //高亮显示
                     .field("name") //字段名
                     .requireFieldMatch(false) // 是否与查询字段匹配
                    ) // 用的默认标签 <em></em>
        .query(QueryBuilders.matchQuery("name","晨"));

    //3.发送请求
    SearchResponse response = client.search(request,RequestOptions.DEFAULT);

    //4.解析结果
    SearchHits searchHits = response.getHits();

    //4.1获取总条数
    long total = searchHits.getTotalHits().value;
    System.out.println("总共有:" + total + "条数据");

    //4.2获取文档数组
    SearchHit[] hits = searchHits.getHits();

    //4.3遍历数组
    for(SearchHit h : hits){
        String json = h.getSourceAsString();
        Employee employee = JSON.parseObject(json, Employee.class);

        // 高亮显示,因为每条数据都是带有 晨 的,所以每条数据都有一个HighlightField用于替换
        HighlightField name = h.getHighlightFields().get("name");

        //替换
        employee.setName(name.getFragments()[0].toString());

        System.out.println(employee);
    }
}
相关推荐
!!!5252 分钟前
Java Stream 流笔记
java·笔记
m0_7482509319 分钟前
Spring Boot 2.7.x 至 2.7.18 及更旧的版本,漏洞说明
java·spring boot·后端
mua码1 小时前
二十三种设计模式
java·设计模式
飞3001 小时前
腾讯集团软件开发-后台开发方向内推
java·mysql·业界资讯
码熔burning3 小时前
(十 五)趣学设计模式 之 命令模式!
java·设计模式·命令模式
计算机-秋大田6 小时前
基于Spring Boot的乡村养老服务管理系统设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·课程设计
盖盖衍上6 小时前
Java 泛型(Generics)详解与使用
java·开发语言·windows
没有十八岁7 小时前
云创智城YunCharge 新能源二轮、四轮充电解决方案(云快充、万马爱充、中电联、OCPP1.6J等多个私有单车、汽车充电协议)之新能源充电行业系统说明书
java·数据库·spring·汽车
小萌新上大分8 小时前
Minio搭建并在SpringBoot中使用完成用户头像的上传
java·spring boot·后端·minio·minio搭建·头像上传·minio入门
B站计算机毕业设计超人8 小时前
计算机毕业设计SpringBoot+Vue.js校园失物招领系统(源码+文档+PPT+讲解)
java·vue.js·spring boot·后端·毕业设计·课程设计·毕设