【技术性】Search知识

持续更新。FB search框架Php写的Browse layer,负责同client对话以及param处理和passing等。C++写的backend,最大的一坨叫做TopAggregator,主要负责三件事 a)rewrite query to get better search results (e.g. force retrieval); b)和每个vertical的RackAggregator对话,比如posts,web,people等,从这些分支收集response; c)对response做twiddling,所以有一堆twiddlers比如web twiddler每个RackAggregator做的事主要就是和index对话,从各个shards拿结果。Forward index和Reverse indexf index主要是给id找doc,r index主要是给出terms找doc(id)

February 18, 2019 · 1 min · jiezi

一些在Emacs中搜索文本的方法

在Emacs中写代码的时候,常常需要查找一个函数、方法,或者变量的定义。如果是正在写Common Lisp,那么SLIME已经配置好了相应的快捷键M-.,只需要将光标移动到要查看的函数、方法,或者变量的名字上,按下M-.便可以跳转过去——再按一下M-,还能回到原来的位置。如果是写其它语言的代码,很多时候都没办法方便地跳转过去,这时候就需要依赖于文本搜索了,这也是本篇所要讲述的主题。通常情况下,用C-s和C-r就足够了——一个负责“往下”搜索一个负责“往上”搜索。尤其在安装了Emacs的插件swiper之后,只需使用C-s便可以同时查看到上下两个方向的匹配文本。但C-s也有其局限性。例如,它不能跨文件搜索,如果要查看的函数、方法,或者变量的定义不在当前buffer中,就不得不手动在多个buffer间切换并频繁按下C-s了。有多种办法可以解决上面这种问题。例如,可以用Emacs的projectile-ag。通常,如果代码散布在多个源文件中,那么它们多半是放在一个项目中——比如一个Git仓库。打开位于项目中的文件时,Emacs的projectile-mode就会启动。此时,按下C-c C-p s s这套组合键,会调用projectile-ag函数。projectile-ag会在minibuffer中等候输入要搜索的内容,按下回车后,Emacs会调用命令行工具ag来搜索这个项目下的所有文件,找出匹配关键字的行并显示。projectile-ag函数会打开另一个buffer来展示搜索结果,一个示例如下ag –literal –group –line-number –column –color –color-match 30;43 –color-path 1;32 –smart-case –stats – emacs .0 matches0 files contained matches36 files searched111365 bytes searched0.007795 seconds使用projectile-ag的前提是要搜索的文件都在同一个一个项目中,但并非所有时候都满足这个要求。这时,可以用Emacs的find-grep函数。find-grep函数调起后同样要求使用者在minibuffer输入内容,但它更原始一点光标会定位在-e选项之后,需要填补交给grep的正则表达式。由于minibuffer中给出的是完整的、将会被运行的命令,因此可以也给find命令添加一些选项和参数,来改变搜索行为。如果是在一个Node.js项目中搜索,一般还要让find忽略一些文件,如node_modules目录下的大量依赖,或者构建产生出来的.css和.js文件。这些文件中的行不仅很可能会命中输入的正则表达式,还极可能成片地出现,占据搜索结果中的半壁江山。除了grep之外,还有许多命令行的文本搜索工具,例如ack和rg,并且它们都称自己更快。要在Emacs中使用它们也很简单,尤其是后者还有相应的插件rg.el可以方便调起。如果经常要控制find来忽略node_modules,可以考虑用git-grep。man git-grep中说到,它只会搜索tracked的文件node_modules一般都不会被git跟踪,自然也就不会被搜索。全文完

January 11, 2019 · 1 min · jiezi