【发布时间】:2023-03-31 22:32:02
【问题描述】:
假设您使用的是 Chrome,当我按 Cmd+F 或 Ctrl + F... 我输入一个字符时,它会搜索整个页面并为我突出显示文本。它立即搜索。 Chrome 使用什么样的算法?为什么它可以输入和搜索这么快?有什么想法吗?谢谢。
【问题讨论】:
标签: search google-chrome full-text-search
假设您使用的是 Chrome,当我按 Cmd+F 或 Ctrl + F... 我输入一个字符时,它会搜索整个页面并为我突出显示文本。它立即搜索。 Chrome 使用什么样的算法?为什么它可以输入和搜索这么快?有什么想法吗?谢谢。
【问题讨论】:
标签: search google-chrome full-text-search
您可以在此处找到有关架构的更多信息: http://www.chromium.org/developers/design-documents/find-bar
我将尝试解释更详细的回复,以帮助您在下次需要更多内容时浏览 Chromium 源代码。
当用户在 Chromium 中发起查找时,我们基本上会向观察者注册一个通知以获取结果。每个 find 调用都是异步的,搜索结果由渲染器作为通知消息发送。这是在FindBarController::Observe处理的
当您按下下一个/上一个/输入时,发生的第一件事是FindBarView::ButtonPressed,它告诉当前标签内容开始查找TabContents::StartFinding。您会注意到,在那段代码中,它向 IPC 发送了一个异步请求。您可以在此处查看我们的发送方式:RendererViewHost::StartFinding
由于 Chromium 是 multi-process architecture,我们通过 IPC 消息处理程序发送消息。您可以查看上面的链接以了解消息是如何发送的。渲染主机向渲染视图发送消息RenderView::OnFind。从那时起,您就知道查找逻辑显然在 WebKit 源代码中,而不是在 Chromium 中。 WebFrameImpl::find
现在在 WebKit 领域,它找到字符串的逻辑在 Editor::findString 中,如果你注意到算法是什么,基本上使用 WebKit/WebCore/editing/TextIterator.h 在给定范围内遍历 DOM 相比之下,WebKit 中的 cmets 并不是那么好到 Chromium,但代码的质量非常高,所以你可以毫无问题地阅读 3000+ loc。
我之所以告诉你这一切是为了你的利益,所以如果你想了解更多关于 Chromium/WebKit 的知识,你知道如何查看源代码 :) 我强烈推荐http://dev.chromium.org/developers
【讨论】:
纯猜测,但很可能它将页面标记为单词(及其相关范围),然后将这些单词放入 Radix Tree 或 Trie 并在树中进行前缀搜索。
【讨论】:
你为什么不看看 chrome 的源代码,看看他们为自己做了什么?
【讨论】: