GQ ElasticSearch

什么是 Elasticsearch?它有哪些优势和应用场景?

Elasticsearch 是一个基于 Lucene 构建的开源分布式搜索引擎,它特别擅长处理大规模数据并提供快速搜索能力它通过建立索引加速检索,适用于全文搜索、日志分析、数据分析等场景

优势:

  • 速度快:因为基于 Lucene 构建,它的查询非常高效,尤其擅长处理大量数据,且支持实时搜索。
  • 扩展性强:它是分布式的,可以通过增加节点来扩展处理能力,适合大规模数据和高查询需求。
  • 多种搜索方式:不仅支持全文搜索,还支持模糊查询、地理位置查询等多种查询方式。
  • 实时分析:支持实时数据查询和分析,非常适合需要快速反馈的应用场景。
  • REST API:提供强大的 REST API,方便与其他系统进行集成。

应用场景:

  1. 搜索引擎:例如电商网站用它来快速检索商品或是新闻网站的内容搜索

  2. 日志分析:与 Logstash 和 Kibana 配合使用(ELK),进行大规模的日志数据分析。

  3. 实时监控:用于实时监控系统性能、数据变化等,帮助企业及时发现问题。

  4. 数据分析:数据科学家和分析师可以使用 Elasticsearch 进行数据分析,获得业务洞察。

与 MySQL 的区别:

  • 数据存储结构:Elasticsearch 使用 JSON 文档存储数据,而 MySQL 使用表格结构。Elasticsearch 更适合处理非结构化数据。

  • 查询方式:Elasticsearch 使用灵活的 Query DSL 查询语言,而 MySQL 使用 SQL。

  • 全文搜索能力:Elasticsearch 的全文搜索能力更强,而 MySQL 的全文搜索功能相对较弱。

如何使用 Elasticsearch 实现高亮显示搜索结果?

要在 Elasticsearch 中实现高亮显示搜索结果,你可以使用 Elasticsearch 的 highlighter 功能。具体步骤如下:

  1. 准备数据:首先,确保需要搜索的数据已经被索引到 Elasticsearch 中。
  2. 构建查询请求:在查询请求中,加入 highlight 配置,指定需要高亮显示的字段和高亮显示的样式。
  3. 解析响应结果:从 Elasticsearch 返回的查询结果中提取出高亮显示的部分,并展示给用户。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
POST /your_index/_search
{
"query": {
"match": {
"content": "elastic"
}
},
"highlight": {
"fields": {
"content": {}
}
}
}

在这个请求中,我们在 content 字段中搜索 "elastic",并且在响应结果中高亮显示包含该词的部分。

总结一下,高亮显示的基本步骤就是:你需要在查询中指定要高亮显示的字段,并在返回的结果中提取出高亮部分,展示给用户,方便他们看到关键字出现的位置。

我看到你的项目用到了ES做高亮显示能具体说说你是怎么做的吗?

  • 我们的高亮是用 ES 自带的 Highlighter 做的,场景是“视频搜索”。索引里主要搜两个字段:标题 videoName 和标签 tags
  • 查询的时候我在 DSL 里同时做两件事:一是 multi_match 搜这两个字段,二是加上 highlight 配置,指定高亮字段是 videoName,并设置前后缀标签,比如 <span class='highlight'></span>
  • ES 返回结果后,我从 hit.getHighlightFields() 里把高亮片段取出来,如果这个命中有高亮,就用它覆盖原来的标题,这样前端直接展示就是带 <span class='highlight'>关键词</span> 的字符串;前端只要给 .highlight 一个样式(比如黄色背景)就行。
  • 没有高亮的情况我就用原文回退,保证结果不空;排序这边除了相关性,还会叠加播放量等权重做二次排序。
  • 一句话总结:查询时让 ES 标注命中的关键词,返回时把高亮片段替换掉原字段,前端简单加个 CSS,用户就能一眼看到关键词出现的位置。

什么是 Elasticsearch 中的倒排索引?它有什么作用?

在Elasticsearch中,倒排索引是一种常用的数据结构,主要用于快速查找包含某个词汇的文档。与传统的正向索引结构不同,正向索引是根据文档建立的,记录每个文档包含的词汇。而倒排索引则是根据词汇建立的,记录每个词汇在哪些文档中出现,并且记录该词汇在文档中的位置。

具体来说,倒排索引的结构大致如下:

  1. 每个词汇(Term)会关联到一个或多个文档ID,并记录词汇在这些文档中的位置。
  2. 当用户输入一个查询关键字时,系统可以通过倒排索引快速找到包含该词汇的所有文档,再通过文档ID快速访问到相应的文档内容。

倒排索引的优点:

  • 快速查找:可以高效地定位包含特定词汇的文档。
  • 支持复杂查询:例如支持词组搜索、通配符搜索等。
  • 数据分析:倒排索引不仅能加速查询,还非常适合用于数据分析和统计,常用于搜索引擎、日志分析和推荐系统等领域。

倒排索引的构建过程:

  1. 分词:首先将文档中的内容分解为一个个单词或词项(Term),例如“深入理解Java核心技术”等文本,经过分词后会得到“深入”、“理解”、“Java”等词汇。
  2. 生成倒排表:将分词得到的词汇与文档ID进行关联,形成倒排表,记录每个词汇在哪些文档中出现。例如,“Java”词汇可能出现在文档1、2、3中。

通过这种方式,倒排索引能有效加速搜索引擎的检索速度,并且支持更复杂的查询功能。

如何通过 Elasticsearch 实现分布式事务?

Elasticsearch 本身并不直接支持分布式事务,因为它是一个主要用于全文搜索和分析的分布式搜索引擎,而非传统的关系型数据库,它并不提供像 ACID(原子性、一致性、隔离性、持久性)那样的强事务支持。

但是,Elasticsearch 提供了一些保证单个文档操作原子性的机制,也就是说,它能够确保对单个文档的操作(如创建、更新、删除)要么完全成功,要么完全失败,但它并不保证多个文档或跨多个操作的一致性

为了实现分布式事务,可以考虑以下方法:

  1. 借用消息队列:可以使用 Kafka、RabbitMQ 等消息队列来确保不同系统间的消息能够有序、可靠地传输。例如,在一个分布式事务中,操作成功后可以通过消息队列通知其他系统进行相应的操作。

  2. 双写架构:通过 Elasticsearch 和关系型数据库的双写来保证事务一致性。具体来说,在一个事务处理中,可以先在关系数据库中写入数据,再将数据同步到 Elasticsearch。

  3. 分布式事务协议:可以采用 Two-Phase Commit(2PC)或 Saga 模式来保证事务的最终一致性。2PC 协议可以确保多个参与方在事务的两阶段中一致地提交或回滚,而 Saga 模式则将大事务分解为多个小事务,每个小事务都有补偿操作,从而避免系统异常时无法回滚的情况。

小结
总结:Elasticsearch 不直接支持传统的 ACID 事务,但可以通过消息队列、双写架构和分布式事务协议(如 2PC 或 Saga)来保证分布式环境中的数据一致性。