0-家人
0-新酷应用
startups
友情链接
同事
日历
2010 九月 一 二 三 四 五 六 日 « 八 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 -
最近文章
搜索
近期评论
- Think In LAMP Blog » Blog Archive » PHP每月通讯(2010年9月) 在 PHP中的一些language construct 上的评论
- Think In LAMP Blog » Blog Archive » PHP每月通讯(2010年9月) 在 稍显寒酸的一个PHP框架:supermin 上的评论
- Tokyo Cabinet乱贴(未整理,仅供自己做笔记) « LAMP架构网站开发指南|Kenneth@Beijing2010 在 Tokyo Cabinet:另一个DBM实现 上的评论
- Anders 在 cloudapi 悄然上线,欢迎各方人士拍砖 上的评论
- key 在 新博开张 上的评论
- 怎么样 在 新博开张 上的评论
- timberland boots uk 在 新博开张 上的评论
- 小宝 在 稍显寒酸的一个PHP框架:supermin 上的评论
- fengfeng 在 稍显寒酸的一个PHP框架:supermin 上的评论
- deli 在 好色的程序员:怎么加上彩色显示 上的评论
分类目录归档:译文
[译文]Xapian 1.0索引/查询时的term处理方式
这是译文,原文地址:http://xapian.org/docs/termgenerator.html 翻译:一米六二(renlu.xu@gmail.com) Xapian 1.0索引/查询时的term处理方式 简介 在Xapian 1.0,默认的索引方式已发生了重大变化(这些都是来自旧的索引方式在真实世界 中的实际经验教训).本文档介绍了新计划,并跟过去的旧方式做对比. 词干处理 最明显的区别是抽取词干后term的处理。 在此之前,所有的词都是词干后再索引,但是没有前缀;所有大写词都并不做词干抽取处理(但是会变小写),并加一下”R”前缀.这样做的理由是,人们希望能够搜索准确的名字(比如像英语词干提取就合并了Tony和Toni 。但当然,这也使得句子开头的一个词,标题文字,另外德语所有名词都是大写,这些都是会这样编入索引。无论是正常的和带R的前缀都会带着位置信息被索引。 现在,我们索引所有词的小写形同时带上位置信息,以及词语未做词干抽取状态加上”Z”的前缀,但这时不带位置信息.默认情况下会使用一个Xapian::Stopper 以避免索引stopwords的词根(测试表明,这会省下数据库1%的大小)。 新的索引方式允许精确短语搜索(这是旧的方式所不支持的)。现在NEAR 操作符只能应用在词语的未取词干的形式上,不过这也够了.我们还可以禁用对查询中大写词语的词根抽取,以在对物定名词搜索时获得更好的效果。现在Omega的$topterms 总是能正确建议一个未抽取词根的形式! 为词根形式添加前缀的主要理由是,他们的量比较少!另外,一个附带好处是,它开创了一种多种语言的词根形式,如Z:en ,Z:fr: 或其他的随便什么语言. QueryParser中对.结尾的特殊处理(这会因为人们粘贴过来的一段文字而错误地被触发)已经去掉了.此功能之所以出现,主要是为了支持欧米茄的topterms加入词根形式;但是现在Omega已经可以建议未取词干的形式,因此就不再需要这个功能了. 成词字符(能组成词的字符,比如英文中26个字符就是,而|符号和:号就不是) 默认情况下,Unicode字符的CONNECTOR_PUNCTUATION 分类下的字符(_和其他常见的一些字符)不用做其他形式的处理就是成词字符了,这样可以更好地索引一些标识符.以前像time_t这种就需要一个短语搜索了. 尾部的+和#仍然可以包含在Term中(尾部最多可以有3个这样的字符),但-默认不可以了。把他们包含有进来会有益的例子(nethack–,cl-),好处并不十分明显,相反,他们作为连字符更常见更有用.这些例子并不引人注目的好处是它( 的nethack -和 Cl -),它往往胶连字符到条款。 嵌入的单引号’((撇号)现在可以包含在Term中了.以前版本中这会使得短语搜索变慢,同时索引中会被带进来垃圾Term(didn’t 会变成ditn 和t)。各种Unicode使用的撇号都映射到了ASCII的形式。 其他很少量的字符(这些字符取一个词的Unicode的定义中)如果是包含在两个成词字符中的话也可以视为是Term的一部分;,。,,和少量其他字符在出现在两个十进制字符之间时会视为Term的一部分. 本文由蝌蚪安尼友情赞助.
Xapian的查询分析器
英文地址:http://xapian.org/docs/queryparser.html Xapian::QueryParser的语法 本文档介绍了Xapian::QueryParser类支持的查询语法.这套语法设计得跟其他基于Web的搜索引擎的语法类似,这样用户就会很熟悉,不用从头学习一个全新的语法。 操作符 AND Expression AND expression 匹配两个条件都符合的文档. OR Expression AND expression 匹配符合两个条件中任何一个的文档. NOT expression NOT expression 匹配那些只匹配第一个条件的文档.这个也可以写成expression AND NOT expression.如果您设置了FLAG_PURE_NOT,那么 NOT expression 就匹配了所有不符合这个表达式的文档 XOR expression XOR expression 匹配那些符合两个条件中的一个的文档;但是不能两个都符合.XOR可能有点不好理解。 带括号的表达式 你可以括号来调整布尔运算符的优先级.在one OR two AND three这个查询中,AND优先,这跟one OR (two AND three)是一样的.你可以用(one OR two) … 继续阅读
译文:Xapian搜索结果的排序
这是译文,原文地址:http://xapian.org/docs/sorting.html 搜索结果的排序 简介 默认情况下,Xapian按相关性递减的原则来排序搜索结果.然而,它也可以让搜索结果按其他指标,或其他指标和相关性的混合排序。 如果两个搜索结果从排序标准来判断是相同的分值,那他们的返回顺序就取决于它们的文档ID了.默认情况下,他们会按文档ID的升序排序(这样,一个较小的文档ID就会排前面),但可以设置为降序排列enquire.set_docid_order(enquire.DESCENDING);。如果你无所谓,你可以告诉Xapian随便使用任何一种排序都有序enquire.set_docid_order(enquire.DONT_CARE);。 按相关性排序 默认情况下Xapian使用的是BM25加权公式,它有许多参数可以设置。其中的部分参数我们使用默认值,在应付一般的工作时,它们工作得很好。这些参数的最佳值取决于数据被索引的方式和要运行的查询的类型,所以你也许可以改善一下,通过调整这些值来使搜索系统更有效,但它是一个繁琐的过程,人们通常懒得这么干。 去BM25文件了更多的细节。 其他权重方式包括TradWeight和BoolWeight. TradWeight实现了原来的概率加权公式,基本上是BM25的一种特殊情况(它就是BM25在K2 = 0,K3= 0,b = 1和min_normlen = 0的加权,只不过用一个常量线性缩放鸟)。 BoolWeight给所有文档,因此排序完全取决于其他因素。 您也可以实现自己的权重系统,只要用一个数值的形式来量化匹配的条件的(减去不匹配的条件),再考虑一些跟查询term无关的统计资料(比如说,标准化文件长度),就大功靠成鸟。 例如,这里有一个“几何匹配法” – 每个匹配就给一分: class CoordinateWeight : public Xapian::Weight { public: CoordinateWeight * clone() const { return new CoordinateWeight; } CoordinateWeight() { … 继续阅读
Xapian 术语表
原文地址:http://xapian.org/docs/glossary.html 术语表 本术语表定义了在使用xapian时可能遇到的一些专业术语.其中一些是信息检索领域的标准概念,而另一些则在xapian中有特别的意义. BM25 xapian默认使用的加权方法。BM25是原来的概率加权算法的,而最近的TREC测试表明,BM25是已知的相关性衡量体系中最好的。有时它也被称为“Okapi BM25”,因为它是最先是在一个叫Okapi的学术性的IR系统中实现的。 布尔检索 检索跟一个布尔查询(例如,由一些运算符像AND,OR,AND_NOT等连接的term串)相匹配的一系列文档.在许多系统中,这些文件没有按照相关性来打分排序。在的xapian,一个纯粹的布尔查询可以使用,或者一个布尔式查询可以过滤检索文件,然后下令使用概率的排名。在Xpian中,你可以用一个单纯的Bool查询;也可以用一个布尔风格的查询,这时先检索相关的文档,并按排相关性来排序. Chert Chert是目前正在开发的1.1.x中使用的数据库格式.我们正在努力使它像flint一样可靠,唯一的不同是做了一些不兼容的改动,因此你可能需要重新索引您的的数据.而flint格式的数据库在xapian的几个版本中是相兼容的.在1.2.0版本中,chert将会成为可靠版本,并且成为默认的后端,而flint会被废弃. 数据库 跟关系性数据库不同,Xapian的数据库并不只是索引了文档内容,因为Xapian的目标是成为一个信息检索系统,而不是一个信息存储系统.这些问题偶尔也可能被称为索引。 文档ID 在xapian的数据库中,标识一个文章档的唯一ID,是一个正档数. 文档数据 文档数据是附加在一个文档上的的数据信息,可以是好几种信息,其内容可以设置在各种格式,比如可以存储URL,文档的标题,文档的文章本摘要等级.如果你想[篡改](我用词一向这么猥琐地选贬义词)Omega,可以发现Oemga的文档数据应该包含key-value对,每行一个.Omega的最新版本还支持每行一个字段值,在查询中可以指定行号和字段名的匹配关系)。 <String Name=”Document”>文档</String> 这就是一个个要被检索的项目。通常常他们会是文本文件(如网页,电子邮件,文字处理文档),但你也可以在文档中附加文件,或照片,视频,音乐,用户配置文件,或是其他任何你想要索引的玩意儿。 编辑距离 从一个词变到另一个词必须经过多少个”编辑”步骤.常用在拼写建议中.Xapian使用的算法,会将任何一个字符插入,删除,改变字符,或交换两个相邻字符都统计上. ESet(展开集) Eset是一个一系列的带分值的Term的列表,是原始查询的延伸.这些词统计学上都能比较好地区分相关文档和不相关文档的. Flint Flint是当前xapian使用的数据库格式从xapian 1.0起成为默认格式,并取代了Quartz。Flint相当地高效,也具有高可扩展性。它支持增量修改,并且支持对数据库单写多读的并发模式。 索引 如果一个文档是由一个Term描述,我们就说这个词索引了该文档。同样,在xapian和其他的信息检索系统中的数据库有时也叫做索引(形象地说,就像一本书背后的术语表)。 索引器 索引器接收(各种格式)的文章档并处理他们,以便能够有效地进行搜索,这些文档会被人存储在数据库中。 目标信息 用户想查到的信息。人们通常会用一个查询字符串来描述他们的目标信息 信息检索(IR) 信息检索是一门关于搜索的科学。它是一个学术上的名称,主要包含跟搜索相关的有关课题的研究. MSet(匹配集) 匹配集(MSet)是从一个查询返回的一个带有分值的文档清单。这份名单根据文档的比重来打分,因此打分最高的文档具有最高的相关性,第二个文档第二位,依此类推。一个Mset里的文档数是可控的,因此它通常不包含匹配的所有文件。 标称文档长度(ndl) 标称文档长度(ndl)是一个文件的长度(它包含有的term的数目)除以系统内所有文档的平均长度得到的数值。因此,一个刚好是平均长度的文档,他的标称文档长度等于1,而较短的文件标称文档长度都小于1,和更长的文件则大于1。 Omega Omega是用xapian来构建的,包含一个CGI的搜索程序和两个索引器. … 继续阅读
Xapian搜索体系结构
这是对http://www.flax.co.uk/blog/2009/04/02/xapian-search-architecture/ 的简单翻译. 严格意义上,这篇投递跟flax无关,只是为向直接使用Xapian的人们介绍一下Xapian搜索的体系结构。这不是给有经验的Xapian hacker提供的,也不是介绍如何使用Xapian的入门文章(入门文章请访问这里)。 Xapian API是相当复杂的,而且在索引和搜索时,QueryParser,Term,document values 经常困惑着人们.要特别指出的是,Xapian本身并无一个”field”的概念,field这东西是flax的组件做的更高层次的抽象和封装.Xapian只是有Document ,包含一个整数标识ID,document包含: Terms (通常是词或短语,可以带位置信息,带位置信息的叫POST), VAlue (通常是一个简短的字符串,也可能是包含的二进制数据),以及 data (可以是任何数据,但往往是一些适合显示的文本)。 这三种类型的对象是完全独立的,虽然在一个应用程序级相关(terms经常是从document data中切分得到的)。在索引时,Term会由一个文本处理器生成,当然也可能是单独地直接给出.term一般是专为字串搜索设计的 –比如一个特定的词是否在某个文档中出现?Value被用于其他多种用途,例如如范围搜索(如日期),排序,以及其他一些跟应用程序相关的方面。document data不能被用于搜索,它主要被搜索程序在得到搜索结果后使用,像是在搜索结果列表中显示文件的信息等. 当document被添加到一个Xapian数据库时,term,value和document data会单独存储在专门为了查询而优化的不同的数据结构里.如下图显示: 这是搜索过程的一个相当简化的说明.但从根本上来说,查询就是对term和value的匹配.一个典型的查询可以是如下示例: llamas和yaks Xapian匹配器查找数据库中的词条,并收集一个含有这个词条的document的列表。如果查询只包括terms,那么这个列表就构成了一个搜索结果并作为一个MSet返回给客户端代码。 但是,如果查询包含range组件(如范围2009年1月1日- 2009年4月2日 ),那将会需要一个寻第二查询阶段。匹配器会检查候选MSet中每个document中相应的value,并与查询范围比较。如果它不属于查询范围,该document就被弹出结果集,否则该document就被返回到客户端。 最后,通过自定义一个MatchDecider类的子类,还可以定制Xapian的搜索过程.这些子类可以访问document的任何属性,但因为性能方面的原因,通常只使用value。比如说,一个典型的应用是,根据用户的权限来过滤搜索结果:匹配器会比较用户的权限等级和候选文档的ACL设置,并决定是否在查询结果中返回该文档. 搜索优化 虽然这个模型过于简单,它仍然可以帮助我们改进数据库设计和搜索规划。在一般情况下,在磁盘上,term和postion list比value要远大得多,因此基于term的搜索一般受限于IO.这就是为什么有足够的RAM来提供磁盘缓存(数据库大小的10%或以上)时,搜索性能可以大大提高的原因。 相比之下,value range的搜索和匹配器的计算更密集,往往是受CPU限制。在查询没有指定任何term以限制候选MSet的大小时,单儿的value搜索会一个个地碾过所有的文档集(documents),在大型数据库上这个会灰常灰常地慢. 如果需要range查询搜索,添加一个term条件以给数据库分区,可以大大减轻性能压力.例如,日期可能由一个合适的索引前缀+YYYYMM构成的term来描述。然后,一个对日期范围的搜索就可以由一个term搜索来完成,这能大大减少要处理的document数量.例如,,2009年1月16日- 2009年4月2日的日期范围搜索可以由: (XD200901或XD200902或XD200903或XD200904)的term搜索来限定. 这包括1月到4月的数据,超过必要的数据了,但是随后的范围子搜索中我们会去掉多余的数据。这时这个term搜索会大大减少需要处理的文件的数量,进而提高搜索速度。 不过,必须选择适当级别的粒度.如果我们按单天产生term而不是按月,日期term将产生76个,在IO方面可能就会有性能风险。 所有这一切都是相当复杂的,这就是为什么我们添加到flax中来处理的原因。我们搞flax的目标是针对数据源输入的各式的数据文档,能自动地产生优化的规划.而用户不太需要去关注这个过程请继续关注这里的消息以获得更新的消息:http://www.flax.co.uk/ 本文由蝌蚪安尼友情赞助.
用PHP和xapian构建全文检索[转]
大约从07年起,本博客就不转载了; 这篇算是以译文发的,原文在:http://www.contentwithstyle.co.uk/content/searching-with-xapian-and-php ========邪恶的分割线============ 有的时候呢,嗯 ,mysql 就是不够快;尤其是在做全文检索的时候.各个字段都得正确地检索才行,而当我们的各个字段带有不同的权重时,事情就马上变得特别复杂了,这时你就需要xapian来救急了. Xapian是什么东东 xapian是一个全文检索库,就和lucene和sphinx一样;它需要从c++代码编译,比较底层;现在已经有直接可用的php,perl,python绑定可以用了.目前提供了redhat和ubuntu的包;你可以在Mac os上编译,还可以通过cygwin来在windows下运行. 示例脚本 我不想去解释why和how,我只想展示一个简单的脚本;我封装的php文件有点大,读者可以从这下载; db.sql CREATE DATABASE `demo`; CREATE TABLE `demo`.`demo` ( `id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `unique_key` VARCHAR( 255 ) NOT NULL , `name` VARCHAR( 255 ) NULL DEFAULT … 继续阅读
tokyo cabinet的替代产品:kyoto cabinet
说起tokyocabinet,大家应该都知道,知名的key-value对数据库,memcache的替代产品,tokyotyrant和flare都是用的tokyocabinet来做的底层存储,嗯;tokyocabinet是作者对他之前的qdbm的一个升华. 作者果然”很猛很持久”,最近新推出了kyoto cabinet,是用C++写的,嗯,作者终于学会C++了(嗯,我是调侃一下,作者之前的所有作品都是用纯C写的,我很欣赏;现在用C++,可不是个好兆头!); 之前的tokyo cabinet意思好像是”东京柜子”,不知道为什么作者这么怀念东京的小柜子呢…刚出炉的这个kyoto cabinet,呃,名字似乎就是京都小柜子…. 来自评论采集机器人:tokyo cabinet的意思是,东京内阁,kyoto cabinet 的意思是,京都内阁, 而tokyo tyrant的意思是…..东京暴君; 长话短说,拿kyoto cabinet和tokyo cabinet比较一下:(来源:作者pdf说明文档) 空间效率更高(数据库尺寸更小) 并发性能:在 多线程情况下性能更好(使用了CAS等原子操作) 可移植性:不再需要posix的依赖(也就是说,windows上应该也能跑了) 可用性:面向对象的编程(当然,用上C++了嘛) 鲁棒性(通俗一点:健壮性):自动的事务和回滚 另外: kyoto cabinet 依赖于现代的C++实现,并且在线程实现多了锁的开销. 项目地址:http://www.1978th.net/kyotocabinet/ 本文由蝌蚪安尼友情赞助.
XHProf中文文档
XHProf是facebook在用的php性能分析工具,跟Xdebug相比,性能开销更低,可以用在生产环境。 原文地址在: http://mirror.facebook.net/facebook/xhprof/doc.html 半成品:XHProf中文文档, 约在本周内完成。 [addons at 2009-08-14:目前已经推进到了75%。欢迎斧正。] 本文由蝌蚪安尼友情赞助.相关文章社区全文检索引擎Hyper Estraier 学习笔记[4]beautiful Soup in Python测试FusionIO:strict_sync太秀逗了…文本挖掘,构造垃圾站[一]Tokyo Dystopia:基于Tokyo Cabinet的一个全文检索系统家有phper初长成Linux/Windows双系统并存方案:andLinux (不是虚拟机也不是双系统哦)Spread学习系列[1]-SP_receive函数说明PHP注释查看器
测试FusionIO:strict_sync太秀逗了…
这是一篇译文,原文地址是: http://www.mysqlperformanceblog.com/2009/06/15/testing-fusionio-strict_sync-is-too-strict/ 随着新的更新FusionIO驱动的更新,我能够在我的戴尔R900与Ubuntu 8.10上进行尝鲜,而不再需要痛苦地编译驱动或是降级kernel.现在我决定测试一下strict_sync模式。 据我所知FusionIO默认情况下,比如英特尔的SSD ,是对应用程序“撒谎”了,fsync()并不是真正的发生了,它仍然只是提交到了内存而不是最终的磁盘。FusionIO还有一个“ strict_sync ”模式,可以保证fsync函数可靠地操作。 好啊兄弟,让我们来压一下性能—通常我在100w数据(约9GB数据),O_DIRECT模式下开着3GB的buffer_pool来搞这个测试。 原始测试数量参见这里 结果用TPM (每分钟的事务数)表示 ,这样更清楚一些。图形显示,结果是是随着时间[X轴]不断变化 。 这个图形已经很明显,我都不需要再用文字来说明了。。。 但是我没有测试,在断电的情况下,在默认模式下处理、结束事务的情况。这个需要读者您检查一下。 本文由蝌蚪安尼友情赞助.
怎样用一行脚本美化/etc/my.cnf文件
原文地址:http://www.mysqlperformanceblog.com/2009/06/15/how-to-pretty-print-mycnf-with-a-one-liner/ 当我在一台服务器上转悠时,我会经常想看看/etc/my.cnf文件格式,当然是想看格化美观,没有注释的。这样的一行Perl就能将美化输出文件: 1.perl -ne ‘m/^([^#][^\s=]+)\s*(=.*|)/ && printf(“%-35s%s\n”, $1, $2)’ /etc/my.cnf 2.[client] 3.port = 3306 4.socket = /var/run/mysqld/mysqld.sock 5.[ mysqld_safe ] 6.socket = /var/run/mysqld/mysqld.sock 7.nice = 0 8.[ mysqld ] 9.user = mysql 10.pid-file = /var/run/mysqld/mysqld.pid 11.socket = /var/run/mysqld/mysqld.sock 12.port = … 继续阅读