DB-TUTORIAL DB-TUTORIAL
数据库综合
数据库中间件
  • 综合
  • Mysql
  • 其他
  • MongoDB
  • Redis
  • Elasticsearch
  • Elastic技术栈
GitHub (opens new window)
数据库综合
数据库中间件
  • 综合
  • Mysql
  • 其他
  • MongoDB
  • Redis
  • Elasticsearch
  • Elastic技术栈
GitHub (opens new window)
  • 数据库综合

  • 数据库中间件

  • 关系型数据库

  • 文档数据库

  • KV数据库

  • 列式数据库

  • 搜索引擎数据库

    • Elasticsearch

      • Elasticsearch 面试总结
      • Elasticsearch 快速入门
      • Elasticsearch 简介
      • Elasticsearch 索引
      • Elasticsearch 查询
      • Elasticsearch 高亮搜索及显示
      • Elasticsearch 排序
      • Elasticsearch 聚合
      • Elasticsearch 分析器
      • Elasticsearch 性能优化
      • Elasticsearch Rest API
      • ElasticSearch Java API 之 High Level REST Client
        • 快速开始
          • 引入依赖
          • 创建连接和关闭
        • 索引 API
          • 测试准备
          • 创建索引
          • 删除索引
          • 判断索引是否存在
        • 文档 API
          • 文档测试准备
          • 创建文档
          • 删除文档
          • 更新文档
          • 查看文档
          • 获取匹配条件的记录总数
          • 分页查询
          • 条件查询
        • 参考资料
      • Elasticsearch 集群和分片
      • Elasticsearch 运维
    • Elastic

  • 数据库
  • 搜索引擎数据库
  • Elasticsearch
dunwu
2022-03-01
目录

ElasticSearch Java API 之 High Level REST Client

# ElasticSearch Java API 之 High Level REST Client

Elasticsearch 官方的 High Level REST Client 在 7.1.5.0 版本废弃。所以本文中的 API 不推荐使用。

# 快速开始

# 引入依赖

在 pom.xml 中引入以下依赖:

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

# 创建连接和关闭

// 创建连接
RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));

// 关闭
client.close();

# 索引 API

# 测试准备

public static final String INDEX = "mytest";
public static final String INDEX_ALIAS = "mytest_alias";
/**
 * {@link User} 的 mapping 结构(json形式)
 */
public static final String MAPPING_JSON =
  "{\n" + "  \"properties\": {\n" + "    \"_class\": {\n" + "      \"type\": \"keyword\",\n"
  + "      \"index\": false,\n" + "      \"doc_values\": false\n" + "    },\n" + "    \"description\": {\n"
  + "      \"type\": \"text\",\n" + "      \"fielddata\": true\n" + "    },\n" + "    \"enabled\": {\n"
  + "      \"type\": \"boolean\"\n" + "    },\n" + "    \"name\": {\n" + "      \"type\": \"text\",\n"
  + "      \"fielddata\": true\n" + "    }\n" + "  }\n" + "}";

@Autowired
private RestHighLevelClient client;

# 创建索引

// 创建索引
CreateIndexRequest createIndexRequest = new CreateIndexRequest(INDEX);

  // 设置索引的 settings
  createIndexRequest.settings(
  Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2));

  // 设置索引的 mapping
  createIndexRequest.mapping(MAPPING_JSON, XContentType.JSON);

  // 设置索引的别名
  createIndexRequest.alias(new Alias(INDEX_ALIAS));

  AcknowledgedResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
  Assertions.assertTrue(createIndexResponse.isAcknowledged());

# 删除索引

// 删除索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(INDEX);
  AcknowledgedResponse deleteResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
  Assertions.assertTrue(deleteResponse.isAcknowledged());

# 判断索引是否存在

GetIndexRequest getIndexRequest = new GetIndexRequest(INDEX);
  Assertions.assertTrue(client.indices().exists(getIndexRequest, RequestOptions.DEFAULT));
  GetIndexRequest getIndexAliasRequest = new GetIndexRequest(INDEX_ALIAS);
  Assertions.assertTrue(client.indices().exists(getIndexAliasRequest, RequestOptions.DEFAULT));

# 文档 API

# 文档测试准备

public static final String INDEX = "mytest";
public static final String INDEX_ALIAS = "mytest_alias";
/**
 * {@link User} 的 mapping 结构(json形式)
 */
public static final String MAPPING_JSON =
  "{\n" + "  \"properties\": {\n" + "    \"_class\": {\n" + "      \"type\": \"keyword\",\n"
  + "      \"index\": false,\n" + "      \"doc_values\": false\n" + "    },\n" + "    \"description\": {\n"
  + "      \"type\": \"text\",\n" + "      \"fielddata\": true\n" + "    },\n" + "    \"enabled\": {\n"
  + "      \"type\": \"boolean\"\n" + "    },\n" + "    \"name\": {\n" + "      \"type\": \"text\",\n"
  + "      \"fielddata\": true\n" + "    }\n" + "  }\n" + "}";

@Autowired
private RestHighLevelClient client;

@BeforeEach
public void init() throws IOException {

  // 创建索引
  CreateIndexRequest createIndexRequest = new CreateIndexRequest(INDEX);

  // 设置索引的 settings
  createIndexRequest.settings(
  Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2));

  // 设置索引的 mapping
  createIndexRequest.mapping(MAPPING_JSON, XContentType.JSON);

  // 设置索引的别名
  createIndexRequest.alias(new Alias(INDEX_ALIAS));

  AcknowledgedResponse response = client.indices().create(createIndexRequest, RequestOptions.DEFAULT);
  Assertions.assertTrue(response.isAcknowledged());

  // 判断索引是否存在
  GetIndexRequest getIndexRequest = new GetIndexRequest(INDEX_ALIAS);
  Assertions.assertTrue(client.indices().exists(getIndexRequest, RequestOptions.DEFAULT));
  GetIndexRequest getIndexAliasRequest = new GetIndexRequest(INDEX_ALIAS);
  Assertions.assertTrue(client.indices().exists(getIndexAliasRequest, RequestOptions.DEFAULT));
  }

@AfterEach
public void destroy() throws IOException {
  // 删除索引
  DeleteIndexRequest request = new DeleteIndexRequest(INDEX);
  AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
  Assertions.assertTrue(response.isAcknowledged());
  }

# 创建文档

RestHighLevelClient Api 使用 IndexRequest 来构建创建文档的请求参数。

【示例】创建 id 为 1 的文档

IndexRequest request = new IndexRequest("product");
  request.id("1");
  Product product = new Product();
  product.setName("机器人");
  product.setDescription("人工智能机器人");
  product.setEnabled(true);
  String jsonString = JSONUtil.toJsonStr(product);
  request.source(jsonString, XContentType.JSON);

同步执行

IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);

异步执行

// 异步执行
client.indexAsync(request, RequestOptions.DEFAULT, new ActionListener<IndexResponse>() {
@Override
public void onResponse(IndexResponse indexResponse) {
  System.out.println(indexResponse);
  }

@Override
public void onFailure(Exception e) {
  System.out.println("执行失败");
  }
  });

# 删除文档

RestHighLevelClient Api 使用 DeleteRequest 来构建删除文档的请求参数。

【示例】删除 id 为 1 的文档

DeleteRequest deleteRequest = new DeleteRequest(INDEX_ALIAS, "1");

同步执行

DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
  System.out.println(deleteResponse);

异步执行

client.deleteAsync(deleteRequest, RequestOptions.DEFAULT, new ActionListener<DeleteResponse>() {
@Override
public void onResponse(DeleteResponse deleteResponse) {
  System.out.println(deleteResponse);
  }

@Override
public void onFailure(Exception e) {
  System.out.println("执行失败");
  }
  });

# 更新文档

RestHighLevelClient Api 使用 UpdateRequest 来构建更新文档的请求参数。

【示例】更新 id 为 1 的文档

UpdateRequest updateRequest = new UpdateRequest(INDEX_ALIAS, "1");
  Product product3 = new Product();
  product3.setName("扫地机器人");
  product3.setDescription("人工智能扫地机器人");
  product3.setEnabled(true);
  String jsonString2 = JSONUtil.toJsonStr(product3);
  updateRequest.doc(jsonString2, XContentType.JSON);

同步执行

UpdateResponse updateResponse = client.update(updateRequest, RequestOptions.DEFAULT);
  System.out.println(updateResponse);

异步执行

client.updateAsync(updateRequest, RequestOptions.DEFAULT, new ActionListener<UpdateResponse>() {
@Override
public void onResponse(UpdateResponse updateResponse) {
  System.out.println(updateResponse);
  }

@Override
public void onFailure(Exception e) {
  System.out.println("执行失败");
  }
  });

# 查看文档

RestHighLevelClient Api 使用 GetRequest 来构建查看文档的请求参数。

【示例】查看 id 为 1 的文档

GetRequest getRequest = new GetRequest(INDEX_ALIAS, "1");

同步执行

GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);

异步执行

client.getAsync(getRequest, RequestOptions.DEFAULT, new ActionListener<GetResponse>() {
@Override
public void onResponse(GetResponse getResponse) {
  System.out.println(getResponse);
  }

@Override
public void onFailure(Exception e) {
  System.out.println("执行失败");
  }
});

# 获取匹配条件的记录总数

@Test
@DisplayName("获取匹配条件的记录总数")
public void count() throws IOException {
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.matchPhraseQuery("customer_gender", "MALE"));
    sourceBuilder.trackTotalHits(true);

    CountRequest countRequest = new CountRequest(INDEX);
    countRequest.source(sourceBuilder);

    CountResponse countResponse = client.count(countRequest, RequestOptions.DEFAULT);
    long count = countResponse.getCount();
    System.out.println("命中记录数:" + count);
}

# 分页查询

@ParameterizedTest
@ValueSource(ints = {0, 1, 2, 3})
@DisplayName("分页查询测试")
public void pageTest(int page) throws IOException {

    int size = 10;
    int offset = page * size;
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.matchPhraseQuery("customer_gender", "MALE"));
    sourceBuilder.from(offset);
    sourceBuilder.size(size);
    sourceBuilder.trackTotalHits(true);

    SearchRequest searchRequest = new SearchRequest(INDEX);
    searchRequest.source(sourceBuilder);
    SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    SearchHit[] hits = response.getHits().getHits();
    for (SearchHit hit : hits) {
        KibanaSampleDataEcommerceBean bean =
            BeanUtil.mapToBean(hit.getSourceAsMap(), KibanaSampleDataEcommerceBean.class, true,
                               CopyOptions.create());
        System.out.println(bean);
    }
}

# 条件查询

@Test
@DisplayName("条件查询")
public void matchPhraseQuery() throws IOException {
    SearchRequest searchRequest = new SearchRequest(INDEX);
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();

    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    boolQueryBuilder.must(QueryBuilders.matchPhraseQuery("customer_last_name", "Jensen"));
    sourceBuilder.query(boolQueryBuilder);
    sourceBuilder.trackTotalHits(true);
    searchRequest.source(sourceBuilder);
    SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT);
    SearchHit[] hits = response.getHits().getHits();
    for (SearchHit hit : hits) {
        KibanaSampleDataEcommerceBean bean =
            BeanUtil.mapToBean(hit.getSourceAsMap(), KibanaSampleDataEcommerceBean.class, true,
                               CopyOptions.create());
        System.out.println(bean);
    }
}

# 参考资料

  • 官方
    • Java High Level REST Client (opens new window)
📝 帮助改善此页面! (opens new window)
#数据库#搜索引擎数据库#Elasticsearch#API
上次更新: 2024/10/09, 07:16:02
Elasticsearch Rest API
Elasticsearch 集群和分片

← Elasticsearch Rest API Elasticsearch 集群和分片→

最近更新
01
HBase Java API 管理功能
04-13
02
HBase Java API 其他高级特性
03-31
03
HBase 数据模型
03-16
更多文章>
Theme by Vdoing | Copyright © 2019-2024 钝悟(dunwu) | CC-BY-SA-4.0
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×