JAVA 面试准备

news2024/10/5 14:01:02

这里写自定义目录标题

  • 一、JAVA基础
    • 1.ArrayList
    • 2.HashMap
    • 3.Concurrenthashmap
    • 4.Stream
    • 5.synchronized
    • 6.线程池
    • 7.CompletableFuture
    • 8.Fork/join
    • 9.数组与链表的区别
    • 10.单例模式
        • 1.饿汉模式
        • 2.懒汉模式
        • 10.1、 为啥使用synchronized?
        • 10.2、 又为啥使用volatile?
        • 10.3、 那又又为啥用两个if (lazyMan == null)
    • 11.单例模式中,双重检查锁是干什么用的
    • 12.volatile [`禁止指令重排`]
    • 13.接口和类的区别
    • 14.项目中反射是如何应用的
    • 15.为什么重写hashcode一定要重写equals?
  • 二、Redis
      • 1、Redis 的回收策略(淘汰策略)?
      • 2、Redis 过期键的删除策略?
      • 3、Redis 的持久化机制是什么?各自的优缺点?
      • 4、说说 Redis 哈希槽的概念?
      • 5、Redis 集群的主从复制模型是怎样的?
      • 6、Redis 集群会有写操作丢失吗?为什么?
      • 7、Redis 集群之间是如何复制的?
      • 8、Redis 集群最大节点个数是多少?
      • 9、Redis 集群如何选择数据库?
      • 10、 Redis击穿、穿透、雪崩
  • 三,RabbitMQ 【消息队列】
    • 2. 如何确保消息正确地发送至RabbitMQ?如何确保消息接收方消费了消息?
    • 3、如何避免消息重复投递或重复消费?
    • 4、消息基于什么传输?
    • 5、消息怎么路由?
    • 6、如何确保消息不丢失?
    • 7、死信队列
    • 8、消息优先级【VIP插队】
    • 9、顺序消费
            • 保证循序消费的方案【URL跳转】
  • 四、MYSQL
      • 1.SQL执行流程
      • 2.索引
            • 索引的优点
            • 索引的缺点
            • 应该创建索引的列
            • 不该创建索引的列
      • 3.深分页处理方案
      • 4.redo log、binlog、innodb log
      • 5.慢日志
      • 6.sql语句优化
      • 7. show profile
      • 8.explain
      • 9.information_schema
      • 10.两阶段提交
      • 11.B-True
      • 12.B+True
  • 五、MyBatils
        • 1.`#{}`和`${}`的区别是什么?
        • 2.Mybatis的`一级`、`二级`缓存
  • 六、Spring
    • 1. AOP
    • 2.IOC
    • 3.双亲委派
    • 4.MVC执行流程
    • 5. 如何把服务交给Spring管理
  • 七、SpringCloud Albaba
  • 组件
    • 组件
    • Nacos 服务发现、配置管理和服务管理平台
        • 1.多人本地开发,如何共同使用测试环境的同一个Nacos进行调试?
        • 2.Config 配置信息更改,代码中是如何感知到的?
        • 3.Config 配置文件存储在哪里?
        • 4.服务的注册发现是如何实现的?
    • Getway 网关
        • 1.如何使用灰度发布
        • 2.白名单
        • 2.路径跳转
    • Sentinel 分布式服务架构的实时流量控制、熔断降级和系统负载
    • Seata 分布式事务
    • Admin 监控服务
    • SkyWalking 链路追踪
    • RocketMQ 消息队里
    • 微服务架构图
    • 八丶微服务面试题
          • 1.微服务中A服务调用B服务如何传递Token?
          • 2.微服务 如何把A服务提供为工具,然后引入到别的服务中,原理是什么?
    • 九丶Elasticsearch
        • 1.搜索字段的类型设计 field type【`text`、`keyword`】
        • 2. Elasticsearch 的打分机制
        • 2.4. 其他打分方法
        • 3. elasticsearch 的倒排索引是什么
        • 4. elasticsearch 是如何实现 master 选举的
        • 5. elasticsearch 分片,备份的设计
    • 十丶JVM
        • 1 jstack
        • 2 Arthas(Java 应用诊断利器)

一、JAVA基础

1.ArrayList

2.HashMap

3.Concurrenthashmap

4.Stream

5.synchronized

6.线程池

7.CompletableFuture

8.Fork/join

9.数组与链表的区别

10.单例模式

1.饿汉模式

顾名思义,很饿,没见过吃的,一开始就要吃。其实就在在启动的时候就创建对象,这种方式比较的消耗内存,不太推荐在内存消耗较大的对象上面使用,好处是一开始就创建对象,没有多线程下的安全问题

public class Hungry {
   //私有构造方法,防止自行实例化对象
   private Hungry() {
   }
   
   //静态属性,在一开始就创建是实例对象
   private final static Hungry HUNGRY = new Hungry();

   //通过这个方法拿是实例对象
   public static Hungry getInstance() {
       return HUNGRY;
   }

}

2.懒汉模式

顾名思义,很懒,不火烧眉毛不动手。这种模式只会在你使用对象的时候才创建对象,这种方式避免一开始就使用过多的内存,推荐在内存消耗较大的对象上面使用。

public class LazyMan {
   //volatile->禁止指令重排,避免创建实例对象时重排指令空指针异常
   private volatile static LazyMan lazyMan;

   // 双重检测锁模式的 懒汉式单例  DCL懒汉式(double check lock)
   public static LazyMan getInstance() {
       if (lazyMan == null) {
           synchronized (LazyMan.class) {//对LazyMan上锁,同一时间只能有一个线程能够进入创建对象
               if (lazyMan == null) {
                   lazyMan = new LazyMan(); // 不是一个原子性操作
               }
           }
       }
       return lazyMan;
   }

10.1、 为啥使用synchronized?

答:在多个线程进入getInstance()方法时,如果不加入synchronized锁住LazyMan.class,可能会有对个线程成功实例化对象,这就会违背单例模式的初衷,当加上以后,因为锁住的是class,所以只会有一个线程能够拿到锁来实例化对象,保证单例.

10.2、 又为啥使用volatile?

答:如果看过编译原理,其实里面有一个对编译器的介绍中,编译器会根据需要将代码的执行顺序进行优化,类比这里,我们在实例化一个对象的时候,可能是这样的顺序:为1.lazyMan分配内存空间->2.初始化lazyMan->3.为lazyMan指向第一步中分配的内存空间。但是在编译器的好心下,我们的执行顺序变成了1->3->2,那么这就出现问题了,我们的其他的线程拿对象会到哪里去拿?回到第一步分配的内存空间去拿!假如现在实例对象的线程正好按着1->3->2的顺序刚刚执行完了3,我们另一个线程过来了,因为2还没有执行,内存地址对应的内存空间中还没有东西,那么我们拿的就是个空,但是这个时候这个地址确实是被分配了的。这个时候就会出现空指针异常,也就是因为实例化对象的时候不满足原子性。

10.3、 那又又为啥用两个if (lazyMan == null)

答:好问题!第一个外层的好解释,在我们成功实例化对象之后,我们还需要进入加锁的哪一步吗?其实是不需要的,我们就可以直接返回对象去用就好了。那么第二个内层的又是用来干嘛的?在我们未创建实例对象的时候,我们假设有一千个线程来创建这个实例对象,我们一号线程拿到了锁,二号线程撞到了门上,没拿到锁,于是它在门口等,此时注意二号线程已经经过了第一个if (lazyMan == null),然后线程一执行完了实例,然后返回了这个实例对象LazyMan2@7f1d78ac,这个时候线程二啪的一下拿到了线程一扔下的锁,很快啊!然后又因为没有第二层的if (lazyMan == null),他又实例化了一个对象LazyMan2@688ee48d,然后线程二开心的返回了。此时我们的实例对象已经是线程二的LazyMan2@688ee48d,这个时候第三个线程来了,它在第一层的if (lazyMan == null)被告知对象已经实例化了,拿走去用吧,后来的都是像线程三一样被安排的明明白白。从此以后就只有一个对象LazyMan2@688ee48d,但是这个是正常的吗。我们也违反了单例模式的原则。所以需要加上第二层的if (lazyMan == null)。

11.单例模式中,双重检查锁是干什么用的

二次判空原因
第一次判断是为了验证是否创建对象,判断为了避免不必要的同步
第二次判断是为了避免重复创建单例,因为可能会存在多个线程通过了第一次判断在等待锁,来创建新的实例对象。
判断是为了在null的情况下创建实例代码会检查两次单例类是否有已存在的实例,一次加锁一次不加锁,一次确保不会有多个实例被创建。
单例模式中用volatile和synchronized来满足双重检查锁机制

12.volatile [禁止指令重排]

读volatile:每当子线程某一语句要用到volatile变量时,都会从主线程重新拷贝一份,这样就保证子线程的会跟主线程的一致。
写volatile: 每当子线程某一语句要写volatile变量时,都会在读完后同步到主线程去,这样就保证主线程的变量及时更新。

13.接口和类的区别

14.项目中反射是如何应用的

15.为什么重写hashcode一定要重写equals?


二、Redis

数据类型

数据类型数据结构
String字符串: key,value
List快速列表 quicklist【 双向列表+ziplist(压缩列表)】
Hashziplist(压缩列表)+ hashtable
Setintse【存储纯数字的情况下才会用到】,hashtable
ZSet有序集合:底层也是 Set 集合,只不过对于每个 value添加score,为了便于 Redis 对集合内元素排序, 【ziplist(压缩列表)+ skiplist【跳跃表】】
Geo地理空间
HyperLogLog基数统计: 是去重复统计功能的基数估计算法
bitmap位图:是由 0 和 1 状态表现的二进制位的 bit 数组
bitfield位域
Stream

1、Redis 的回收策略(淘汰策略)?

  1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  6. no-enviction(驱逐):禁止驱逐数据

2、Redis 过期键的删除策略?

  • 定时删除:在设置键的过期时间的同时,创建一个定时器 timer。让定时器在键的过期时间来临时,立即执行对键的删除操作。
  • 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
  • 定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。

3、Redis 的持久化机制是什么?各自的优缺点?

RDB(Redis DataBase)持久化方式:是指用数据集快照的方式半持久化模式记录 Redis 数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。

优点

只有一个文件 dump.rdb,方便持久化。
容灾性好,一个文件可以保存到安全的磁盘。
性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。
使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 Redis的高性能。相对于数据集大时,比 AOF 的启动效率更高。

缺点

数据安全性低。
RDB 是间隔一段时间进行持久化,如果持久化之间 Redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候

AOF(Append-only file)持久化方式:是指所有的命令行记录以 Redis 命令请求协议的格式完全持久化存储保存为 aof 文件。

优点

数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次命令操作就记录到 aof 文件中一次。
通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall)

缺点

AOF 文件比 RDB 文件大,且恢复速度慢。
数据集大的时候,比 RDB 启动效率低。、

4、说说 Redis 哈希槽的概念?

Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。

5、Redis 集群的主从复制模型是怎样的?

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有 N-1 个复制品。

6、Redis 集群会有写操作丢失吗?为什么?

Redis 并不能保证数据的强一致性,这意味着在实际中集群在特定的条件下可能会丢失写操作。

7、Redis 集群之间是如何复制的?

异步复制。

8、Redis 集群最大节点个数是多少?

16384 个。

9、Redis 集群如何选择数据库?

Redis 集群目前无法做数据库选择,默认在 0 数据库。

10、 Redis击穿、穿透、雪崩

  • 缓存穿透

     缓存穿透:指在redis缓存中不存在数据,这个时候只能去访问持久层数据库,当用户很多时,缓存都没有命中就会照成很大压力
     解决方案 :
     (1)布隆过滤器(对可能查询的数据先用hash存储)
     (2)缓存空对象:在没有的数据中存一个空,而这些空的对象会设置一个有效期)
    
  • 缓存击穿

      缓存击穿:指在同一个时间内访问一个请求的请求数过多,而在这个时候缓存某个key失效了,这个时候就会冲向数据库照成缓存击穿
      解决方案:
      (1)设置缓存永远不过期
      (2)加互斥锁,使用分布式锁,保证每个key只有一个线程去查询后端服务,而其他线程为等待状态。这种模式将压力转到了分布式锁上
    
  • 缓存雪崩

    缓存雪崩:在某个时间段,缓存集体过期、redis宕机
    解决方案:给key的失效时间设置为随机时间,避免集体过期;双缓存;加互斥锁

Redis


三,RabbitMQ 【消息队列】

1. 为什么要使用rabbitmq

  1. 异步处理 - 相比于传统的串行、并行方式,提高了系统吞吐量。

  2. 应用解耦 - 系统间通过消息通信,不用关心其他系统的处理。

  3. 流量削锋 - 可以通过消息队列长度控制请求量;可以缓解短时间内的高并发请求。

  4. 消息通讯 - 消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。

2. 如何确保消息正确地发送至RabbitMQ?如何确保消息接收方消费了消息?

2.1 发送方确认模式

  1. 将信道设置成confirm模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的ID。
  2. 一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一 ID)。
  3. 如果 RabbitMQ发生内部错误从而导致消息丢失,会发送一条nack(notacknowledged,未确认)消息。发送方确认模式是异步的,生产者应用程序在等待确认的同时,可以继续发送消息。当确认消息到达生产者应用程序,生产者应用程序的回调方法就会被触发来处理确认消息。

2.2,接收方确认机制

  • 2.3,接收方消息确认机制

     消费者接收每一条消息后都必须进行确认(消息接收和消息确认是两个不同操作)。
     只有消费者确认了消息,RabbitMQ才能安全地把消息从队列中删除。
     这里并没有用到超时机制,RabbitMQ仅通过Consumer的连接中断来确认是否需要重新发送消息。
     也就是说,只要连接不中断,RabbitMQ给了Consumer足够长的时间来处理消息。保证数据的最终一致性;
    

下面罗列几种特殊情况

如果消费者接收到消息,在确认之前断开了连接或取消订阅,RabbitMQ会认为消息没有被分发,然后重新分发给下一个订阅的消费者。

(可能存在消息重复消费的隐患,需要去重)如果消费者接收到消息却没有确认消息,连接也未断开,则RabbitMQ认为该消费者繁忙,
将不会给该消费者分发更多的消息。

3、如何避免消息重复投递或重复消费?

在消息生产时,MQ内部针对每条生产者发送的消息生成一个inner-msg-id,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列;

在消息消费时,要求消息体中必须要有一个 bizId(对于同一业务全局唯一,如支付ID、订单ID、帖子ID 等)作为去重的依据,避免同一条消息被重复消费。

4、消息基于什么传输?

由于TCP连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶颈。RabbitMQ使用信道的方式来传输数据。
信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制

5、消息怎么路由?

消息提供方->路由->一至多个队列

消息发布到交换器时,消息将拥有一个路由键(routing key),在消息创建时设定。

通过队列路由键,可以把队列绑定到交换器上。

消息到达交换器后,RabbitMQ 会将消息的路由键与队列的路由键进行匹配(针对不同的交换器有不同的路由规则);

常用的交换器主要分为一下三种

  • fanout:如果交换器收到消息,将会广播到所有绑定的队列上

  • direct:如果路由键完全匹配,消息就被投递到相应的队列

  • topic:可以使来自不同源头的消息能够到达同一个队列。 使用topic交换器时,可以使用通配符

6、如何确保消息不丢失?

消息持久化,当然前提是队列必须持久化

RabbitMQ确保持久性消息能从服务器重启中恢复的方式是,将它们写入磁盘上的一个持久化日志文件,当发布一条持久性消息到持久交换器上时,Rabbit会在消息提交到日志文件后才发送响应。

一旦消费者从持久队列中消费了一条持久化消息,RabbitMQ会在持久化日志中把这条消息标记为等待垃圾收集。如果持久化消息在被消费之前RabbitMQ重启,那么Rabbit会自动重建交换器和队列(以及绑定),并重新发布持久化日志文件中的消息到合适的队列。

7、死信队列

8、消息优先级【VIP插队】

  • rabbitmq 创建消息队列的时候 x-max-priority 属性 可配置

    1.优先级属性是 byte类型的,所以它的取值范围:[0,255];
    2.消息优先级为0或不设优先级的效果一样;
    3.消息优先级大于设定的优先级最大值时,效果同优先级的最大值(我们可以自行实验);
    

    rabbitmq
    消息消费结果

9、顺序消费

保证循序消费的方案【URL跳转】

四、MYSQL

在这里插入图片描述

  • 12.B+True

      所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
      不可能在非叶子结点命中;
      非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
      每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历。
      更适合文件索引系统;
    

在这里插入图片描述


五、MyBatils

1.#{}${}的区别是什么?

${}是字符串替换,#{}是预处理;

Mybatis在处理${}时,就是把${}直接替换成变量的值。
而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;

使用#{}可以有效的防止SQL注入,提高系统安全性。

2.Mybatis的一级二级缓存

1)一级缓存: 基于 PerpetualCacheHashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。

(2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCacheHashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;

(3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear 掉并重新更新,如果开启了二级缓存,则只根据配置判断是否刷新。

六、Spring

可以参考

1. AOP

2.IOC

3.双亲委派


4.MVC执行流程


5. 如何把服务交给Spring管理


七、SpringCloud Albaba

简介
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

主要功能

  • 服务限流降级 :默认支持 WebServlet、WebFlux, OpenFeign、RestTemplate、Spring Cloud Gateway, Zuul, Dubbo 和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。
  • 服务注册与发现 :适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。
  • 分布式配置管理 :支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力 :基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 分布式事务 :使用 @GlobalTransactional 注解, 高效并且对业务零侵入地解决分布式事务问题。
  • 阿里云对象存储 :阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
  • 分布式任务调度 :提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有 Worker(schedulerx-client)上执行。
  • 阿里云短信服务 :覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

组件

  • [Sentinel] :阿里巴巴源产品,把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

  • [Nacos] :一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  • [RocketMQ] :一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

  • [Dubbo] :Apache Dubbo™ 是一款高性能 Java RPC 框架。

  • [Seata] :阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

  • [Alibaba Cloud OSS] : 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

  • [Alibaba Cloud SchedulerX]: 阿里中间件团队开发的一款分布式任务调度产品,提供秒级、精准、高可靠、高可用的定时(基于 Cron 表达式)任务调度服务。

  • [Alibaba Cloud SMS] : 覆盖全球的短信服务,友好、高效、智能的互联化通讯能力,帮助企业迅速搭建客户触达通道。

组件

Nacos 服务发现、配置管理和服务管理平台

1.多人本地开发,如何共同使用测试环境的同一个Nacos进行调试?

2.Config 配置信息更改,代码中是如何感知到的?

3.Config 配置文件存储在哪里?

4.服务的注册发现是如何实现的?

Getway 网关

1.如何使用灰度发布

2.白名单

2.路径跳转

Sentinel 分布式服务架构的实时流量控制、熔断降级和系统负载

Seata 分布式事务

Admin 监控服务

SkyWalking 链路追踪

RocketMQ 消息队里

微服务架构图

八丶微服务面试题


九丶Elasticsearch

【参考】

1.搜索字段的类型设计 field type【textkeyword

text用于全文搜索,支持分词,
keyword则用于精确搜索,不分词。

2. Elasticsearch 的打分机制

2.1、TF-IDF 逆文档频率,TF term frequency 词频IDF inverse document frequency 逆文档频率
在这里插入图片描述
第一个句子提到 Elasticsearch 一次 ,而第二个句子提到 Elasticsearch 两次,所以包含第二句话的文档应该比包含第一句话的文档拥有更高的得分。按照数量来讨论,第一句话的

    **词频( TF )是 1,而第二句话的词频将是 2。**

2.2、如果一个分词在索引的不同文档中出现越多的次数,那么它就越不重要。逆文档频率是一个重要的因素,用于平衡词条的词频。
在这里插入图片描述

词条 Elasticsearch的文档频率是 2 (3篇中2篇出现),文档频率的逆源自得分乘以 1/DF,这里 DF是该词条的文档频率。
词条拥有更高的文档频率, 它的权重就会降低。
词条 the 的文档频率是 3 (3篇中都出现),尽管the在最后一篇文档中出现了两次,它的文档频率还是3。
因为逆文档频率只检查一个词条是否出现在某文档中,而不检查它出现多少次。

2.3、 Lucene评分公式

   	词条的词频越高,得分越高
	索引中词条越罕见,逆文档频率越高![在这里插入图片描述](https://img-blog.csdnimg.cn/0bf6e680f8834a798b2b71d75422e542.png)   

2.4. 其他打分方法

1.Okapi BM25
2.随机性分歧 (Divergence from randomness),即 DFR 相似度
3.基于信息的 (Information based), 即lB相似度
4.LM Dirichlet相似度
5.LM Jelinek Mercer相似度

3. elasticsearch 的倒排索引是什么

4. elasticsearch 是如何实现 master 选举的

5. elasticsearch 分片,备份的设计


3.我是文本 粉红

十丶JVM

1 jstack

2 Arthas(Java 应用诊断利器)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL进阶(一)】MySQL在Linux中的配置信息和数据备份工具

MySQL在Linux中安装的话可以看这篇博客:MySQL在Linux中的安装,我觉得总结的很好。 my.cnf 中的配置信息 当 MySQL 启动的时候,会从安装目录中加载软件数据,即使用 mysqld 工具初始化设置的 --basedir,会从数据目录中…

GaussDB云数据库配套工具UGO

目录 一、前言 二、数据库和应用迁移UGO定义 1、UGO定义 2、异构数据库迁移简图 三、数据库迁移的痛点 四、数据库和应用迁移UGO能力介绍 五、数据库和应用迁移UGO方案简图介绍 六、小结 一、前言 在数字化时代,企业面临着越来越多的数据库和应用迁移需求。…

SpringBoot解决跨域问题的几种方式

本文参考自:SpringBoot 解决跨域问题的 5 种方案!_springboot跨域问题解决方案_肥肥技术宅的博客-CSDN博客 SpringBoot解决ajax跨域问题-腾讯云开发者社区-腾讯云 跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷…

认识C++继承

认识继承 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由…

Protobuf数据交互实战

"no one gonna make me down" 在之前呢,我们介绍了什么protobuf以及它的语法、数据类型。 一句老话说得好,"多说不练,假把式!"。因此,本篇会选择以protobuf的语法,完成一个简易的通讯…

uniapp 微信小程序 自定义弹框+picker下拉选择列表+输入表单:拒绝-选择理由弹窗

效果&#xff1a; 1、template <!-- 拒绝-选择理由弹窗--> <view class"reason-popover" v-if"showReasonDialog"><view class"reason-modal"><view class"reason-title"><text>请选择拒绝理由<…

文心一言 VS 讯飞星火 VS chatgpt (64)-- 算法导论6.5 3题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;64&#xff09;-- 算法导论6.5 3题 三、要求用最小堆实现最小优先队列&#xff0c;请写出 HEAP-MINIMUM、HEAP-EXTRACT-MIN、HEAP DECREASE-KEY 和 MIN-HEAP-INSERT 的伪代码。 文心一言&#xff1a; 以下是使用最小堆实现最小…

界面控件DevExpress WPF数据编辑器组件,让数据处理更灵活!(二)

界面控件DevExpress WPF编辑器库可以帮助用户提供直观的用户体验&#xff0c;具有无与伦比的运行时选项和灵活性。WPF数据编辑器提供了全面的掩码和数据验证支持&#xff0c;可以独立使用&#xff0c;也可以作为容器控件(如DevExpress WPF Grid和WPF TreeList)中的单元格编辑器…

ubantu 安装 sudo apt install ubuntu-restricted-extras. 如何 OK

在安装的时候&#xff0c;不知道如何 Ok 使用 回车键&#xff0c;空格键 均不行&#xff0c;使用 Tab 键 &#xff0c;然后再使用 回车键。 Configuring ttf-mscorefonts-installer 答案是使用 Tab 键。

【Python】pyecharts 模块 ③ ( 使用 pyecharts 模块绘制折线图 )

文章目录 一、使用 pyecharts 模块绘制折线图1、折线图绘制过程2、完整代码示例 pyecharts 画廊网站 : https://gallery.pyecharts.org/#/ 在该网站可查看官方示例 一、使用 pyecharts 模块绘制折线图 1、折线图绘制过程 首先 , 导入 折线图 Line 对象 , 该类定义在 pyecharts…

Go http.Get不需要defer res.Body.Close()

前戏&#xff1a; go net/http包&#xff0c;必须要手动关闭嘛&#xff1f;非也。线上程序为啥协程数量直线上升&#xff0c;因为使用的姿势不对&#xff0c;请换个姿势。 干货&#xff1a; 手动关闭&#xff0c;释放资源 defer res.Body.Close() &#xff08;这是一个好习…

LeetCode[剑指Offer51]数组中的逆序对

难度&#xff1a;Hard 题目&#xff1a; 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制&#xff1a; 0 < 数组…

C++【STL】queue和deque 容器详解

C【STL】queue和deque 容器详解 一级目录 二级目录 三级目录 1. 什么是queue容器&#xff1f; Queue是一种先讲先出( First In First Out,FIFO )的数据结构&#xff0c;它有两个出口。 queue模版类的定义在头文件中。 include 定义queue对象的示例代码如下∶ queue<i…

【华为c# OD机考参考答案】01---IPv4地址转换成整数

题目 1、题目 01---IPv4地址转换成整数2、解图思路 1、IP地址转为二进制 2、二进制转十进制 3、注意事项 1、IP地址的范围判断 2、空字符串判断 3、非法字符判断 4、考点 1、string的split 、convert等相关用法 2、正则表达式 3、进制转换 4、理解32位整数的意思 5、代码 判…

2023华为OD统一考试(B卷)题库清单(持续收录中)以及考点说明

目录 专栏导读2023 B卷 “新加题”&#xff08;100分值&#xff09;2023Q2 100分2023Q2 200分2023Q1 100分2023Q1 200分2022Q4 100分2022Q4 200分牛客练习题 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…

【实用工具】-Git+GitLab

1. Git介绍 1.1 什么是Git&#xff1f; Git是一个分布式版本控制系统&#xff0c;用于跟踪和管理项目代码的变化。它是由Linus Torvalds于2005年创建的&#xff0c;旨在帮助开发者更好地协作、追踪代码的更改&#xff0c;并轻松地回滚到之前的版本。 Git相比传统的集中式版本…

网络安全 Day17-计算机网络知识02

计算机网络知识02 1. 交换机2. 网络知识名词3. ARP3.1 ARP通讯原理3.2 arp欺骗3.3 ARP欺骗与预防3.4 排查ARP病毒 4. 路由器 1. 交换机 什么是交换机 实现一个网络内多台主机之间通讯的设备用于电信号转发和放大的网络设备 常见的交换机&#xff1a;以太网交换机&#xff0c;电…

【Java】SpringBoot下写一个全局捕获异常的怎么实现?

文章目录 前言一、全局异常处理方式一1.1 自定义全局异常类1.2 手动抛出异常1.3 测试打印 二、全局异常处理方式二2.1 定义基础接口类2.2 定义枚举类2.3 自定义异常类2.4 自定义数据传输2.5 自定义全局异常处理2.6 测试代码 总结 前言 在日常项目开发中&#xff0c;异常是常见…

Nginx 用户指南:安装、配置和基本使用

前言 本用户指南将帮助您了解如何安装、配置和基本使用 Nginx。Nginx 是一款高性能的开源 Web 服务器和反向代理服务器&#xff0c;具有强大的性能和灵活性&#xff0c;可以满足各种 Web 服务器需求。 安装 Nginx a. 在 Ubuntu 上安装&#xff1a; $ sudo apt update $ sud…

(转载)神经网络遗传算法函数极值寻优(matlab实现)

本博客的完整代码获取&#xff1a; https://www.mathworks.com/academia/books/book106283.html 1案例背景 对于未知的非线性函数,仅通过函数的输入输出数据难以准确寻找函数极值。这类问题可以通过神经网络结合遗传算法求解,利用神经网络的非线性拟合能力和遗传算法的非线性…