Skip to content


当前几个主要的Lucene中文分词器的比较[转]

 

1. 基本介绍:

paoding :Lucene中文分词“庖丁解牛” Paoding Analysis imdict :imdict智能词典所采用的智能中文分词程序 mmseg4j : 用 Chih-Hao Tsai 的 MMSeg 算法 实现的中文分词器 ik :采用了特有的“正向迭代最细粒度切分算法“,多子处理器分析模式

2. 开发者及开发活跃度:

paodingqieqie.wang, google code 上最后一次代码提交:2008-06-12,svn 版本号 132 imdictXiaoPingGao, 进入了 lucene contribute,lucene trunk 中 contrib/analyzers/smartcn/ 最后一次提交:2009-07-24, mmseg4jchenlb2008,google code 中 2009-08-03 (昨天),版本号 57,log为:mmseg4j-1.7 创建分支 iklinliangyi2005,google code 中 2009-07-31,版本号 41

3. 用户自定义词库:

paoding :支持不限制个数的用户自定义词库,纯文本格式,一行一词,使用后台线程检测词库的更新,自动编译更新过的词库到二进制版本,并加载 imdict :暂时不支持用户自定义词库。但 原版 ICTCLAS 支持。支持用户自定义 stop words mmseg4j :自带sogou词库,支持名为 wordsxxx.dic, utf8文本格式的用户自定义词库,一行一词。不支持自动检测。 -Dmmseg.dic.path ik : 支持api级的用户词库加载,和配置级的词库文件指定,无 BOM 的 UTF-8 编码, \n 分割。不支持自动检测。

4. 速度(基于官方介绍,非自己测试)

paoding :在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字 imdict483.64 (字节/秒),259517(汉字/秒) mmseg4j : complex 1200kb/s左右, simple 1900kb/s左右 ik :具有50万字/秒的高速处理能力

5. 算法和代码复杂度

paoding :svn src 目录一共1.3M,6个properties文件,48个java文件,6895 行。使用不用的 Knife 切不同类型的流,不算很复杂。 imdict :词库 6.7M(这个词库是必须的),src 目录 152k,20个java文件,2399行。使用 ICTCLAS HHMM隐马尔科夫模型,“利用大量语料库的训练来统计汉语词汇的词频和跳转概率,从而根据这些统计结果对整个汉语句子计算最似然(likelihood)的切分” mmseg4j : svn src 目录一共 132k,23个java文件,2089行。MMSeg 算法 ,有点复杂。 ik : svn src 目录一共6.6M(词典文件也在里面),22个java文件,4217行。多子处理器分析,跟paoding类似,歧义分析算法还没有弄明白。

6. 文档

paoding :几乎无。代码里有一些注释,但因为实现比较复杂,读代码还是有一些难度的。 imdict : 几乎无。 ICTCLAS 也没有详细的文档,HHMM隐马尔科夫模型的数学性太强,不太好理解。 mmseg4jMMSeg 算法 是英文的,但原理比较简单。实现也比较清晰。 ik : 有一个pdf使用手册,里面有使用示例和配置说明。

7. 其它

paoding :引入隐喻,设计比较合理。search 1.0 版本就用的这个。主要优势在于原生支持词库更新检测。主要劣势为作者已经不更新甚至不维护了。 imdict :进入了 lucene trunk,原版 ictclas 在各种评测中都有不错的表现,有坚实的理论基础,不是个人山寨。缺点为暂时不支持用户词库。 mmseg4j : 在complex基础上实现了最多分词(max-word),但是还不成熟,还有很多需要改进的地方。 ik :  针对Lucene全文检索优化的查询分析器IKQueryParser

8. 结论

个人觉得,可以在 mmseg4j 和 paoding 中选一个。关于这两个分词效果的对比,可以参考:

http://blog.chenlb.com/2009/04/mmseg4j-max-word-segment-compare-with-paoding-in-effect.html

或者自己再包装一下,将 paoding 的词库更新检测做一个单独的模块实现,然后就可以在所有基于词库的分词算法之间无缝切换了。

ps,对不同的 field 使用不同的分词器是一个可以考虑的方法。比如 tag 字段,就应该使用一个最简单的分词器,按空格分词就可以了。

原贴:http://blog.fulin.org/2009/08/lucene_chinese_analyzer_compare.html


目前使用的是paoding

Posted in Lucene, 技术.

Tagged with , .


使用 LambdaProbe监控Tomcat

Lambda Probe  Lambda Probe 是基于 Web + AJAX 的强大的免费开源工具,拥有几乎所有Tomcat Manager的功能,可以说是一个增强版本的 Tomcat Manager。除此之外,Tomcat Probe 还拥有很多让开发者和系统管理者更方便的性能。从而使得Tomcat对开发者和管理者更加透明。包括应用程序、数据源、发布、日志、线程、集群、系统信 息、状态、连接器状态这些功能。如配合 JDK 1.5 甚至可以实时的画出 Server 的详细内存占用状态。

  Lambda Probe 的官方地址:http://www.lambdaprobe.org,在此可以下载Lambda Probe的最新版本。

安装Probe 下载 ZIP 文件(LambdaProbe 1.7b, BINARIES ~7Mb), 解压后只需要发布probe.war文件到 Tomcat 服务器的 webapps 目录下. 支持的Tomcat 服务器版本: 5.0, 5.5, 6.0. 还有一个地方需要设置, 在 conf/tomcat-users.xml 中添加 manager 账户, probe 需要这个账户才能正确登录使用. 如果不知道怎么做, 你可以把文件内容改成这样即可拥有一个用户名和密码都为 c1g 的管理员账户:

充许查看内存使用情况 编辑tomcat/bin/catalina.sh,在-Xmx1200m 后增加

-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=29001 -Dcom.sun.management.jmxremote.ssl=false

如下

JAVA_OPTS=’-Xms1000m -Xmx1200m -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=29001 -Dcom.sun.management.jmxremote.ssl=false’

官方截图 界面本人很喜欢哈 <a href="http://www.lambdaprobe.org/d/screenshots/full/datasource_test.png” target=”_blank”null

null

在线demo 用户:demo 口令:demo http://demo.lambdaprobe.org/

Posted in Tomcat, 技术.

Tagged with , , .


优化 tomcat session和thread

Server Information Tomcat Version :Apache Tomcat/6.0.16 JVM Version :1.6.0_10-beta-b24 JVM Vendor :Sun Microsystems Inc. OS Name :Linux
OS Version :2.6.9-5.ELsmp
OS Architecture :i386

问题 应用为lucene全文搜索; 当php的缓存失效时会带来大量不经过squid的请求,导致半天搜索结果不出来,php占用大量cpu,系统一直满负载

解决方法 1.增加php缓存时间同时加上随机时间让请求分散 2.增加tomcat的并发能力

首先打开tomcat的管理功能方便查看状态 编辑conf/tomcat-users.xml增加用户

重启tomcat 请求http://localhost:8080/manager/html 可以看到当前各应用的session数,内存占用,线程数…

优化1:减少session生命周期 编缉conf/web.xml将默认的30分钟改成5分钟

5

也可以编辑各应用下的web.xml针对应用进行调整

优化2:增加线程数 编辑conf/server.xml,修改默认40到100

优化3:增加内存 优化tomcat 内存

优化后server status JVM Free memory: 589.87 MB Total memory: 1162.43 MB Max memory: 1162.43 MB http-8080

Max threads: 100 Current thread count: 26 Current thread busy: 6 Max processing time: 7545 ms Processing time: 4180.072 s Request count: 14471 Error count: 142 Bytes received: 0.00 MB Bytes sent: 297.62 MB

Posted in Tomcat, 技术.

Tagged with , , .


linux 下安装 subversion(svn) 客户端

svn server 为只支持http://协议的windows; test web server 为as4,现需安装svn客户端方便同步代码

网上找了下都是讲如何安装svn server的,我只需要一个支持http协议的客户端哈,不想装apache。

安装所需软件 apr,apr-util,sqlite,neon,subversion

1.下载软件

wget http://labs.xiaonei.com/apache-mirror/apr/apr-1.3.7.tar.gz wget http://labs.xiaonei.com/apache-mirror/apr/apr-util-1.3.8.tar.gz wget http://www.sqlite.org/sqlite-amalgamation-3.6.16.tar.gz wget http://www.webdav.org/neon/neon-0.28.4.tar.gz wget http://subversion.tigris.org/downloads/subversion-1.6.3.tar.bz2

2.安装apr

tar zxvf apr-1.3.7.tar.gz cd apr-1.3.7 ./configure -prefix=/usr/local/apr make make install cat /etc/ld.so.conf echo /usr/local/apr/lib >> /etc/ld.so.conf

3.安装apr-util

tar zxvf apr-util-1.3.8.tar.gz cd apr-util-.1.3.8 ./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr/ make make install echo /usr/local/apr-util/lib >> /etc/ld.so.conf ldconfig -v

4.安装sqlite

tar zxvf sqlite-amalgamation-3.6.16.tar.gz cd sqlite-3.6.16/ configure –prefix=/usr/local/sqlite make make install

5.安装neon 不需要支持http协议可以略掉安装

tar zxvf neon-0.28.4.tar.gz cd neon-0.28.4 ./configure –prefix=/usr/local/neon –enable-shared make make install

方式二:解压后重命名为neon,移动至subversion编译目录 但subversion编译时好像找不到neon 报错如下

configure: checking neon library An appropriate version of neon could not be found, so libsvn_ra_neon will not be built. If you want to build libsvn_ra_neon, please either install neon 0.28.4 on this system or get neon 0.28.4 from: http://www.webdav.org/neon/neon-0.28.4.tar.gz unpack the archive using tar/gunzip and rename the resulting directory from ./neon-0.28.4/ to ./neon/ no suitable neon found

6.安装subversion

tar -jxvf subversion-1.6.3.tar.bz2 cd subversion-1.6.3 ./configure –prefix=/usr/local/svn –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util –with-sqlite=/usr/local/sqlite –with-neon=/usr/local/neon make make install

7.检查测试 安装后应该有三个模块

/usr/local/svn/bin/svn –version svn,版本 1.6.3 (r38063) 编译于 Jul 30 2009,14:31:41 版权所有 (C) 2000-2009 CollabNet。 Subversion 是开放源代码软件,请参阅 http://subversion.tigris.org/ 站点。 此产品包含由 CollabNet(http://www.Collab.Net/) 开发的软件。 可使用以下的版本库访问模块: * ra_neon : 通过 WebDAV 协议使用 neon 访问版本库的模块。 – 处理“http”方案 * ra_svn : 使用 svn 网络协议访问版本库的模块。 – 使用 Cyrus SASL 认证 – 处理“svn”方案 * ra_local : 访问本地磁盘的版本库模块。 – 处理“file”方案

导出项目

cd /opt/srv/ /usr/local/svn/bin/svn export –username c1g –password 123456 http://192.168.1.9/pub37

参考: http://www.9say.com/2009/04/subversion-compile-with-ra-dav/

Posted in Subversion.

Tagged with , , .


redhat 系统内存为8G时,SWAP如何划分?

目前Red Hat推荐交换分区的大小应当与系统物理内存的大小保持线性比例关系。不过在小于2GB物理内存的系统中,交换分区大小应该设置为内存大小的两倍,如果内存大小多于2GB,交换分区大小应该是物理内存大小加上2GB。其原因在于,系统中的物理内存越大, 对于内存的负荷可能也越大。

但是,如果物理内存大小扩展到数百GB,这样做就没什么意义了。

实际上,系统中交换分区的大小并不取决于物理内存的量,而是取决于系统中内存的负荷。Red Hat Enterprise Linux 5可以在这样的情况下工作:完全没有交换分区,而且系统中匿名内存页和共享内存页小于3/4的物理内存量。在这种情况下,系统会将匿名内存页和共享内存页锁定在物理内存中,而使用剩余的物理内存来缓冲文件系统数据(pagecache),当内存耗尽时, 系统内核只会回收利用这些pagecache内存。

考虑到以下情况:

1)安装系统时难以确定内存的负荷,如何设置交换分区大小

2)系统中物理内存越大,所需交换分区就会越少

因此,在Red Hat Enterprise Linux 5中,以下是设置合适的交换分区大小的规则:

小于等于4G物理内存的系统,至少设置2GB的交换分区

4G~16G物理内存的系统,至少设置4GB的交换分区

16G~64G物理内存的系统,至少设置8GB的交换分区

16G~256G物理内存的系统,至少设置16GB的交换分区

参考: http://kbase.redhat.com/faq/docs/DOC-17162

http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/Installation_Guide/s2-diskpartrecommend-x86.html

Posted in LINUX, 技术.

Tagged with , .


解决dreamhost上传速度缓慢问题

dreamhost的下载速度还行,但是上传实在太慢了, 今天要传些文件到服务器,速度据然只有2~4K。。。 传了半天,中间又断了次。。。哭死

解决方法是先把文件上传到国外的中传服务器再wget回来 FileUrls提供上传一个文件,设置到期的期限(最长7天),给你一个下载链接,如果你需要的话可以为这个文件加上密码。

具体方法: 1.先把本地文件打包成xxx.zip 2.把xxx.zip上传至http://fileurls.com 上传大概有几十K 3.得到一个可以直接下载的url,在dh上wget http://fileurls.com/download.ashx?id=kprgdd

HTTP request sent, awaiting response… 200 OK Length: 5,306,368 [application/octet-stream] 100%[==========================>] 5,306,368 227.49K/s ETA 00:00 02:54:39 (287.06 KB/s) – `download.ashx?id=kprgdd’ saved [5306368/5306368]

4.unzip xxx.zip 完成

Posted in Tools, 其它.

Tagged with , .


Nginx设置 Uchome 二级域名

UCenter Home 是一套康盛创想构建的社会化网络软件。

uchome域名为home.c1gstudio.com,其实应该算是开启三级域名了

1.在域名控制台增加a记录

*.home.c1gstudio.com ->ip

2.nginx server_name增加泛解析 nginx.conf

server_name home.c1gstudio.com *.home.c1gstudio.com;

检查配置文件语法 /opt/nginx/sbin/nginx -t 然后重启(lemp是自已写的控制脚本) /opt/lemp reloadnginx

3.uchome后台开启二级域名功能 二级域名根域名里写”home.c1gstudio.com” 缓存更新 在个人用户里设置二级域名,过一会就可以访问了。 如:abc.home.c1gstudio.com会跳转到home.c1gstudio.com/space.php?domain=abc

参考:http://wiki.nginx.org/NginxChsHttpCoreModule

Posted in Nginx, 技术.

Tagged with , , .


Five Minutes程延辉 介绍开心农场架构

Five Minutes 公司程延辉(小名康天) 介绍开心农场架构,social game的技术挑战,支持千万级DAU的social game技术架构。这是一个对于开发者来说,非常精彩,非常有实用性指导的一次演讲,详细介绍了很多技术内幕。

Five Minutes 公司的著名social game 开心农场,目前非常受用户欢迎,包括国外的Facebook,国内的开心网都是如此,是全球最大的social game,台下热烈掌声。呵呵。开心农场这个游戏从介绍看,相当成功,最早是08年9月在xiaonei上线,而后在51等平台推广,包括Facebook。现在已经有1570万游戏用户了,其中包括50万的Facebook用户。

开心农场架构主要难点:1。如何存储大规模的用户数据千万级2。如果应对大量访问每天数亿请求量3。如果应对数据的频繁修改,每秒数万次数据修改。

解决的方式

优化:

1。负载均衡,web服务器平行扩展。

2。服务器性能优化。

3。异步处理,缓存数据接口,Linux内核参数优化,挖掘PHP的效率,用fastcgi模式运行php,用EAccelerator加速。固定不变数据做成php配置文件,用C开发PHP扩展等。

数据库性能优化:

1。数据库分库分表,所有数据全部设计成 key-》value形式,不用join。

2。使用INNODB,经常操作的数据表中所有字段尽量设计成数值型,用update替代INSERT和DELETE操作

异步处理:整个系统最关键的部分,

原则:把客户端暂时不需要的数据进行异步处理。

实例:讲非核心数据先写入memcached,异步更新到数据库,合并数据库更新操作,Feed和Notification的异步发送。

利用客户端资源:Flash屏蔽重复操作和不必要请求,Flash进行一些计算减轻服务器的复旦,例如好友排序等。Flash缓存一些数据。

social game = social + game。实时互动(大负载)和非实时互动(大负载)。

服务器角色:场景服务器,逻辑服务器,admin服务器,gateway,架构逻辑还是挺复杂的,每天处理亿级请求的架构,完全和百万级不一样!完全能够通过平行扩展的方式应对,gateway和场景服务器都完全可以增加。

Blue Whale是他们们正在开发的解决长连接的social game架构。

开心农场在现场招聘:需要C++,Python, Flash AS3程序员。

程延辉的演讲获得了在场热烈的掌声。 下载演讲ppt:Social Game的技术挑战.ppt

 

原文:http://blog.sina.com.cn/s/blog_6051dbbb0100du27.html

Posted in 技术, 网站架构.

Tagged with , , .


Twitter,架构的变迁[转]

Evan WeaverTwitter服务团队的总工程师,他的主要工作是优化与伸缩性。在QCon London 2009上,他谈到了Twitter的架构,特别是在过去一年当中为提升Web站点性能所执行的优化。

Twitter使用的大部分工具都是开源的。其结构是用Rails作前端,C,Scala和Java组成中间的业务层,使用MySQL存储数据。所有的东西都保存在RAM里,而数据库只是用作备份。Rails前端处理展现,缓存组织,DB查询以及同步插入。这一前端主要由几部分客户服务粘合而成,大部分是C写的:MySQL客户端,Memcached客户端,一个JSON端,以及其它。

中间件使用了Memcached,Varnish用于页面缓存,一个用Scala写成的MQ,Kestrel和一个Comet服务器也正在规划之中,该服务器也是用Scala写成,当客户端想要跟踪大量的tweet时它就能派上用场。

Twitter是作为一个“内容管理平台而非消息管理平台”开始的,因此从一开始基于聚合读取的模型改变到现在的所有用户都需要更新最新tweet的消息模型,需要许许多多的优化。这一改动主要在于三个方面:缓存,MQ以及Memcached客户端。

缓存

每个tweet平均被126个用户跟踪,所以这里有着明显的缓存需求。在最初的配置中,只有API有着一个页面缓存,当每次从一个用户那里来了一个tweet时就会失效,而应用的其它部分都是无缓存的:

image

第一个架构改动是创建一个直写式向量缓存包含了一个tweet ID的数组,tweet ID是序列化的64位整数。这一缓存的命中率是99%。

第二个改动是加入另一个直写式行缓存,它包含了数据库记录:用户和tweets。这一缓存有着95%的命中率并且使用了Nick Kallen的名为Cache Money的Rails插件。Nick是Twitter的一名系统架构师。

第三个改动是引入了一个直读式的碎片缓存,它包含了通过API客户端访问到的tweets的序列化版本,这些tweets可以被打包成JSON,XML或者是Atom的格式,有着同样是95%的命中率。这一碎片缓存“直接消费向量,而且如果现在缓存了一个序列化的碎片,它不会加载你试图看到的该tweet的实际的行,因此它将在大量时间将数据库置于短路状态,”Evan这样说到。

还有另一个改动是为页面缓存创建一个单独的缓存池。根据Evan的说法,该页面缓存池使用了一个分代的键模式,而不是直接的失效,因为用户可以

发送HTTP的if-modified-since并且将任何他们想要的时间戳放入请求路径,我们需要将这一数组切片并只呈现给他们他们想要看到的tweets,但我们不想跟踪客户端所使用的所有可能的键值。这一分代的键模式有一个大问题,在于它不会删除所有失效的键值。每一个被加入的对应到人们所接收的tweets数目的页面都会向缓存推送有效的数据,最后变得我们的缓存仅仅只有五个小时的有效生命周期,因为所有的页面缓存都将流过。

当该页面缓存转移到其自己的池之后,缓存未命中降低了将近50%。

这是Twitter现在所使用的缓存模式:

image

因为80%的Twitter流量都来自API,因此还有额外的二层缓存,每一个最多将处理95%来自前一层的请求。整体的缓存改动总共有百分之二三十的优化,它带来了

10倍的容量提升,它本可以更多,但现在我们遇到了另一瓶颈…我们的策略是首先加入直读式缓存,确保它正确失效,然后再转移到直写式缓存并且在线修复,而不是当一个新的tweet ID进来时每次都要销毁。

消息队列

因为,平均来说一个用户有126个追随者,这就意味着每个tweet将有126个消息在队列里。同时,流量会有出现高峰的时候,就像在奥巴马就职的时候达到了每秒几百个tweet或者说是成千上万的消息在队列里,是正常流量的3倍。MQ应当去化解这一高峰并随着时间将其分散,这样就不用增加许多额外的硬件。Twitter的MQ很简单:基于Memcached的协议,job之间是无序的,服务器之间没有共享的状态,所有的东西都保存在RAM里,并且是事务性的。

第一版的MQ实现是用的Starling,以Ruby写成,伸缩性不佳,特别是Ruby的GC不是分代的。这将导致MQ在某一点上崩溃,因为GC完成工作时将会把整个队列处理中止。因此作出了将MQ移植到Scala上的决定,它有着更为成熟的JVM GC机制。现有的MQ仅仅只有1200行代码并且运行在3台服务器上。

Memcached客户端

Memcached客户端的优化目的是试图优化集群负载。现在的客户端用的是libmemcached,Twitter是其最重要的用户和其代码库最重要的贡献者。基于此,持续一年的碎片缓存优化带来了50倍的每秒页面请求服务增加。

image

因为请求来自的位置难以确定,处理请求最快的办法就是将预先计算好的数据存储在网络RAM上,而不是当需要的时候在每个服务器上都重新计算一次。这一方式被主流的Web 2.0站点所使用,它们几乎都是完全直接运行于内存之上。根据Evan的说法,下一步就是“既可伸缩的读持续了一年之后,(解决)可伸缩的写,然后就是多协同定位的问题”。

这一QCon的演示文件发布在Evan的站点上

中文原文:http://www.infoq.com/cn/news/2009/06/Twitter-Architecture

查看英文原文: Twitter, an Evolving Architecture

Posted in 技术, 网站架构.

Tagged with , .


豆瓣网技术架构变迁[转]

概要 罗马不是一天建成的,豆瓣的技术架构也是随着用户规模的增长一直在持续变化中。在本次演讲中,豆瓣的首席架构师洪强宁将与大家一起分享从上线时的单台服务器架构开始一直到现在的豆瓣架构变迁历程。

个人简介 洪强宁,2002年毕业于清华大学,现任北京豆瓣互动科技有限公司首席架构师。洪强宁和他带领的技术团队致力于用技术改善人们的文化和生活品质,在网站架构、性能、可伸缩性上进行深入研究。豆瓣网曾获软件中国2006年度最佳技术应用网站。

关于会议 QCon全球企业开发大会(QCon Enterprise Software Development Conference)是由C4Media媒体集团InfoQ网站主办的全球顶级技术盛会,每年在伦敦、旧金山、北京、东京召开。自2007年3月份在伦敦召开首次举办以来,已经有包括金融、电信、互联网、航空航天等领域的近万名架构师、项目经理、团队领导者和高级开发人员参加过QCon大会。

详细内容:

http://www.infoq.com/cn/presentations/hongqn-douban

Posted in 技术, 网站架构.

Tagged with , .