Elasticsearch JavaApi

1、创建maven项目

通过IDEA开发工具创建一个maven项目
image.png
修改pom文件,添加如下依赖

<dependencies>
    <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>
    <!-- elasticsearch 依赖 2.x 的 log4j -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.8.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.8.2</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.9</version>
    </dependency>
    <!-- junit 单元测试 -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.24</version>
    </dependency>
</dependencies>

2、客户端对象

创建一个创建ES客户端的工具类

public class EsClientUtil {

    public static RestHighLevelClient getClient() {
        return new RestHighLevelClient(
            RestClient.builder(new HttpHost("localhost", 9200, "http"))
        );
    }

    public static RestHighLevelClient getClientByAuth() {
        String hostname = "localhost";
        int port = 9200;
        String scheme = "http";
        String username = "***";
        String password = "***";

        //创建凭证
        CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));

        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(hostname, port, scheme))
            .setHttpClientConfigCallback(httpAsyncClientBuilder -> httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
        return new RestHighLevelClient(restClientBuilder);
    }

}

再添加一个模型类

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {

    private String name;
    private Integer age;
    private String sex;
    
}

3、索引操作

1)创建索引

@Test
public void insertIndex() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();
    // 创建索引请求 对象
    CreateIndexRequest createIndexRequest = new CreateIndexRequest("user");
    // 发送请求,获取响应
    CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
    boolean acknowledged = createIndexResponse.isAcknowledged();
    System.out.println("创建索引返回:" + acknowledged);

    //关闭客户端链接
    client.close();
}

2)查看索引

@Test
public void getIndex() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();
    // 查询索引-请求对象
    GetIndexRequest request = new GetIndexRequest("user");
    // 发送请求 获取响应
    GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);

    Map<String, List<AliasMetadata>> aliases = response.getAliases();
    Map<String, MappingMetadata> mappings = response.getMappings();
    Map<String, Settings> settings = response.getSettings();

    System.out.println("aliases: " + aliases);
    System.out.println("mappings: " + mappings);
    System.out.println("settings: " + settings);

    client.close();
}

3)查看所有索引

@Test
public void getAllIndex() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    GetAliasesRequest request = new GetAliasesRequest();
    GetAliasesResponse alias = client.indices().getAlias(request, RequestOptions.DEFAULT);
    Map<String, Set<AliasMetadata>> aliasesMap = alias.getAliases();
    for (String key : aliasesMap.keySet()) {
        System.out.println(key);
    }

    client.close();
}

3)删除索引

@Test
public void deleteIndex() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    DeleteIndexRequest request = new DeleteIndexRequest("user");
    AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
    boolean acknowledged = response.isAcknowledged();
    System.out.println("acknowledged:" + acknowledged);

    client.close();
}

4、文档操作

1)新增文档

@Test
public void insertDoc() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();
    // 新增文档-请求对象
    IndexRequest request = new IndexRequest();
    // 设置索引及唯一性标识
    request.index("user").id("1001");
    // 创建数据对象
    User user = new User("张三", 30, "男");
    ObjectMapper objectMapper = new ObjectMapper();
    String productJson = objectMapper.writeValueAsString(user);
    // 添加文档数据,数据格式为json格式
    request.source(productJson, XContentType.JSON);
    // 客户端发送请求, 获取响应对象
    IndexResponse response = client.index(request, RequestOptions.DEFAULT);

    System.out.println("_index:" + response.getIndex());
    System.out.println("_id:" + response.getId());
    System.out.println("_result:" + response.getResult());

    client.close();
}

2)修改文档

@Test
public void updateDoc() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    //修改文档-请求对象
    UpdateRequest request = new UpdateRequest();
    //配置参数
    request.index("user").id("1001");
    //设置请求体,对数据进行修改
    //request.doc(XContentType.JSON, "sex", "女");
    request.doc(XContentType.JSON, "sex", "女", "name", "lisi", "age", 10);
    // 发送请求 获取响应
    UpdateResponse response = client.update(request, RequestOptions.DEFAULT);

    System.out.println("_index:" + response.getIndex());
    System.out.println("_id:" + response.getId());
    System.out.println("_result:" + response.getResult());

    client.close();
}

3)查询文档

@Test
public void getDoc() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    //创建请求对象
    GetRequest request = new GetRequest().index("user").id("1001");
    //发送请求 获取响应
    GetResponse response = client.get(request, RequestOptions.DEFAULT);

    //3.打印结果信息
    System.out.println("_index:" + response.getIndex());
    System.out.println("_type:" + response.getType());
    System.out.println("_id:" + response.getId());
    System.out.println("source:" + response.getSourceAsString());

    client.close();
}

4)删除文档

@Test
public void deleteDoc() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    // 删除请求对象
    DeleteRequest deleteRequest = new DeleteRequest().index("user").id("1001");
    DeleteResponse response = client.delete(deleteRequest, RequestOptions.DEFAULT);

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

    client.close();
}

5)批量新增文档

@Test
public void bulkInsertDoc() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();
    // 创建批量新增请求对象
    BulkRequest request = new BulkRequest();
    request.add(new IndexRequest().index("user").id("1001").source(XContentType.JSON, "name", "zhangsan", "age", 5, "sex", "男", "birthday", 1994));
    request.add(new IndexRequest().index("user").id("1002").source(XContentType.JSON, "name", "lisi", "age", 10, "sex", "女", "birthday", 1995));
    request.add(new IndexRequest().index("user").id("1003").source(XContentType.JSON, "name", "wangwu", "age", 10, "sex", "男", "birthday", 1996));
    request.add(new IndexRequest().index("user").id("1004").source(XContentType.JSON, "name", "zhaoliu", "age", 20, "sex", "女", "birthday", 1997));
    //发送请求, 获取响应
    BulkResponse response = client.bulk(request, RequestOptions.DEFAULT);

    System.out.println("took:" + response.getTook());
    System.out.println("items:" + Arrays.toString(response.getItems()));
    client.close();
}

6)批量删除文档

@Test
public void bulkDeleteDoc() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();
    //创建批量删除请求对象
    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("took:" + response.getTook());
    System.out.println("items:" + Arrays.toString(response.getItems()));

    client.close();
}

5、高级查询

写一个公共的打印结果的方法

/**
 * 打印结果
 *
 * @param response SearchResponse
 */
private void printResult(SearchResponse response) {
    // 查询匹配
    SearchHits hits = response.getHits();
    System.out.println("took:" + response.getTook());
    System.out.println("timeout:" + response.isTimedOut());
    System.out.println("total:" + hits.getTotalHits());
    System.out.println("MaxScore:" + hits.getMaxScore());
    System.out.println("hits========>>");
    for (SearchHit hit : hits) {
        //输出每条查询的结果信息
        System.out.println(hit.getSourceAsString());
    }
    System.out.println("<<========");
}

1)查询所有索引的文档数据

@Test
public void getAllSearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    // 创建搜索请求对象
    SearchRequest request = new SearchRequest();
    //request.indices("user", "student"); // 不设置索引, 会查询所有索引下的数据
    // 构建查询请求体
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // 查询所有数据
    sourceBuilder.query(QueryBuilders.matchAllQuery());
    request.source(sourceBuilder);

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

    // 查询匹配
    printResult(response);
    client.close();
}

2)term查询-关键字精确查询

@Test
public void getTermSearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    SearchRequest request = new SearchRequest();
    //request.indices("user");

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.termQuery("name", "zhangsan"));
    request.source(sourceBuilder);

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

    // 查询匹配
    printResult(response);

    client.close();
}

3)分页查询

@Test
public void getPageSearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    SearchRequest request = new SearchRequest();
    request.indices("user");

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.matchAllQuery()); // 查询所有

    //设置分页查询
    sourceBuilder.from(0); //当前页起始索引(第一条数据的顺序号)
    sourceBuilder.size(2); //每页查询条数

    request.source(sourceBuilder);

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

    printResult(response);

    client.close();
}

4)数据排序

@Test
public void getSortSearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    SearchRequest request = new SearchRequest();
    request.indices("user");

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.matchAllQuery());
    sourceBuilder.sort("age", SortOrder.ASC);

    request.source(sourceBuilder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    printResult(response);
    client.close();
}

5)过滤字段

@Test
public void getFilterSearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    SearchRequest request = new SearchRequest();
    request.indices("user");

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.matchAllQuery());
    // 查询字段过滤
    String[] excludes = {};
    String[] includes = {"name", "age"};
    sourceBuilder.fetchSource(includes, excludes);

    request.source(sourceBuilder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    printResult(response);
    client.close();
}

6)bool查询

@Test
public void getBoolSearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    SearchRequest request = new SearchRequest();
    request.indices("user");

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    // 必须包含
    boolQueryBuilder.must(QueryBuilders.matchQuery("age", 10));
    // 一定不包含
    boolQueryBuilder.mustNot(QueryBuilders.matchQuery("name", "zhangsan"));
    // 可能包含
    boolQueryBuilder.should(QueryBuilders.matchQuery("sex", "男"));
    sourceBuilder.query(boolQueryBuilder);

    request.source(sourceBuilder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    printResult(response);
    client.close();
}

7)范围查询

@Test
public void getRangeSearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();

    SearchRequest request = new SearchRequest();
    request.indices("user");

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(10).lte(30);

    sourceBuilder.query(rangeQueryBuilder);

    request.source(sourceBuilder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    printResult(response);
    client.close();
}

8)模糊查询

@Test
public void getFuzzySearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();
    SearchRequest request = new SearchRequest();
    request.indices("user");

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.fuzzyQuery("name", "zhangsan").fuzziness(Fuzziness.ONE));

    request.source(sourceBuilder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    printResult(response);
    client.close();
}

9)高亮查询

@Test
public void getHighlightSearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();
    SearchRequest request = new SearchRequest();
    request.indices("user");

    //查询请求体 构建器
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    //构建查询方式:高亮查询
    TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("name", "zhangsan");
    // 设置查询方式
    sourceBuilder.query(termsQueryBuilder);

    //构建高亮字段
    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.preTags("<font color='red'>");//设置标签前缀
    highlightBuilder.postTags("</font>");//设置标签后缀
    highlightBuilder.field("name");//设置高亮字段
    //设置高亮构建对象
    sourceBuilder.highlighter(highlightBuilder);

    request.source(sourceBuilder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    printResult(response);
    client.close();
}

10)聚合查询

最大值查询
@Test
public void getMaxSearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();
    SearchRequest request = new SearchRequest();
    request.indices("user");

    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.aggregation(AggregationBuilders.max("maxAge").field("age"));

    request.source(sourceBuilder);
    SearchResponse response = client.search(request, RequestOptions.DEFAULT);
    //printResult(response);
    SearchHits hits = response.getHits();
    System.out.println(response);
    client.close();
}

分组统计
@Test
public void getGroupSearch() throws Exception {
    RestHighLevelClient client = EsClientUtil.getClient();
    SearchRequest request = new SearchRequest();
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.aggregation(AggregationBuilders.terms("age_groupby").field("age"));

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

    System.out.println(response);
    client.close();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深海@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值