Skip to content

{ Category Archives } 工作日志

LinkedIn Voldemort 简单介绍

LinkedIn 发布了一个 key-value 存储(发布?)系统 Voldemort,详细介绍在 http://project-voldemort.com/blog/2009/06/building-a-1-tb-data-cycle-at-linkedin-with-hadoop-and-project-voldemort/ 抽空看了一下,写了个 ppt 简单介绍: Voldemort Intro Tangfl View more OpenOffice presentations from Fulin Tang.

加速 lucene 索引建立速度 ImproveIndexingSpeed

本文 只是简单的翻译,原文 在 http://wiki.apache.org/lucene-java/ImproveIndexingSpeed * Be sure you really need to speed things up. Many of the ideas here are simple to try, but others will necessarily add some complexity to your application. So be sure your indexing speed is indeed too slow and the slowness is indeed within Lucene. * 请确认你真的需要更快的索引速度 这里的很多想法都非常容易尝试,但也有一些会给你的程序带来额外的复杂度。所以请确认你的搜索速度真的慢到不能忍受,并且慢的原因的确是因为lucene。 *Make sure [...]

加速 lucene 的搜索速度 ImproveSearchingSpeed

本文 为简单翻译,原文在: http://wiki.apache.org/lucene-java/ImproveSearchingSpeed * Be sure you really need to speed things up. Many of the ideas here are simple to try, but others will necessarily add some complexity to your application. So be sure your searching speed is indeed too slow and the slowness is indeed within Lucene. * 请确认你真的需要更快的搜索速度 这里的很多想法都非常容易尝试,但也有一些会给你的程序带来额外的复杂度。所以请确认你的搜索速度真的慢到不能忍受,并且慢的原因的确是因为lucene。 *Make sure you [...]

基于 lucene 的站内搜索 - 阶段性成果介绍

imobile 站内搜索 —— 基于 lucene 的站内搜索,阶段性成果介绍 关键词:准实时搜索,及时更新,快速重建,可配置,可监控,高性能 实现:分离读写,分离索引和存储,拆分大小库,新索引 reopen,新索引预热 基于Lucene的站内搜索 View more Keynote presentations from Fulin Tang.

JAVA 实现 grep + tail 功能

在 linux shell 下经常使用的一个命令组合: grep [-v] “filter” filePath | tail -n needLines,用来查看文件中符合条件的最后 n 行记录,尤其在监控 server 的 log 的时候。 现在有一个需求:从 web 管理后台向 search server 发送一个 stat 命令,查看搜索索引的各项统计信息,其中就包括索引更新,查询的 log 的最后 n 条记录。于是需要在 search server 里实现这样一个功能。 PS:如果是 php,我肯定会选用 exec 一条外部 shell 命令,获取命令的输出 的方式来做,但 java,只好自己动手,重复发明轮子了。 PS2:stl 的 rotate 代码真是太精炼了。有空需要多看看这样的代码,能从中学到很多“ how code talks ” [code=java] /** * implenment: grep [-v] [...]

Lucene 索引删除测试

测试代码:http://code.google.com/p/fulin/source/browse/JAVA/lucene/imobile/search2/src/search/test/IndexTest.java 结论: 1。lucene 索引删除条目的时候(不 调用 optimize),会修改索引目录的以下文件:segments.gen, segments_N, ***.del 2。lucene 索引目录发生改变后,如果不 reopen index reader,则改变对于 searcher 来说是不可见的。(甚至可以将 idx 目录删除,searcher 仍然能返回结果。测试:idx 目录大小为 1.2G,删除目录后, searcher 搜索热门词仍然正常返回结果,返回结果条数超过4万条) 3。索引拆分大小库后,大库可以不用滚动,而是在同一个目录上进行 reopen ,以减少磁盘 IO 及搜索预热延迟

Lucene 索引滚动流程设计

Lucene 索引滚动流程设计 TangFulin <tangfulin@gmail.com> 一. Index Writer: 1. 这里的 Writer 包括 Index Updater 和 Index Rebuilder ,但 Rebuilder 产生的索引文件不直接传送给 Searcher 使用, 而是覆盖 Updater 的索引,由 Updater 统一处理后续的流程 2. IndexUpdaterScheduler 每隔一段时间会设置 copy out timer 标识。 3. Updater 每次处理完一批 xml 文件后会查看 copy out timer 标识是否已经被设置, 如果是,则将当前的索引拷贝一份到 src-snap 目录下 yyyyMMddHHmm 格式的子目录中 4. Updater 为单线程,每次处理完一批 xml 后都会调用 optimizeAndCloseIdx ,所以可以保证 idx [...]

强大的bash

假设我们定义了一个变量为: file=/dir1/dir2/dir3/my.file.txt 我们可以用 ${ } 分别替换获得不同的值: ${file#*/}:拿掉第一条 / 及其左边的字串:dir1/dir2/dir3/my.file.txt ${file##*/}:拿掉最后一条 / 及其左边的字串:my.file.txt ${file#*.}:拿掉第一个 . 及其左边的字串:file.txt ${file##*.}:拿掉最后一个 . 及其左边的字串:txt ${file%/*}:拿掉最后一条 / 及其右边的字串:/dir1/dir2/dir3 ${file%/*}:拿掉第一条 / 及其右边的字串:(空值) ${file%.*}:拿掉最后一个 . 及其右边的字串:/dir1/dir2/dir3/my.file ${file%%.*}:拿掉第一个 . 及其右边的字串:/dir1/dir2/dir3/my 记忆的方法为: # 是去掉左边(在键盘上 # 在 $ 之左边) % 是去掉右边(在键盘上 % 在 $ 之右边) 单一符号是最小匹配;两个符号是最大匹配。 还可以按下标取指定长度的子串: ${file:0:5}:提取最左边的 5 个字?:/dir1 ${file:5:5}:提取第 5 个字右边的连续 5 个字:/dir2 我们也可以对变量值里的字串作替换: ${file/dir/path}:将第一个 [...]

Rsync 的算法

RSync 算法是澳大利亚人 Andrew Tridgell (samba的作者)发明的,按照 Andrew Tridgell 自己的话,这个算法只需要半个小时就能够理解,但是花费了他几年时间才研究出来。 Rsync 算法大概原理:(目标:把 HostA 上的FileNew 同步到 HostB 上 FileOld) 1) Host-B把File-Old划分成不重合的大小为K字节的若干块,不足K字节的结尾部分加上Padding,然后对每一块求弱Hash和强Hash。弱Hash就是说很有可能两个不同的块Hash值相同,但是计算起来快,而且这里要求这个弱Hash能够Rolling,也就是说已知字节1到字节K这个块的Hash值,能够很快的计算出字节2到字节K+1这个块的Hash值,往前Roll一个字节,计算很快;强Hash就是可以认为不同块肯定有不同 Hash值,Rsync用的是MD4。我们让WH表示弱Hash,SH表示强Hash。 2) Host-B把每个块的WH和SH值发送给Host-A。 3) 该Host-A上场了,他的运算量比较大。Host-A对File-New每一个长度为K的块(也就是以每个字节开头的长度为K的块)计算WH,计算出来之后和Host-B发送过来的WH匹配,如果发现有相同的,再计算这个块的SH进行匹配,如果还是相符,说明这个块在File-Old里面也存在。假如 File-New长度为N,那么Host-A要处理大约(N-K)个块,这里可见用两个Hash算法的作用,WH用来做初步比较,而且因为它可以 Rolling,所以能够很快筛选掉大多数不匹配,对于漏网之鱼,也躲不过SH的筛选。 4) 通过上面的计算,Host-A可知道,File-New中哪些块和File-Old中的块相同,这样自然也可以计算出哪些不同,Host-A把这些不同encode一下送给Host-B。 5) Host-B收到Host-A送来的数据,decode,就得到了File-New相对于File-Old的改变,于是获得了File-New。 整个过程只需要一个round-trip(一个来回的通信),而且可以精确的得到一个字节级别的差别,Host-A的运算量相对要大一些。 Rsync的实现已经是*inx上面的一个重要工具,所以,当Microsoft在Windows 2003 Server上推出DFSR(Distributed File System Replication)时,Open Source Community颇有嘘声。其实DFSR采用的是RDC(Remote Differential Compression)算法,和RSync相差很大,并没有抄袭RSync。 RSync有学院气息(这个算法本来就是Andrew Tridgell的博士论文),结果很完美,File-New和File-Old每一个字节的差别都计算出来了,但是Host-A和Host-B的计算量不对等,大部分的计算都集中在Host-A上。RDC和RSync相比方向上有点不同,RDC并不追求计算出字节级别的diff,而是用较少的运算求出数据块级别的 diff。 RDC算法要求Host-A和Host-B通过一致的规则对File-New和File-Old分别进行分块,然后对每个块计算 SH,Host-B把每个块的SH值发给Host-A,Host-A对两组SH进行diff,就可以知道有哪些块不同,哪些块被删掉了,哪些块被添加了。 RDC的关键在于分块规则,也使用WH,要让同一规则应用于File-Old和File-New的时候,分出来的块能够尽量体现出区别。 比如File-Old包含“I Love Playing Basketball”, File-New是“I Like Playing Football”。 如果是RSync算法,Host-A能够计算出准确的差别,“I [...]

lucene 2.4.1 重建索引测试

机器配置: uname -a : Linux eshequn-SV06-A11 2.6.21.5-smp #1 SMP Sun Jan 27 23:51:02 CST 2008 i686 Intel(R) Xeon(TM) CPU 3.06GHz GenuineIntel GNU/Linux cpuinfo: processor        : 2 model name    : Intel(R) Xeon(TM) CPU 3.06GHz meminfo: MemTotal:      6234308 kB disk info: /dev/sda1 on / type reiserfs (rw,noatime) lucene 配置 writer = new IndexWriter(indexDir, paodingAnalyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); [...]