当前位置: 首页 > news >正文

Elasticsearch 索引库操作与 Rest API 使用详解

1. 引入 Elasticsearch 依赖

在开始之前,确保你的 Maven 或 Gradle 项目中已经引入了 Elasticsearch 的 Java 客户端库。你可以使用以下 Maven 依赖:

```xml
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.15.0</version>
</dependency>
```

2. 连接 Elasticsearch 服务器

建立与 Elasticsearch 服务器的连接是使用它的第一步。以下是一个简单的连接示例:

```java
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;

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

 3. 创建索引

索引是 Elasticsearch 存储、索引和搜索的基本单元。下面是一个创建索引的示例:

```java
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.RequestOptions;

CreateIndexRequest request = new CreateIndexRequest("blog");
client.indices().create(request, RequestOptions.DEFAULT);
```

 4. 添加文档

一旦索引创建完成,你可以向其添加文档。以下是一个添加文档的简单示例:

```java
import org.elasticsearch.client.index.IndexRequest;

IndexRequest indexRequest = new IndexRequest("blog")
    .id("1")
    .source(Map.of("title", "Getting Started with Elasticsearch",
                  "content", "Elasticsearch is a powerful search engine."));
client.index(indexRequest, RequestOptions.DEFAULT);
```

5. 查询文档

使用 Elasticsearch 进行文档检索是其主要功能之一。以下是一个简单的查询示例:

```java
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.QueryBuilders;

SearchRequest searchRequest = new SearchRequest("blog");
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchQuery("title", "Elasticsearch"));
searchRequest.source(searchSourceBuilder);
SearchHits searchHits = client.search(searchRequest, RequestOptions.DEFAULT).getHits();

// 处理搜索结果
for (SearchHit hit : searchHits) {
    Map<String, Object> sourceAsMap = hit.getSourceAsMap();
    System.out.println(sourceAsMap);
}
```

6. 更新文档

更新文档是 Elasticsearch 中常见的操作之一。以下是一个更新文档的示例:

```java
import org.elasticsearch.action.update.UpdateRequest;

UpdateRequest updateRequest = new UpdateRequest("blog", "1")
    .doc(Map.of("content", "Elasticsearch is a scalable search engine."));
client.update(updateRequest, RequestOptions.DEFAULT);
```

7. 删除文档

删除文档同样是常见的操作。以下是一个删除文档的示例:

```java
import org.elasticsearch.client.DeleteRequest;

DeleteRequest deleteRequest = new DeleteRequest("blog", "1");
client.delete(deleteRequest, RequestOptions.DEFAULT);
```

8. 异常处理和资源释放

在实际开发中,务必注意异常处理和资源释放。使用 try-with-resources 语句可以确保资源在使用完毕后得到正确释放:

```java
try (RestHighLevelClient client = new RestHighLevelClient(
    RestClient.builder(new HttpHost("localhost", 9200, "http"))
)) {
    // 执行 Elasticsearch 操作
} catch (IOException e) {
    e.printStackTrace();
}
```

9. 深入实战:高级搜索与聚合操作

除了基本的增删改查操作,Elasticsearch 还提供了强大的搜索和聚合功能。例如,通过使用 `SearchSourceBuilder` 可以实现更复杂的查询条件,而聚合操作则能够对数据进行深度分析。在实际项目中,我们可以结合业务需求使用这些高级功能,提供更灵活和强大的搜索体验。

```java
// 添加一个范围过滤条件
searchSourceBuilder.query(QueryBuilders.rangeQuery("publish_date").gte("2022-01-01"));

// 添加一个聚合操作,统计每个作者的文章数
searchSourceBuilder.aggregation(AggregationBuilders
    .terms("authors").field("author.keyword")
    .subAggregation(AggregationBuilders.count("article_count").field("title"))
);

// 执行搜索
SearchHits advancedSearchHits = client.search(searchRequest, RequestOptions.DEFAULT).getHits();
```

 结语

通过本文的介绍,你应该对 Elasticsearch 中索引库的基本操作和 Rest API 有了更深入的理解。这些操作是构建强大搜索引擎的基础,同时也是 Java 开发者在实际项目中不可或缺的技能。在实际项目中,我们还可以结合高级搜索和聚合操作,提供更灵活和强大的搜索功能。希望这篇文章对你有所帮助。

相关文章:

  • Cloud
  • 【解决】使用Element-Plus icon图标不显示
  • 云ES高级监控告警
  • 【机器学习】朴素贝叶斯算法:多项式、高斯、伯努利,实例应用(心脏病预测)
  • 跨境电商测评新方案,安全可靠,高成功率
  • Python开源项目GPEN——人脸重建(Face Restoration),模糊清晰、划痕修复及黑白上色的实践
  • 基于蝠鲼觅食算法优化概率神经网络PNN的分类预测 - 附代码
  • 简单的 UDP 网络程序
  • Flink CDC
  • Android R.fraction
  • 快速使用vscode写python
  • element-plus使用el-date-picker组件时,如何禁止用户选择当前时间之后的日时分秒
  • 有什么进销存软件,比较适合零售行业日常开单要求及库存记录?
  • 设计模式-状态模式-笔记
  • Unable to find a single main class from the following candidates
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • JS实现简单的MVC模式开发小游戏
  • Mysql优化
  • REST架构的思考
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 包装类对象
  • 给github项目添加CI badge
  • 解决iview多表头动态更改列元素发生的错误
  • 强力优化Rancher k8s中国区的使用体验
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 微信小程序设置上一页数据
  • ​secrets --- 生成管理密码的安全随机数​
  • #大学#套接字
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $(selector).each()和$.each()的区别
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (2)(2.10) LTM telemetry
  • (4)事件处理——(7)简单事件(Simple events)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (ZT)出版业改革:该死的死,该生的生
  • (笔试题)合法字符串
  • (层次遍历)104. 二叉树的最大深度
  • (初研) Sentence-embedding fine-tune notebook
  • (分布式缓存)Redis哨兵
  • (转) ns2/nam与nam实现相关的文件
  • (转)创业家杂志:UCWEB天使第一步
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET MVC之AOP
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • ::什么意思
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @JsonSerialize注解的使用
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • []Telit UC864E 拨号上网