使用 dmesg 来查看一些硬件或驱动程序的信息或问题。

几个比较复杂的ES相关问题

Elasticsearch | 作者 Charele | 发布于2023年09月01日 | 阅读数:2011

以下都是些乱78糟,我比较困惑的,没有解决的疑惑。
 
 问题1:
ES代码虽然多,但相对来说,比Lucene简单得多。
如果ES代码理解难度如果一颗星,个人感觉Lucene就是4颗星。
 
问题:删除一个快照,它的流程是怎么样的?
它是如何一步一步的调整元数据,直至成功删除掉一个快照的?
 
起点在TransportDeleteSnapshotAction,
我看来看去,总觉得chaos,理不清里面的头绪,
 
 图片与主题无关:
2222.jpeg
已邀请:

Charele - Cisco4321

赞同来自:

111.PNG

问题2:
InternalEngine这个类,看过ES代码的,肯定了解了。
这里,它在构造时,会判断如果 x < y,
就会去恢复些东西(恢复啥,不是关注点),
其中的x就是上次持久化的本地检查点 y就是我们经常看见的maxSeqNo,
 
这是InternalEngine构造方法(就是说,会在分片打开时执行),
打开分片,无外乎两种情况:
 
A 新建分片的打开,这时x == y == -1,肯定不会发生 x < y
B 老分片的打开(比如ES重启时)
这时x,y这两个值是从磁盘中读出来的
 
  但在什么场景下发生x < y呢?
我想不出来,也测试不出来.我看到的都是x == y

Charele - Cisco4321

赞同来自:

问题3:
 
和自动机有关。ES中,很多查询类型都是“自动机查询”,
比如前缀查询,模糊查询等等,
(短语查询不是,开始我以为也是,但它不涉及自动机)
 
大佬博客里有介绍,
https://www.amazingkoala.com.c ... .html
 
额外说一句,他这里个人感觉不好的地方。
像我们初学者,认知过程一般都从易到难,
而他只讲了range查询,不是最复杂的,但不是最简单的。 
最简单是前缀查询,他应该用前缀查询来举例子,这样会比较好一些。
 
自动机分为确定型跟不确定型,
在Lucene里处理的都是确定型的。
 
如果是“不确定”的,它会转成"确定”的
111.PNG

 
问题:什么情况下,它会产生(临时的)不确定的自动机?
我没找到
 
至于这个方法用啥手段把不确定变为确定,
也许只有自己看了才能体会

Charele - Cisco4321

赞同来自:

问题4:
Knn相关的问题
 
开始以为就是每个数据跟目标算下距离,找到最小的。
后来发现,并不是这样的。
 
他用了叫HNSW的东东来查找
(这个东东很庞大,比数据本身大多了,存在vex索引文件里)
我在B站截了个图,大概就是这样子的:
111.png

HNSW里的H就是层次化的意思,它这个层级,是如何形成的。
 
 比如我有100万个数据,它会分几层,查找是从哪个开始的?
又比如100万3维向量,和100万个200维向量,层数是不是一样?
222.PNG

这就是分层的秘密所在,名字叫getRandomGraphLevel,
 
昨一看有些糊涂,它就是产生一个随机数,随机产生新层?
 
实际上不是,它的结果是固定的。
比如你有200个向量数据,编号是: 0, 1, 2, 3, 4,5,,,198,199。
 
首先,所有数据都会放入level0(就是最底层)
 当你输入4号数据时,就会建level1
到输入171号数据时,就会建level2,
 
 这些数据量,会建3层结构。 
而这171号数据,就是图中那个“查询入口”(源代码中称为EntryNode) 
 
 问题:这个简单的方法,是产生新层号的原理是什么呢???

要回复问题请先登录注册