image-20240420163459407

Java面试题

1. Mysql联合索引和普通索引的区别

  1. 联合索引是将多个字段组合在一起创建索引,普通索引是单个字段创建索引
  2. 联合索引的查询效率高于普通索引,因为联合索引可以减少索引的数量,减少磁盘I/O次数
  3. 联合索引的字段顺序很重要,查询时必须按照索引字段的顺序查询,否则无法使用索引
  4. 联合索引的字段越多,索引的效率越低,因为索引的维护成本会增加

2. Mysql事务索引失效的原因

  1. 事务中的字段没有建立索引
  2. 事务中的字段使用了函数,导致索引失效
  3. 事务中的字段使用了运算符,导致索引失效
  4. 事务中的字段使用了类型转换,导致索引失效
  5. 事务中的字段使用了模糊查询,导致索引失效
  6. 事务中的字段使用了排序,导致索引失效
  7. 事务中的字段使用了范围查询,导致索引失效
  8. 事务中的字段使用了NULL值,导致索引失效
  9. 事务中的字段使用了OR条件,导致索引失效

3. Mysql聚集索引和非聚集索引的区别

聚集索引是一种按照数据物理顺序排列的索引,它决定了数据在磁盘上的存储顺序。当表有聚集索引时,表的数据按照聚集索引的顺序存储在磁盘上。如果表有主键,并且主键索引是聚集索引,那么表的数据就按照主键的顺序存储。

举个例子,假设有一个包含学生信息的表,并且该表有一个聚集索引是按照学生的学号进行排序的。那么当新的学生信息插入表中时,数据库系统会根据学号的顺序将数据存储在磁盘上,这样相邻的学号会被物理存储在相邻的磁盘位置上。这种物理存储的有序性可以提高查询效率,因为当根据学号进行查询时,数据库系统可以更快地定位到相关数据。

  1. 聚集索引是将数据和索引存放在一起,非聚集索引是将数据和索引分开存放
  2. 聚集索引的叶子节点存放的是数据,非聚集索引的叶子节点存放的是指向数据的指针
  3. 聚集索引的查询效率高于非聚集索引,因为聚集索引可以减少磁盘I/O次数
  4. 聚集索引的更新效率低于非聚集索引,因为聚集索引会导致数据的移动
  5. 聚集索引的字段顺序很重要,查询时必须按照索引字段的顺序查询,否则无法使用索引

4. 使用b+树的优点

  1. b+树是一种多路搜索树,每个节点可以存储多个关键字和指针,可以减少磁盘I/O次数
  2. b+树的叶子节点存放的是数据,可以减少磁盘I/O次数
  3. b+树的查询效率高,因为b+树是平衡的,每个节点的高度相同
  4. b+树的插入和删除效率高,因为b+树是平衡的,每个节点的高度相同
  5. b+树的范围查询效率高,因为b+树的叶子节点是有序的
  6. b+树的扫描效率高,因为b+树的叶子节点是有序的
  7. b+树的更新效率高,因为b+树的叶子节点存放的是数据
  8. b+树的空间利用率高,因为b+树的叶子节点存放的是数据,内部节点只存放指针
  9. 稳定的对数时间复杂度:B+树的插入与修改操作具有较稳定的对数时间复杂度,这意味着无论数据量多大,B+树的查询、插入和删除操作的时间复杂度都能保持在较低的水平。

5. Mysql间隙锁的作用

间隙锁是一种锁定范围的锁,用于锁定一个范围内的数据,防止其他事务插入数据。间隙锁的作用是保证范围查询的一致性,防止其他事务在范围查询的过程中插入数据,导致查询结果不一致。

举个例子,假设有一个包含学生信息的表,并且该表有一个索引是按照学生的学号进行排序的。当一个事务执行范围查询时,数据库系统会在查询的范围内加上间隙锁,防止其他事务在这个范围内插入数据。这样可以保证查询结果的一致性,防止其他事务插入数据导致查询结果不一致。

  1. 间隙锁是一种锁定范围的锁,用于锁定一个范围内的数据
  2. 间隙锁的作用是保证范围查询的一致性,防止其他事务插入数据
  3. 左开右开
  4. 间隙锁会导致锁冲突,降低并发性能
  5. 间隙锁会导致锁等待,降低并发性能

6. Mysql日志MVVC的原理

MVCC(Multi-Version Concurrency Control)是一种多版本并发控制机制,用于实现数据库的并发访问。MVCC的原理是在数据库中保存多个版本的数据,每个事务在执行时都可以看到一个一致性的快照,而不会受到其他事务的影响。

MVCC的实现原理是在每个数据行上保存多个版本的数据,每个版本都有一个时间戳,用于标识该版本的创建时间。当一个事务更新数据时,数据库系统会创建一个新的版本,并将新版本的时间戳保存在数据行上。其他事务在读取数据时,会根据事务的时间戳来选择合适的版本,从而实现并发访问。

MVCC的优点是可以提高数据库的并发性能,因为每个事务都可以看到一个一致性的快照,而不会受到其他事务的影响。MVCC的缺点是会增加数据库的存储空间,因为需要保存多个版本的数据。

redo log

1.实现数据库的恢复
2.实现数据库的持久化

redo log是一种日志文件,用于记录数据库的更新操作。redo log的作用是在数据库发生故障时,可以通过重放redo log来恢复数据。redo log的实现原理是在每次更新操作时,数据库系统会将更新操作记录到redo log中,然后再将更新操作写入到磁盘中。这样可以保证即使数据库发生故障,也可以通过重放redo log来恢复数据。

redo log的优点是可以提高数据库的可靠性,因为即使数据库发生故障,也可以通过redo log来恢复数据。redo log的缺点是会增加数据库的存储空间,因为需要保存更新操作的日志。

undo log

1.实现事务回滚
2.版本控制

undo log是一种日志文件,用于记录数据库的回滚操作。undo log的作用是在事务回滚时,可以通过undo log来恢复数据。undo log的实现原理是在每次事务执行时,数据库系统会将事务的更新操作记录到undo log中,然后再将事务的更新操作写入到磁盘中。这样可以保证即使事务回滚,也可以通过undo log来恢复数据。

流程:

  1. 事务开始时,数据库系统会创建一个undo log,用于记录事务的更新操作
  2. 事务执行时,数据库系统会将事务的更新操作的相反操作记录到undo log中
  3. 事务失败时,数据库系统会通过undo log来恢复数据
  4. 事务提交时,数据库系统会删除undo log

undo log的优点是可以提高数据库的可靠性,因为即使事务回滚,也可以通过undo log来恢复数据。undo log的缺点是会增加数据库的存储空间,因为需要保存事务的更新操作的日志。

每次更新操作都会生成一个undo log,用于记录更新操作的相反操作。当事务回滚时,数据库系统会通过undo log来恢复数据。

包含roll_pointer,指向上一个undo log,用于回滚操作.还有trx_id,事务id,用于事务的回滚操作。

对于读提交,是在每个select语句开始时,生成一个read view,事务期间多次读取可能出现不一致。
可重复读,是在事务开始时生成一个read view,事务期间多次读取保持一致。
通过ReadView来判断事务的可见性,ReadView包含了事务的开始时间和结束时间,以及事务的ID。如果不满足,顺着roll_pointer回滚。

7. Mysql多版本并发控制的实现原理

MVCC(Multi-Version Concurrency Control)是一种多版本并发控制机制,用于实现数据库的并发访问。MVCC的原理是在数据库中保存多个版本的数据,每个事务在执行时都可以看到一个一致性的快照,而不会受到其他事务的影响。

MVCC的实现原理是在每个数据行上保存多个版本的数据,每个版本都有一个时间戳,用于标识该版本的创建时间。当一个事务更新数据时,数据库系统会创建一个新的版本,并将新版本的时间戳保存在数据行上。其他事务在读取数据时,会根据事务的时间戳来选择合适的版本,从而实现并发访问。

MVCC的优点是可以提高数据库的并发性能,因为每个事务都可以看到一个一致性的快照,而不会受到其他事务的影响。MVCC的缺点是会增加数据库的存储空间,因为需要保存多个版本的数据。

ReadView结构

  1. trx_id:事务ID,用于判断事务的可见性
  2. low_limit_id:事务的开始时间,用于判断事务的可见性
  3. up_limit_id:事务的结束时间,用于判断事务的可见性
  4. creator_id:创建ReadView的事务ID,用于判断事务的可见性
  5. m_ids:事务的ID,用于判断事务的可见性

8. 线程池是什么

线程池是一种用于管理线程的机制,用于提高线程的使用效率。线程池的原理是在程序启动时创建一定数量的线程,并将这些线程保存在一个线程池中。当需要执行任务时,可以从线程池中获取一个空闲的线程来执行任务,而不需要每次都创建一个新的线程。

9. Redis是单线程还是多线程

Redis 是单线程的。它采用单线程模型来处理客户端请求和数据操作。这意味着 Redis 在任何时候只能处理一个请求,不支持并发处理多个请求。

但是有 关闭文件,AOF重写,RDB快照,主从复制,集群等操作是多线程的。

尽管 Redis 是单线程的,但它通过使用非阻塞 I/O 和事件驱动的方式来提高性能和并发处理能力。Redis 使用了事件循环(Event Loop)机制,通过监听事件并且在事件到达时进行相应的处理,从而实现了高效的 I/O 处理和事件驱动。

在 Redis 中,主要的性能瓶颈通常出现在 CPU、内存和网络带宽等方面,而不是单线程模型造成的性能问题。因此,即使 Redis 是单线程的,它仍然能够处理大量的并发请求,并且在许多场景下表现出色。

需要注意的是,虽然 Redis 是单线程的,但 Redis Cluster 是支持多线程的。Redis Cluster 是 Redis 的分布式解决方案,它可以将数据分布到多个节点中,并且允许多个节点同时处理请求,从而提高了整个系统的并发处理能力。

10. Redis zset的底层实现

Redis 的有序集合(Sorted Set)是一种数据结构,它可以存储多个元素,并且每个元素都有一个分数(Score)值。有序集合的元素是唯一的,但是分数可以重复。有序集合的元素按照分数的大小进行排序,分数越小的元素越靠前。

有序集合的底层实现是跳跃表(Skip List),它是一种有序的链表结构,可以快速查找元素。跳跃表的特点是每个节点都包含多个指针,可以跳过多个节点进行查找,从而提高查找效率。

跳跃表的插入、删除和查找操作的时间复杂度都是 O(log n),其中 n 是元素的个数。跳跃表的空间复杂度是 O(n),因为每个节点都包含多个指针。

11. Redis的持久化机制

Redis 的持久化机制是用于将内存中的数据持久化到磁盘中,以防止数据丢失。Redis 提供了两种持久化机制:RDB(Redis DataBase)快照和 AOF(Append Only File)日志。

  1. RDB快照:RDB 快照是将内存中的数据保存到磁盘中的一个快照文件中。RDB 快照是通过将内存中的数据序列化为二进制格式,然后保存到磁盘中。RDB 快照的优点是可以减少磁盘的 I/O 操作,因为只需要保存一次快照。RDB 快照的缺点是可能会丢失部分数据,因为 RDB 快照是定期保存的,如果 Redis 发生故障,可能会丢失最后一次快照之后的数据。
  2. AOF日志:AOF 日志是将内存中的数据保存到磁盘中的一个日志文件中。AOF 日志是通过将内存中的数据序列化为文本格式,然后保存到磁盘中。AOF 日志的优点是可以保证数据的完整性,因为每次更新操作都会记录到 AOF 日志中。AOF 日志的缺点是可能会增加磁盘的 I/O 操作,因为每次更新操作都需要写入到 AOF 日志中。

12. Redis 主机宕机后怎么办

  1. 重启 Redis 主机:如果 Redis 主机宕机后,可以尝试重启 Redis 主机,让 Redis 重新启动。这样可以恢复 Redis 的服务,但是可能会丢失部分数据。
  2. 从备份中恢复数据:如果 Redis 主机宕机后,可以尝试从备份中恢复数据。可以使用 RDB 快照或 AOF 日志来恢复数据,从而恢复 Redis 的数据。
  3. 使用 Redis Sentinel:如果 Redis 主机宕机后,可以使用 Redis Sentinel 来监控 Redis 主从节点的状态。Redis Sentinel 可以自动切换主从节点,从而保证 Redis 的高可用性。
  4. 使用 Redis Cluster:如果 Redis 主机宕机后,可以使用 Redis Cluster 来分布数据到多个节点中。Redis Cluster 可以自动分配数据到多个节点中,从而保证 Redis 的高可用性。
  5. 使用 Redis Replication:如果 Redis 主机宕机后,可以使用 Redis Replication 来复制数据到多个节点中。Redis Replication 可以将数据复制到多个节点中,从而保证 Redis 的高可用性。

13. Redis的主从复制原理

Redis 的主从复制是一种数据同步机制,用于将主节点的数据复制到从节点中。主从复制的原理是主节点将更新操作记录到 AOF 日志中,然后从节点通过复制 AOF 日志来同步数据。

主从复制的流程如下:

  1. 主节点将更新操作记录到 AOF 日志中
  2. 从节点通过复制 AOF 日志来同步数据
  3. 从节点将 AOF 日志中的更新操作应用到自己的数据中
  4. 从节点将更新操作记录到自己的 AOF 日志中
  5. 从节点将更新操作记录到自己的 RDB 快照中
  6. 从节点将更新操作记录到自己的内存中
  7. 从节点成为主节点

主从复制的优点是可以提高 Redis 的可用性和性能,因为可以将数据复制到多个节点中,从而提高读写性能。主从复制的缺点是可能会增加网络带宽和磁盘 I/O 操作,因为需要复制数据到多个节点中。

14. 从输入 URL 到页面展示的整个过程

  1. 输入 URL:用户在浏览器中输入 URL 地址,浏览器会将 URL 地址发送给 DNS 服务器,DNS 服务器会将 URL 地址解析为 IP 地址。
  2. 建立连接:浏览器通过 IP 地址和端口号建立 TCP 连接,然后发送 HTTP 请求。
  3. 发送请求:浏览器发送 HTTP 请求到服务器,服务器接收到请求后,根据请求的 URL 地址和参数来处理请求。
  4. 处理请求:服务器根据请求的 URL 地址和参数来处理请求,然后生成响应数据。
  5. 发送响应:服务器将响应数据发送给浏览器,浏览器接收到响应数据后,根据响应数据来渲染页面。
  6. 渲染页面:浏览器根据响应数据来渲染页面,然后将页面展示给用户。
  7. 关闭连接:浏览器和服务器之间的 TCP 连接在请求和响应结束后会自动关闭。

15. 什么是跨域

跨域是指浏览器的同源策略限制了不同域名之间的资源共享。同源策略是浏览器的一种安全策略,用于防止恶意网站窃取用户信息。同源策略要求不同域名之间的资源共享必须满足以下条件:

  1. 协议相同:两个域名的协议必须相同,例如都是 http 或者都是 https。
  2. 域名相同:两个域名的主域名必须相同,例如 www.example.com 和 example.com。
  3. 端口相同:两个域名的端口号必须相同,例如都是 80 或者都是 443。
  4. 限制 Cookie:浏览器的同源策略还限制了 Cookie 的读取,不同域名之间的 Cookie 不能共享。

16. TCP 和 UDP 的区别

  1. 连接方式:TCP 是面向连接的协议,UDP 是面向无连接的协议。
  2. 可靠性:TCP 是可靠的协议,UDP 是不可靠的协议。
  3. 传输方式:TCP 是面向字节流的协议,UDP 是面向报文的协议。
  4. 传输速度:TCP 的传输速度比 UDP 慢。
  5. 适用场景:TCP 适用于要求可靠传输的场景,UDP 适用于要求实时传输的场景。
  6. 连接数量:TCP 是一对一的连接,UDP 是一对多的连接。
  7. 重传机制:TCP 有重传机制,UDP 没有重传机制。
  8. 拥塞控制:TCP 有拥塞控制机制,UDP 没有拥塞控制机制。
  9. 首部开销:TCP 的首部开销比 UDP 大。

17. TCP拥塞控制

TCP 拥塞控制是一种用于控制网络拥塞的机制,用于避免网络拥塞导致数据丢失和延迟。TCP 拥塞控制的原理是通过动态调整发送窗口和接收窗口的大小,从而控制数据的传输速度。

TCP 拥塞控制的算法有四种:慢启动、拥塞避免、快速重传和快速恢复。

  1. 慢启动:慢启动是一种逐渐增加发送窗口的算法,用于控制数据的传输速度。慢启动的原理是从一个较小的发送窗口开始发送数据,然后逐渐增加发送窗口的大小,直到达到网络的容量。
  2. 拥塞避免:拥塞避免是一种动态调整发送窗口的算法,用于避免网络拥塞。拥塞避免的原理是在慢启动阶段逐渐增加发送窗口的大小,然后在拥塞避免阶段以线性增加的方式增加发送窗口的大小。
  3. 快速重传:快速重传是一种快速重传丢失数据的算法,用于快速重传丢失的数据。快速重传的原理是在接收到重复的 ACK 时,立即重传丢失的数据,从而避免等待超时。
  4. 快速恢复:快速恢复是一种快速恢复拥塞窗口的算法,用于快速恢复拥塞窗口的大小。快速恢复的原理是在接收到重复的 ACK 时,将拥塞窗口的大小减半,然后进入拥塞避免阶段。

18. TCP粘包和拆包

TCP 粘包和拆包是一种网络传输中常见的问题,用于解决数据传输过程中的数据粘包和拆包问题。TCP 粘包和拆包的原因是 TCP 是面向流的协议,数据是以流的形式传输的,没有消息边界。

TCP 粘包和拆包的解决方法有四种:固定长度、分隔符、消息长度和消息头。

  1. 固定长度:固定长度是一种固定长度的方式来解决数据粘包和拆包问题。固定长度的原理是将数据按照固定长度来发送和接收,从而保证数据的完整性。
  2. 分隔符:分隔符是一种特殊字符来分隔数据的方式来解决数据粘包和拆包问题。分隔符的原理是在数据的末尾添加一个特殊字符来标识数据的结束,从而保证数据的完整性。
  3. 消息长度:消息长度是一种消息长度的方式来解决数据粘包和拆包问题。消息长度的原理是在数据的开头添加一个消息长度来标识数据的长度,从而保证数据的完整性。
  4. 消息头:消息头是一种消息头的方式来解决数据粘包和拆包问题。消息头的原理是在数据的开头添加一个消息头来标识数据的类型和长度,从而保证数据的完整性。

19. Linux的IO多路复用

Linux 的 IO 多路复用是一种用于处理多个文件描述符的机制,用于提高 IO 的效率。IO 多路复用的原理是通过一个线程来监听多个文件描述符,当有文件描述符就绪时,线程会调用相应的处理函数来处理文件描述符。

IO 多路复用的优点是可以减少线程的数量,从而减少线程的上下文切换开销。IO 多路复用的缺点是可能会增加系统的复杂性,因为需要处理多个文件描述符。

没错,你说得对!Linux 中的 IO 多路复用机制主要有三种:select、poll 和 epoll。它们都是用来实现在单个线程中同时监听多个 IO 事件的方法,从而提高系统的性能和效率。

  1. select

    • select 是最早的 IO 多路复用机制之一,它可以同时监听多个文件描述符(通常是 socket),并在其中任意一个文件描述符就绪(有数据可读或可写)时通知用户程序。
    • select 的主要限制是,它使用一个位图来表示要监听的文件描述符,因此在文件描述符较多时(超过 1024),效率会下降,并且需要将要监听的文件描述符复制到内核空间,因此在大规模并发的情况下性能有限。
  2. poll

    • poll 是对 select 的改进,它使用链表来管理文件描述符,因此可以监听的文件描述符数量理论上没有限制(实际受限于系统资源)。
    • poll 的使用方式与 select 类似,但在性能上比 select 有所提升,尤其是在大规模并发的情况下效率更高。
  3. epoll

    • epoll 是 Linux 2.6 内核引入的新的 IO 多路复用机制,相比于 selectpollepoll 在性能和扩展性上都有很大的优势。
    • epoll 使用事件驱动的方式来处理 IO 事件,只有当文件描述符准备就绪时才会通知用户程序,因此减少了不必要的遍历。
    • epoll 提供了三种操作模式:EPOLL_CTL_ADD(添加文件描述符)、EPOLL_CTL_MOD(修改文件描述符监听状态)、EPOLL_CTL_DEL(删除文件描述符)。
    • epoll 支持水平触发(LT)和边缘触发(ET)两种触发模式,ET 模式下效率更高但使用起来更复杂,需要注意处理事件不完整的情况。

epoll 的底层实现是通过 Linux 内核提供的事件驱动机制来完成的。在 Linux 内核中,epoll 使用了一些数据结构和算法来实现高效的 IO 多路复用。

具体来说,epoll 的底层主要包括以下几个组成部分:

  1. 红黑树(Red-Black Tree)

    • epoll 使用红黑树来管理文件描述符,将需要监听的文件描述符添加到红黑树中,并根据文件描述符的状态进行维护和调整。
    • 红黑树是一种自平衡的二叉搜索树,具有较好的平衡性和查找性能,能够快速找到文件描述符对应的数据结构。
  2. 就绪链表(Ready List)

    • epoll 使用就绪链表来存储已经就绪(可读、可写等)的文件描述符。
    • 当文件描述符就绪时,内核会将其添加到就绪链表中,并通过事件通知机制告知用户程序。
  3. 事件表(Event Table)

    • epoll 使用事件表来管理所有的事件,包括已经就绪的文件描述符和需要监听的文件描述符。
    • 当有事件发生时,内核会将事件加入到事件表中,并根据事件的类型和状态进行相应的处理。
  4. 等待队列(Wait Queue)

    • epoll 使用等待队列来管理等待事件的进程或线程。
    • 当没有事件发生时,内核会将进程或线程加入到等待队列中,直到有事件发生并通知等待的进程或线程。

通过以上这些底层数据结构和算法,epoll 能够实现高效的 IO 多路复用。它避免了传统的轮询方式,能够快速响应就绪的文件描述符,并且具有良好的扩展性和性能表现,在处理大规模并发的场景下表现出色。
总的来说,epoll 是目前 Linux 系统中推荐的 IO 多路复用机制,它在高并发和大规模连接的场景下性能表现更优秀。

20. 介绍RPC协议

RPC(Remote Procedure Call)是一种远程过程调用协议,用于实现不同计算机之间的远程调用。RPC 的原理是通过网络传输协议来调用远程计算机上的函数或方法,从而实现不同计算机之间的通信和数据交换。

21. ES如何进行全文搜索

在 Elasticsearch 中进行全文搜索通常使用全文搜索功能和相关的查询语句来实现。以下是一些常用的全文搜索方法:

  1. Match 查询

    • 使用 match 查询可以进行全文搜索,它会将输入的文本分词,并搜索包含任意一个分词的文档。
    • 例如,搜索包含 “quick brown fox” 中任意单词的文档:
      GET /my_index/_search
      {
      "query": {
      "match": {
      "content": "quick brown fox"
      }
      }
      }
  2. Match Phrase 查询

    • 使用 match_phrase 查询可以进行短语匹配搜索,要求文档中必须包含完整的短语。
    • 例如,搜索包含短语 “quick brown fox” 的文档:
      GET /my_index/_search
      {
      "query": {
      "match_phrase": {
      "content": "quick brown fox"
      }
      }
      }
  3. Term 查询

    • 使用 term 查询可以精确匹配某个字段的值,不进行分词。
    • 例如,搜索特定的文档 ID:
      GET /my_index/_search
      {
      "query": {
      "term": {
      "doc_id": "abc123"
      }
      }
      }
  4. Multi-match 查询

    • 使用 multi_match 查询可以在多个字段中进行全文搜索。
    • 例如,搜索标题和内容中包含 “quick brown fox” 的文档:
      GET /my_index/_search
      {
      "query": {
      "multi_match": {
      "query": "quick brown fox",
      "fields": ["title", "content"]
      }
      }
      }
  5. Wildcards 查询

    • 使用通配符查询可以匹配符合特定模式的文本。
    • 例如,搜索以 “quick” 开头的文档:
      GET /my_index/_search
      {
      "query": {
      "wildcard": {
      "content": "quick*"
      }
      }
      }
  6. 正则表达式查询

    • 使用正则表达式查询可以更灵活地进行文本匹配。
    • 例如,使用正则表达式搜索包含数字的文档:
      GET /my_index/_search
      {
      "query": {
      "regexp": {
      "content": "\\d+"
      }
      }
      }

以上是一些常用的全文搜索方法和查询语句,可以根据实际需求选择合适的方式进行全文搜索操作。

22. 什么是倒排索引

倒排索引(Inverted Index)是 Elasticsearch(ES)等搜索引擎中常用的一种数据结构,用于加速全文搜索和检索过程。倒排索引的基本思想是将文档中的每个词(term)映射到包含该词的所有文档的列表中,从而实现根据词来快速查找文档的目的。

具体来说,倒排索引由两个主要部分组成:

  1. 词典(Dictionary)

    • 词典是倒排索引的关键部分,它包含了文档中出现的所有不重复的词(terms)。每个词都有一个唯一的词项编号(term ID)与之对应。
    • 词典通常存储在内存中,以便快速查找和访问。
  2. 倒排列表(Posting List)

    • 每个词在倒排索引中都有一个倒排列表,用于记录包含该词的所有文档的信息。倒排列表通常包含文档的 ID 或者其他标识符,并可能包含一些额外的信息,如词频(term frequency)等。
    • 倒排列表可以存储在磁盘上,因为它的访问频率通常比较低,而且可以通过缓存和索引优化来提高访问速度。

倒排索引的优势在于它可以快速定位到包含特定词的文档,从而加速全文搜索和检索过程。当用户输入一个查询词(query term)时,搜索引擎可以直接查找该词对应的倒排列表,并获取包含该词的所有文档信息,然后进行进一步的评分和排序操作。

在 Elasticsearch 中,倒排索引是核心的数据结构之一,它被用于存储和管理索引中的文档信息,从而实现高效的全文搜索和检索功能。通过倒排索引,Elasticsearch 能够快速定位到相关文档,提供高性能和准确度的搜索结果。