一段话总结
Elasticsearch 是一款高性能分布式搜索引擎,在搜索引擎技术排名中位居前列。它基于 Lucene 开发,具备分布式、水平扩展、提供 Restful 接口等优势,常与 kibana、Logstash、Beats 组成 ELK 技术栈,应用于日志数据分析、实时监控等领域。其核心概念包括倒排索引、IK 分词器,涉及索引库、文档的多种操作,并且提供 JavaRestClient 客户端进行开发,方便与应用程序集成。
思维导图

详细总结
-
Elasticsearch 简介
- 起源与发展 :基于 Lucene 开发,2004 年 Shay Banon 开发 Compass,2010 年重写后命名为 Elasticsearch,官网为Elastic --- 搜索 AI 公司 | Elastic ,当前最新版本 8.x.x。
- 优势:支持分布式且可水平扩展,提供 Restful 接口,方便与各种语言的应用程序交互。
- 应用场景:与 kibana、Logstash、Beats 组成 ELK 技术栈,广泛应用于日志数据分析、实时监控等领域。
-
核心概念
- 倒排索引:与传统数据库正向索引不同,对文档内容分词,为词条创建索引并记录文档 id,查询时先查词条得文档 id 再查文档,提升查询效率。
- IK 分词器:用于中文分词,采用正向迭代最细粒度切分算法。可在 Kibana 的 DevTools 中测试,还能通过配置拓展词典增加自定义词库。
- 基础概念 :文档以 JSON 格式存储,索引是相同类型文档的集合,映射是对索引中文档的字段约束信息。与 MySQL 对比见下表:
|MySQL|Elasticsearch | 说明 |
|---|---|---|
|Table|Index | 索引类似数据库的表 |
|Row|Document | 文档类似数据库中的行,为 JSON 格式 |
|Column|Field | 字段类似数据库中的列 |
|Schema|Mapping|Mapping 类似数据库的表结构,用于约束文档字段 |
|SQL|DSL|DSL 是 JSON 风格请求语句,用于操作 Elasticsearch|
-
操作与语法
- 索引库操作:通过 Restful 接口实现创建(PUT / 索引库名)、查询(GET / 索引库名 )、删除(DELETE / 索引库名 )、添加字段(PUT / 索引库名 /_mapping)操作。例如创建索引库 heima 并设置 mapping:
PUT /heima
{
"mappings": {
"properties": {
"info":{
"type": "text",
"analyzer": "ik_smart"
},
"email":{
"type": "keyword",
"index": "false"
},
"name":{
"properties": {
"firstName": {
"type": "keyword"
}
}
}
}
}
}
-
文档操作:支持文档的创建(POST / 索引库名 /_doc/ 文档 id )、查询(GET / 索引库名 /_doc/ 文档 id )、删除(DELETE / 索引库名 /_doc/ 文档 id )、修改(全量修改 PUT / 索引库名 /_doc/ 文档 id ;增量修改 POST / 索引库名 /_update/ 文档 id )操作,也允许批量处理(POST /_bulk)。
-
JavaRestClient:多数企业使用 8 以下版本,选择早期 JavaRestClient 客户端。初始化需引入依赖、覆盖默认 ES 版本并创建 RestHighLevelClient 对象。通过该客户端可进行索引库和文档的各种操作,如创建索引库:
@Test
void testCreateIndex() throws IOException {
CreateIndexRequest request = new CreateIndexRequest("items");
request.source(MAPPING_TEMPLATE, XContentType.JSON);
client.indices().create(request, RequestOptions.DEFAULT);
}
关键问题
- Elasticsearch 相比其他搜索引擎的优势体现在哪些方面?
- 答案:Elasticsearch 支持分布式且可水平扩展,能应对大规模数据存储和高并发查询需求;提供 Restful 接口,方便各种语言的应用程序调用,兼容性强;结合 ELK 技术栈,在日志数据分析、实时监控等领域有强大的功能,而其他搜索引擎可能不具备这些综合优势。
- IK 分词器如何进行自定义词库拓展?
- 答案:通过修改 IK 分词器 config 目录下的 IkAnalyzer.cfg.xml 文件来添加拓展词典。在文件中添加
<entry key="ext_dict">ext.dic</entry>
这样的配置,然后在 ext.dic 词典文件中添加拓展词条即可。
- 答案:通过修改 IK 分词器 config 目录下的 IkAnalyzer.cfg.xml 文件来添加拓展词典。在文件中添加
- 使用 JavaRestClient 进行文档操作时,全量更新和局部更新有何区别?
- 答案:全量更新是再次写入 id 一样的文档,会删除旧文档并添加新文档,其 JavaAPI 与新增文档一致;局部更新则是只更新指定部分字段,使用 UpdateRequest 对象并通过
request.doc("字段名", "新值")
的方式设置要更新的字段,不会删除旧文档的其他字段内容。
- 答案:全量更新是再次写入 id 一样的文档,会删除旧文档并添加新文档,其 JavaAPI 与新增文档一致;局部更新则是只更新指定部分字段,使用 UpdateRequest 对象并通过