ElasticSearch从入门到精通--第二话(原生API调用--纯代码篇)

ElasticSearch从入门到精通–第二话(原生API调用–纯代码篇)

ElasticSearch从入门到精通–第一话(入门篇)

ElasticSearch从入门到精通–第二话(原生API调用–纯代码篇)

ElasticSearch从入门到精通–第三话(集群环境搭建篇)

ElasticSearch从入门到精通–第四话(核心概念篇)

ElasticSearch从入门到精通–第五话(整合SpringBoot高效开发、分页高亮等、Kibana使用篇)

通过API访问ES服务器

首先创建好一个Java的maven项目,引入好相关的依赖,然后就可以开始了

依赖如下:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.8</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.20</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.8.2</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.8.2</version>
    </dependency>

    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>7.8.0</version>
    </dependency>

    <!-- elasticsearch的客户端 -->
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.8.0</version>
    </dependency>

</dependencies>

创建测试类进行API访问es即可。

索引

创建

public class ESTEST_Index_Create {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 创建索引名为 user 的索引
        CreateIndexRequest user = new CreateIndexRequest("user");
        CreateIndexResponse createIndexResponse = client.indices().create(user, RequestOptions.DEFAULT);

        // 响应状态
        boolean acknowledged = createIndexResponse.isAcknowledged();
        System.out.println(acknowledged);

        client.close();
    }
}
true

查询

public class ESTEST_Index_Search {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 创建索引名为 user 的索引
        GetIndexRequest user = new GetIndexRequest("user");
        GetIndexResponse getIndexResponse = client.indices().get(user, RequestOptions.DEFAULT);

        // 响应数据
        System.out.println(getIndexResponse.getAliases());
        System.out.println(getIndexResponse.getMappings());
        System.out.println(getIndexResponse.getSettings());

        client.close();
    }
}

{user=[]}
{user=org.elasticsearch.cluster.metadata.MappingMetadata@ed47fb9e}
{user={"index.creation_date":"1667202797544",...}}

删除

public class ESTEST_Index_Delete {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 创建索引名为 user 的索引
        DeleteIndexRequest user = new DeleteIndexRequest("user");
        AcknowledgedResponse delete = client.indices().delete(user, RequestOptions.DEFAULT);

        // 响应
        System.out.println(delete.isAcknowledged());
        
        client.close();
    }
}
true

文档

新增一个实体类,用作数据模型

@Data
public class User {
    
    
    
    private String name;
    private Integer age;
    private String sex;
    
}

新增

public class ESTEST_Doc_Insert {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        //
        IndexRequest request = new IndexRequest();
        request.index("user").id("1001");
        User user = new User("zhangsan", 30, "男");
        // 转json数据
        ObjectMapper mapper = new ObjectMapper();
        String userJson = mapper.writeValueAsString(user);
        request.source(userJson, XContentType.JSON);

        IndexResponse response = client.index(request, RequestOptions.DEFAULT);
        // 响应数据
        System.out.println(response.getResult());

        client.close();
    }
}
CREATED

修改

public class ESTEST_Doc_Update {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 创建对应的请求
        UpdateRequest request = new UpdateRequest();
        request.index("user").id("1001");
        request.doc(XContentType.JSON, "sex", "女");

        UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
        // 响应数据
        System.out.println(response.getResult());

        client.close();
    }
}
UPDATED

查询

 public class ESTEST_Doc_Get {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询数据
        GetRequest request = new GetRequest();
        request.index("user").id("1001");
        GetResponse response = client.get(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getSourceAsString());
        
        client.close();
    }
}
{"name":"zhangsan","age":30,"sex":"女"}

删除

public class ESTEST_Doc_Delete {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询数据
        DeleteRequest request = new DeleteRequest();
        request.index("user").id("1001");
        DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.toString());

        client.close();
    }
}
DeleteResponse[index=user,type=_doc,id=1001,version=3,result=deleted,shards=ShardInfo{total=2, successful=1, failures=[]}]

批量新增

public class ESTEST_Doc_Insert_Batch {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 批量插入数据
        BulkRequest request = new BulkRequest();
        request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan"));
        request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi"));
        request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu"));


        BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);
        System.out.println(response.getTook());
        System.out.println(Arrays.toString(response.getItems()));


        client.close();
    }
}
718ms
[org.elasticsearch.action.bulk.BulkItemResponse@3541cb24, org.elasticsearch.action.bulk.BulkItemResponse@2177849e, org.elasticsearch.action.bulk.BulkItemResponse@40cb8df7]

批量删除

public class ESTEST_Doc_Delete_Batch {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询数据
        BulkRequest request = new BulkRequest();
        request.add(new DeleteRequest().index("user").id("1001"));
        request.add(new DeleteRequest().index("user").id("1002"));
        request.add(new DeleteRequest().index("user").id("1003"));
        BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getTook());
        System.out.println(Arrays.toString(response.getItems()));


        client.close();
    }
}
693ms
[org.elasticsearch.action.bulk.BulkItemResponse@7a675056, org.elasticsearch.action.bulk.BulkItemResponse@d21a74c, org.elasticsearch.action.bulk.BulkItemResponse@6e509ffa]

高级查询

全量查询

public class ESTEST_Doc_Query {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询索引中,全部的数据
        SearchRequest request = new SearchRequest();
        request.indices("user");

        request.source(new SearchSourceBuilder().query(QueryBuilders.matchAllQuery()));

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getHits().getTotalHits());
        System.out.println(response.getTook());
        for (SearchHit hit : response.getHits()) {
    
    
            System.out.println(hit.getSourceAsString());
        }

        client.close();
    }
}
6 hits
399ms
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"lisi","age":40,"sex":"女"}
{"name":"wangwu1","age":50,"sex":"男"}
{"name":"wangwu2","age":60,"sex":"女"}
{"name":"wangwu3","age":40,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}

条件查询

和上文中代码一致,需要将部分代码修改,查询30岁的人

request.source(new SearchSourceBuilder().query(QueryBuilders.termQuery("age", 30)));
2 hits
3ms
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}

分页查询

public class ESTEST_Doc_Query {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询所有
        SearchRequest request = new SearchRequest();
        request.indices("user");
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // 分页处理
        builder.from(0);
        builder.size(2);

        request.source(builder);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getHits().getTotalHits());
        System.out.println(response.getTook());
        for (SearchHit hit : response.getHits()) {
    
    
            System.out.println(hit.getSourceAsString());
        }

        client.close();
    }
}
6 hits
2ms
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"lisi","age":40,"sex":"女"}

结果排序

public class ESTEST_Doc_Query {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询所有
        SearchRequest request = new SearchRequest();
        request.indices("user");
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // 排序
        builder.sort("age", SortOrder.DESC);

        request.source(builder);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getHits().getTotalHits());
        System.out.println(response.getTook());
        for (SearchHit hit : response.getHits()) {
    
    
            System.out.println(hit.getSourceAsString());
        }

        client.close();
    }
}

6 hits
73ms
{"name":"wangwu2","age":60,"sex":"女"}
{"name":"wangwu1","age":50,"sex":"男"}
{"name":"lisi","age":40,"sex":"女"}
{"name":"wangwu3","age":40,"sex":"男"}
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}

过滤字段

public class ESTEST_Doc_Query {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询所有
        SearchRequest request = new SearchRequest();
        request.indices("user");
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchAllQuery());
        // 设置只返回name
        String[] includes = {
    
    "name"};
        builder.fetchSource(includes, null);

        request.source(builder);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getHits().getTotalHits());
        System.out.println(response.getTook());
        for (SearchHit hit : response.getHits()) {
    
    
            System.out.println(hit.getSourceAsString());
        }

        client.close();
    }
}
6 hits
5ms
{"name":"zhangsan"}
{"name":"lisi"}
{"name":"wangwu1"}
{"name":"wangwu2"}
{"name":"wangwu3"}
{"name":"wangwu4"}

组合查询

public class ESTEST_Doc_Query {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询所有
        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();

        // must是and should是or
        boolQueryBuilder.must(QueryBuilders.matchQuery("age", 30));
        boolQueryBuilder.must(QueryBuilders.matchQuery("sex", "男"));
        builder.query(boolQueryBuilder);

        request.source(builder);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getHits().getTotalHits());
        System.out.println(response.getTook());
        for (SearchHit hit : response.getHits()) {
    
    
            System.out.println(hit.getSourceAsString());
        }

        client.close();
    }
}
2 hits
31ms
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}

非条件写法

boolQueryBuilder.mustNot(QueryBuilders.matchQuery("sex", "男"));

or写法,年龄30 or 40

boolQueryBuilder.should(QueryBuilders.matchQuery("age", 30));
boolQueryBuilder.should(QueryBuilders.matchQuery("age", 40));

范围查询

public class ESTEST_Doc_Query {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询所有
        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();
        RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("age");

        // 30 =< age <= 40
        rangeQuery.gte(30);
        rangeQuery.lte(40);
        builder.query(rangeQuery);

        request.source(builder);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getHits().getTotalHits());
        System.out.println(response.getTook());
        for (SearchHit hit : response.getHits()) {
    
    
            System.out.println(hit.getSourceAsString());
        }

        client.close();
    }
}
4 hits
12ms
{"name":"zhangsan","age":30,"sex":"男"}
{"name":"lisi","age":40,"sex":"女"}
{"name":"wangwu3","age":40,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}

模糊查询

public class ESTEST_Doc_Query {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询所有
        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();
        // 模糊查询wangwu,且 字符偏差为 1 的数据
        builder.query(QueryBuilders.fuzzyQuery("name", "wangwu").fuzziness(Fuzziness.ONE));
        request.source(builder);

        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getHits().getTotalHits());
        System.out.println(response.getTook());
        for (SearchHit hit : response.getHits()) {
    
    
            System.out.println(hit.getSourceAsString());
        }

        client.close();
    }
}
4 hits
36ms
{"name":"wangwu1","age":50,"sex":"男"}
{"name":"wangwu2","age":60,"sex":"女"}
{"name":"wangwu3","age":40,"sex":"男"}
{"name":"wangwu4","age":30,"sex":"男"}

高亮查询

public class ESTEST_Doc_Query {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询所有
        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();
        TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "zhangsan");
        HighlightBuilder highlightBuilder = new HighlightBuilder();
        highlightBuilder.preTags("<font color='red'>");
        highlightBuilder.postTags("</font>");
        highlightBuilder.field("name");

        builder.highlighter(highlightBuilder);

        builder.query(termQueryBuilder);
        request.source(builder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getHits().getTotalHits());
        System.out.println(response.getTook());
        for (SearchHit hit : response.getHits()) {
    
     
            // 打印高亮字段
            System.out.println(hit.getHighlightFields());
        }

        client.close();
    }
}
1 hits
4ms
{name=[name], fragments[[<font color='red'>zhangsan</font>]]}

最大值查询

public class ESTEST_Doc_Query {
    
    
    public static void main(String[] args) throws IOException {
    
    

        // 创建es客户端,指定ip和端口
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );

        // 查询所有
        SearchRequest request = new SearchRequest();
        request.indices("user");

        SearchSourceBuilder builder = new SearchSourceBuilder();

        MaxAggregationBuilder aggregationBuilder = AggregationBuilders.max("maxAge").field("age");
        builder.aggregation(aggregationBuilder);

        request.source(builder);
        SearchResponse response = client.search(request, RequestOptions.DEFAULT);

        // 响应
        System.out.println(response.getHits().getTotalHits());
        System.out.println(response.getTook());
		System.out.println(new ObjectMapper().writeValueAsString(response.getAggregations()));

        client.close();
    }
}
6 hits
1ms
{"asMap":{"maxAge":{"name":"maxAge","metadata":null,"value":60.0,"valueAsString":"60.0","type":"max","fragment":true}},"fragment":true}

分组查询

和上文基本一致,只是改了部分代码

TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("ageGroup").field("age");
builder.aggregation(termsAggregationBuilder);
6 hits
17ms
{"asMap":{"ageGroup":{"name":"ageGroup","metadata":null,"buckets":[{"aggregations":{"asMap":{},"fragment":true},"keyAsString":"30","docCount":2,"docCountError":0,"key":30,"keyAsNumber":30,"fragment":true},{"aggregations":{"asMap":{},"fragment":true},"keyAsString":"40","docCount":2,"docCountError":0,"key":40,"keyAsNumber":40,"fragment":true},{"aggregations":{"asMap":{},"fragment":true},"keyAsString":"50","docCount":1,"docCountError":0,"key":50,"keyAsNumber":50,"fragment":true},{"aggregations":{"asMap":{},"fragment":true},"keyAsString":"60","docCount":1,"docCountError":0,"key":60,"keyAsNumber":60,"fragment":true}],"type":"lterms","docCountError":0,"sumOfOtherDocCounts":0,"fragment":true}},"fragment":true}

猜你喜欢

转载自blog.csdn.net/weixin_45248492/article/details/127619956