??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩在线观看一区二区,日产欧产美韩系列久久99,99久热这里只有精品视频免费观看http://www.aygfsteel.com/weidagang2046/category/17361.html物格而后知致zh-cnWed, 28 Feb 2007 04:35:17 GMTWed, 28 Feb 2007 04:35:17 GMT60Blogger Rankhttp://www.aygfsteel.com/weidagang2046/articles/91368.htmlweidagang2046weidagang2046Tue, 02 Jan 2007 05:47:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/91368.htmlhttp://www.aygfsteel.com/weidagang2046/comments/91368.htmlhttp://www.aygfsteel.com/weidagang2046/articles/91368.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/91368.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/91368.html 写博客就要写的短精(zhn),逻辑清晰Q太长的博客基本上没人看Q又长又枯燥的博客就更没有h看了?/span> 我估?a onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">老白是少数有毅力能够把我的博客读完的Z一。有此䆾毅力Q何事不?wbr>。所以,老白也是我敬仰敬重的人?/span>

 

不过谈到q个排名和打分问题,咱哥们儿q是应该在一?/span> 合计合计q个事儿 Q?/span>

 

1. Z么要搞公共排名,而不是个人排名?

 

个h排名Q读?a onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">老白的文?/a>之后Q才理解q是一个个人知识管理的问题。其实绝大多Chq不订阅那么多博客,他们每天读读 Keso 和老白的网摘,在到 365key ?/span> donews 的主上转一圈,基本׃会漏掉什么重要内宏V如果这仅仅是老白{?wbr>数人的困扰Q那Ҏ(gu)很多了Q大不了老白自己手工l计一?wbr>Q辛苦老白一个,能造福千万人?

 

谈到打分Q更是这P没有排名和比较,分数没有意?wbr>。老白其实也可以根据自己心中的分数搞出来一个老白阅读?wbr>Q和胡润财富榜一h为大安d客的重要参照依据?/p>

 

我没有老白?/span> Keso q样大的影响力,也没有许多时间来一一甄别和评判众多博?wbr>Q只好和大家一P要么期盼老白或?/span> Keso 能够搞出来一个,要么p跟潮,看看有没有社会化评h(hun)的体pd?wbr>法?/span>

 

2. Z么没有用页面访问量Q?/strong>

 

q个东西太容易造假Q而且不能反映博客的水q_质量。常在互联网L(fng)兄弟们虽然没有徐博客那L(fng)明星出生 Q但是想要搞炚w面访问量Q先不说那些技术手D,q是有其他许多方法:起一些危a耸听或者吸引眼球的标题Q脓(chung)些带擦边球的囄Q经怸注一下百度和新浪搜烦排前几名的关键字Q经常{载一些从 ChinaBBS Q?/span> Qihoo 上来的热门脓(chung)。博客可以搞的臭气熏天,面讉K量倒也可以同步增长。回复数Q? TrackBack 因ؓ SPAM 的原因同样不太可靠?/span>

 

3. Z么没有用订阅数Q?/strong>

 

没有使用订阅者倒不是因为担心造假Q这个问题比较复杂?/p>

 

仅有订阅数是不以表明博客的价倹{比如,有两?/span> Blogger Q?/span> A ?/span> B ?/span> A ?/span> 10 个订阅者, B ?/span> 15 个订阅者,能简单的?/span> B A 更有价值吗Q如果说 A 的订阅者都是象老白Q?/span> Keso q样的大牛,?/span> B 的订阅者都是自己刚开始写博客的小兄弟们, A ?/span> B 的h(hun)值那个高Q这很难说了?/span>

 

所?/span> Blogger 有没有h(hun)D要看订阅者的权倹{这L(fng)话,问题来了。凭什么说Q老白的权值是 100 Q?/span> Keso 的权g?/span> 100 Q而小兄弟的权值就只有 1 呢?q里的依据是什么?老白肯定认ؓ与小兄弟相比Q自q权值应该是 1000 Q因Z的订阅者都是象 keso q样的大牛,你看q?/span> keso 都说老白的文章是要认真对待的。自q值应该是 Keso q群大牛的加权^均倹{可?/span> Keso 的g什么地Ҏ(gu)呢?他的订阅者中也有老白啊。这不就变成了死循环了吗Q?/span> Page Rank 的A(ch)献就在这里:他先假设所有h初始权值都是相同的Q每增加一个h订阅或者链接就增加一份权|q样通过反复叠代Q就能够收敛到最l的权倹{?

 

q个思\不仅仅能用在|页链接的排名上Q同栯可以用在订阅关系?wbr>博客之间的相互链接上。不q最q有人告诉我Q以色列数学家找Z Page Rank 的缺P认ؓ PR 法没有考虑面的更新程度,一旦一个页面被一?/span> PR 值高的页面链接了Q那׃x怺Q不用更C能保持很高的 PR 倹{有兴趣的h可以参看一?q里。我们在此略q不表?/span> 

 

如果使用了类?/span> PR 法的订阅数Q这个可行吗Q基本上q是不可行的Q因?/span> Blogger 是无法知道自q博客被多h订阅和观看的Q不同的客户?wbr>Q还有许多象 Bloglines Q?/span> Gougou q样的中转站Q不同的标准Q根本无法统计?/span>

 

4. Z么没有给别h打分呢?

 

在公认的排名中,l别人打分,也有个信用度的问?wbr>。象老白q样德高望重Q品学兼优的人打出来的分数就可靠?wbr>Q小兄弟们打出来的分数就没有那么可靠。所以,在打分之前也涉及? 一个权值或者信用度的问题。可是权重和信用度从什么地Ҏ(gu)呢?

 

l文章打分而不是给人打分,q也比较复杂。博?/span> A 一月 5 博客,篇都是_֓Q博?/span> B 一月 10 ,其中 3 是_֓Q?/span> 7 是他个人的八卦故事Q谁的分数应该高一些?如果是按dQ显?/span> B 要高Q但?/span> A 在常理判断上g更有价g些,因ؓ他精品多Q阅d扰却不多。那我们取q_|问题又来了, A 下个月只?/span> 1 精品了Q?/span> B q是 一月 10 3 是_֓Q?/span> 7 非_֓Q哪个高Q文章有太多的随机性和偶然性,而且因ؓ文章数和文章质量在不同的博客Q不同的旉D|不一L(fng)Q给文章打分反而把问题搞复杂了?/span>

 

5. Z么没有搞客户端的评h(hun)体系Q?/strong>

原因是客户端太多,如果希望l一太复杂。在q点?wbr>Q我同意王徏的说法Q?a onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">当一件事情有赖于多于一个h的努力才能成功的话,他成功的可能性就很?。有条g的网站如 donews Q?/span> gougou, feedsky q是应该自己独立搞一个,或者小规模的联合一下,千万别等客户端的l一?/span>

 

{到一博客大牛们把自q Blogger Rank 图标象蓝色的 Bloglines 订阅敎ͼl色?/span> Gougou 订阅Ch在自q博客上,大家又象讨论 Alexa 排名一样ؓq个 Blogger Rank 争论不休。这个时候,才算略有成?/span>

 

正因虑到这些东西,才写下了q篇文章Q就当作是抛砖引玉吧Q希望看到更多更好的思\?br />
from: http://blog.donews.com/henryhwa/archive/2006/03/29/798355.aspx



weidagang2046 2007-01-02 13:47 发表评论
]]>
Google SiteMap Protocol协议 http://www.aygfsteel.com/weidagang2046/articles/91036.htmlweidagang2046weidagang2046Sat, 30 Dec 2006 09:36:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/91036.htmlhttp://www.aygfsteel.com/weidagang2046/comments/91036.htmlhttp://www.aygfsteel.com/weidagang2046/articles/91036.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/91036.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/91036.html在新看到这L(fng)新闻Google雅虎微Y联手支持|页手工提交标准, Google、微软和雅虎认ؓQ统一标准有助于从整体上改q站点地图,从而搜索引擎可以将更广泛的信息加入索引。当Ӟ搜烦l端用户也将从中L(fng)。Google|站理员中心品经理瓦内萨·克?Vanessa Fox)表示Q“我们的首要d是ؓ用户提供最x索结果,以及为网站所有者运营网站提供便利。”Google、微软和雅虎q将推动其它搜烦引擎q营商,以及相关软g厂商加入Sitemaps协议支持者的行列?font face="Times New Roman">Google、雅虎以及微软宣布已l达成共识,旗下的搜索引擎将采用l一的Sitemaps 0.9(站点地图)协议对网站进行烦引。目前,?/font>www.sitemaps.org|站上,已经为网站管理员准备了一套简单快L(fng)指引Q搜烦引擎能够完整、有效地对网站进行烦引。了解一下Google SiteMap Protocol.

Google SiteMap Protocol是Google自己推出的一U站点地囑֍议,此协议文件基于早期的robots.txt文g协议Qƈ有所升。在Google官方指南中指出加入了Google SiteMap文g的网站将更有利于Google|页爬行机器人的爬行索引Q这样将提高索引|站内容的效率和准确度。文件协议应用了单的XML格式Q一q?个标{,其中关键标签包括链接地址、更新时间、更新频率和索引优先权?/p>

Google SiteMap文g生成后格式如下:
<urlset xmlns="http://www.google.com/schemas/sitemap&#xD;&#xA;/0.84"> <url> <loc>http://www.keyusoft.cn</loc> <lastmod>2005-06-03T04:20-08:00</lastmod> <changefreq>always</changefreq> <priority>1.0</priority> </url> <url> <loc>http://www.keyusoft.cn/post/140.html</loc> <lastmod>2005-06-02T20:20:36Z</lastmod> <changefreq>daily</changefreq> <priority>0.8</priority> </url> </urlset>
XML标签
  • changefreq:面内容更新频率?
  • lastmod:面最后修Ҏ(gu)?
  • loc:面怹链接地址
  • priority:相对于其他页面的优先?
  • url:相对于前4个标{父标{?
  • urlset:相对于前5个标{父标{?
我将一句一句分解讲解这个xml文g的每一个标{:
  1. <urlset xmlns="http://www.google.com/schemas/sitemap/0.84">
    q一行定义了此xml文g的命名空_相当于网|件中?lt;html>标签一L(fng)作用?
  2. <url></url>q是具体某一个链接的定义入口Q你所希望展示在SiteMap文g中的每一个链接都要用<url>?lt;/url>包含在里面,q是必须的?
  3. <loc>http://www.keyusoft.cn</loc>?lt;loc>描述出具体的链接地址Q这里需要注意的是链接地址中的一些特D字W必{换ؓXML(HTML)定义的{义字W,如下表:
    字符转义后的字符
    HTML字符字符~码
    and(?&&amp;&#38;
    单引?/td>&apos;&apos;&#39;
    双引?/td>"&quot;&#34;
    大于?/td>>&gt;&#62;
    于?/td><&lt;&#60;
  4. <lastmod>2005-06-03T04:20:32-08:00</lastmod><lastmod>是用来指定该链接的最后更新时_q个很重要。Google的机器h会在索引此链接前先和上次索引记录的最后更新时间进行比较,如果旉一样就会蟩q不再烦引。所以如果你的链接内容基于上ơGoogle索引时的内容有所改变Q应该更新该旉Q让Google下次索引时会重新对该链接内容q行分析和提取关键字。这里必ȝISO 8601中指定的旉格式q行描述Q格式化的时间格式如下:
    • q_YYYY(2005)
    • q和月:YYYY-MM(2005-06)
    • q月日:YYYY-MM-DD(2005-06-04)
    • q月日小时分钟:YYYY-MM-DDThh:mmTZD(2005-06-04T10:37+08:00)
    • q月日小时分钟秒QYYYY-MM-DDThh:mmTZD(2005-06-04T10:37:30+08:00)
    q里需注意的是TZDQTZD指定是本地旉区域标记Q像中国是+08:00?
  5. <changefreq>always</changefreq>用这个标{֑诉Google此链接可能会出现的更新频率,比如首页肯定p用always(l常)Q而对于很久前的链接或者不再更新内容的链接可以用yearly(每年)。这里可以用来描q的单词p几个Q?always", "hourly", "daily", "weekly", "monthly", "yearly"Q具体含义我׃用解释了吧,光看单词的意思就明白了?
  6. <priority>1.0</priority><priority>是用来指定此链接相对于其他链接的优先权比|此值定?.0 - 1.0之间
  7. q有</url>?lt;/urlset>Q这两个是来关闭xml标签的,q和HTML中的</body>?lt;/html>是一个道?
  8. 另外需要注意的?/b>Q这个xml文g必须是utf-8的编码格式,不管你是手动生成q是通过代码生成Q徏议最好检查一下xml文g是否是utf-8~码Q最单的Ҏ(gu)是用记事本打开xml然后另存为时选择~码(或{换器)为UTF-8?

from: http://www.cnblogs.com/shanyou/archive/2006/11/17/564152.aspx



weidagang2046 2006-12-30 17:36 发表评论
]]>
Anti-Crawler Scripthttp://www.aygfsteel.com/weidagang2046/articles/88643.htmlweidagang2046weidagang2046Mon, 18 Dec 2006 13:42:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/88643.htmlhttp://www.aygfsteel.com/weidagang2046/comments/88643.htmlhttp://www.aygfsteel.com/weidagang2046/articles/88643.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/88643.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/88643.html阅读全文

weidagang2046 2006-12-18 21:42 发表评论
]]>
在应用中加入全文索功能——基于Java的全文烦引引擎Lucene?/title><link>http://www.aygfsteel.com/weidagang2046/articles/87684.html</link><dc:creator>weidagang2046</dc:creator><author>weidagang2046</author><pubDate>Thu, 14 Dec 2006 05:05:00 GMT</pubDate><guid>http://www.aygfsteel.com/weidagang2046/articles/87684.html</guid><wfw:comment>http://www.aygfsteel.com/weidagang2046/comments/87684.html</wfw:comment><comments>http://www.aygfsteel.com/weidagang2046/articles/87684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/weidagang2046/comments/commentRss/87684.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/weidagang2046/services/trackbacks/87684.html</trackback:ping><description><![CDATA[ <p>作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com</p> <p>写于Q?002/08 最后更斎ͼ <script language="Javascript" src="http://www.chedong.com/referer.js"></script> 11/29/2006 17:23:30<br /><a >Feed Back >></a> (<a >Read this before you ask question</a>)<a ><br /><img alt="Creative Commons License" src="http://www.creativecommons.cn/images/public/somerights.gif" border="0" /></a><q告></p> <p>版权声明Q可以Q意{载,转蝲时请务必以超链接形式标明文章原始出处和作者信息及本声?br /><a >http://www.chedong.com/tech/lucene.html</a></p> <p>关键词:Lucene java full-text search engine Chinese word segment</p> <p> <span style="FONT-WEIGHT: bold"> </span>内容摘要Q?/p> <p>Lucene是一个基于Java的全文烦引工具包?/p> <ol> <li> <a >ZJava的全文烦引引擎Lucene介:关于作者和Lucene的历?/a> </li> <li> <a >全文索的实现QLuene全文索引和数据库索引的比?/a> </li> <li> <a >中文切分词机制简介:Z词库和自动切分词法的比?/a> </li> <li> <a >具体的安装和使用介:pȝl构介绍和演C?/a> </li> <li> <a >Hacking LuceneQ简化的查询分析器,删除的实玎ͼ定制的排序,应用接口的扩?/a> </li> <li> <a >从Lucene我们q可以学C?/a> </li> </ol> <p> <a name="intro"> <b>ZJava的全文烦?索引擎——Lucene</b> </a> </p> <p>Lucene不是一个完整的全文索引应用Q而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各U应用中实现针对应用的全文烦?索功能?/p> <p>Lucene的作者:Lucene的A(ch)献?a >Doug Cutting</a>是一位资深全文烦?索专Ӟ曄是V-Twin搜烦引擎(Apple的Copland操作pȝ的成׃一)的主要开发者,后在Excite担Q高pȝ架构设计师,目前从事于一些INTERNET底层架构的研I。他贡献出的Lucene的目标是为各U中型应用E序加入全文索功能?/p> <p>Lucene的发展历E:早先发布在作者自q<a >www.lucene.com</a>Q后来发布在<a >SourceForge</a>Q?001q年底成为APACHE基金会jakarta的一个子目Q?a >http://jakarta.apache.org/lucene/</a></p> <p>已经有很多Java目都用了Lucene作ؓ其后台的全文索引引擎Q比较著名的有:</p> <ul> <li> <a >J</a> <a >ive</a>QWEB论坛pȝQ? </li> <li> <a >Eyebrows</a>Q邮件列表HTML归档/览/查询pȝQ本文的主要参考文档?a >TheLucene search engine: Powerful, flexible, and free</a>”作者就是EyeBrowspȝ的主要开发者之一Q而EyeBrows已经成ؓ目前APACHE目的主要邮件列表归档系l? </li> <li> <a >Cocoon</a>:ZXML的web发布框架Q全文检索部分用了Lucene </li> <li> <p align="left"> <a >Eclipse</a>:ZJava的开攑ּ发^収ͼ帮助部分的全文烦引用了Lucene</p> </li> </ul> <p>对于中文用户来说Q最兛_的问题是其是否支持中文的全文索。但通过后面对于Lucene的结构的介绍Q你会了解到׃Lucene良好架构设计Q对中文的支持只需对其语言词法分析接口q行扩展p实现对中文检索的支持?/p> <p> <b> <a name="compare">全文索的实现机制</a> </b> </p> <p>Lucene的API接口设计的比较通用Q输入输出结构都很像数据库的?=>记录==>字段Q所以很多传l的应用的文件、数据库{都可以比较方便的映到Lucene的存储结?接口中。M上看Q可以先?b>Lucene当成一个支持全文烦引的数据库系l?/b>?/p> <p>比较一下Lucene和数据库Q?/p> <table width="100%" border="1"> <tbody> <tr> <td align="middle" width="50%">Lucene</td> <td align="middle" width="50%">数据?/td> </tr> <tr> <td width="50%"> <pre>索引数据源:doc(field1,field2...) doc(field1,field2...)<br /> \ indexer /<br /> _____________<br /> | Lucene Index|<br /> --------------<br /> / searcher \<br /> l果输出QHits(doc(field1,field2) doc(field1...))</pre> </td> <td width="50%"> <pre> 索引数据源:record(field1,field2...) record(field1..)<br /> \ SQL: insert/<br /> _____________<br /> | DB Index |<br /> -------------<br /> / SQL: select \<br />l果输出Qresults(record(field1,field2..) record(field1...))</pre> </td> </tr> <tr> <td width="50%">DocumentQ一个需要进行烦引的“单元?br />一个Document由多个字D늻?/td> <td width="50%">RecordQ记录,包含多个字段</td> </tr> <tr> <td width="50%">FieldQ字D?/td> <td width="50%">FieldQ字D?/td> </tr> <tr> <td width="50%">HitsQ查询结果集Q由匚w的Documentl成</td> <td width="50%">RecordSetQ查询结果集Q由多个Recordl成</td> </tr> </tbody> </table> <p> <b>全文??like "%keyword%"</b> </p> <p>通常比较厚的书籍后面常常附关键词索引表(比如Q北京:12, 34,上vQ?,77……)Q它能够帮助读者比较快地找到相兛_容的늠。而数据库索引能够大大提高查询的速度原理也是一P惛_一下通过书后面的索引查找的速度要比一一地d定w多少倍……而烦引之所以效率高Q另外一个原因是它是排好序的?b>对于索系l来说核心是一个排序问?/b>?/p> <p align="left">׃数据库烦引不是ؓ全文索引设计的,因此Q?b>使用like "%keyword%"Ӟ数据库烦引是不v作用?/b>Q在使用like查询Ӟ搜烦q程又变成类g一页M的遍历过E了Q所以对于含有模p查询的数据库服务来_LIKEҎ(gu)能的危x极大的。如果是需要对多个关键词进行模p匹配:like"%keyword1%" and like "%keyword2%" ...其效率也可惌知了?/p> <p>所以徏立一个高效检索系l的关键是徏立一个类gU技索引一L(fng)反向索引机制Q将数据源(比如多篇文章Q排序顺序存储的同时Q有另外一个排好序的关键词列表Q用于存储关键词==>文章映射关系Q利用这L(fng)映射关系索引Q[关键?=>出现关键词的文章~号Q出现次敎ͼ甚至包括位置Qv始偏U量Q结束偏U量Q,出现频率]Q检索过E就是把<b>模糊查询变成多个可以利用索引的精查询的逻辑l合的过E?/b>。从而大大提高了多关键词查询的效率,所以,全文索问题归l到最后是一个排序问题?/p> <p>由此可以看出模糊查询相对数据库的_查询是一个非怸定的问题,q也是大部分数据库对全文索支持有限的原因。Lucene最核心的特征是通过Ҏ(gu)的烦引结构实C传统数据库不擅长的全文烦引机Ӟq提供了扩展接口Q以方便针对不同应用的定制?/p> <p>可以通过一下表格对比一下数据库的模p查询:</p> <table height="283" width="100%" border="1"> <tbody> <tr> <td align="middle" width="9%" height="16"> </td> <td align="middle" width="47%" height="16">Lucene全文索引引擎</td> <td align="middle" width="40%" height="16">数据?/td> </tr> <tr> <td width="9%" height="48">索引</td> <td width="47%" height="48">数据源中的数据都通过全文索引一一建立反向索引</td> <td width="40%" height="48">对于LIKE查询来说Q数据传l的索引是根本用不上的。数据需要逐个便利记录q行GREP式的模糊匚wQ比有烦引的搜烦速度要有多个数量U的下降?/td> </tr> <tr> <td width="9%" height="49">匚w效果</td> <td width="47%" height="49">通过词元(term)q行匚wQ通过语言分析接口的实玎ͼ可以实现对中文等非英语的支持?/td> <td width="40%" height="49">使用Qlike "%net%" 会把netherlands也匹配出来,<br />多个关键词的模糊匚wQ用like "%com%net%"Q就不能匚w词序颠倒的xxx.net..xxx.com</td> </tr> <tr> <td width="9%" height="32">匚w?/td> <td width="47%" height="32">有匹配度法Q将匚wE度Q相似度Q比较高的结果排在前面?/td> <td width="40%" height="32">没有匚wE度的控Ӟ比如有记录中net出现5词和出现1ơ的Q结果是一L(fng)?/td> </tr> <tr> <td width="9%" height="32">l果输出</td> <td width="47%" height="32">通过特别的算法,最匚w度最高的?00条结果输出,l果集是~冲式的批量读取的?/td> <td width="40%" height="32">q回所有的l果集,在匹配条目非常多的时候(比如上万条)需要大量的内存存放q些临时l果集?/td> </tr> <tr> <td width="9%" height="32">可定制?/td> <td width="47%" height="32">通过不同的语a分析接口实现Q可以方便的定制出符合应用需要的索引规则Q包括对中文的支持)</td> <td width="40%" height="32">没有接口或接口复杂,无法定制</td> </tr> <tr> <td width="9%" height="32">l论</td> <td width="47%" height="32">高负载的模糊查询应用Q需要负责的模糊查询的规则,索引的资料量比较?/td> <td width="40%" height="32">使用率低Q模p匹配规则简单或者需要模p查询的资料量少</td> </tr> </tbody> </table> <p> <span style="FONT-WEIGHT: bold">全文索和数据库应用最大的不同在于Q让</span> <span style="FONT-WEIGHT: bold">最相关?/span> <span style="FONT-WEIGHT: bold">?00条结果满?8%以上用户的需?br /></span> <br />Lucene的创C处:</p> <p>大部分的搜烦Q数据库Q引擎都是用B?wi)结构来l护索引Q烦引的更新会导致大量的IO操作QLucene在实CQ对此稍微有所改进Q不是维护一个烦引文Ӟ而是在扩展烦引的时候不断创建新的烦引文Ӟ然后定期的把q些新的烦引文件合q到原先的大索引中(针对不同的更新策略,Ҏ(gu)的大可以调_Q这样在不媄响检索的效率的前提下Q提高了索引的效率?/p> <p>Lucene和其他一些全文检索系l?应用的比较:</p> <table width="100%" border="1"> <tbody> <tr> <td align="middle" width="18%"> </td> <td align="middle" width="45%">Lucene</td> <td align="middle" width="37%">其他开源全文检索系l?/td> </tr> <tr> <td width="18%">增量索引和批量烦?/td> <td width="45%">可以q行增量的烦?Append)Q可以对于大量数据进行批量烦引,q且接口设计用于优化扚w索引和小扚w的增量烦引?/td> <td width="37%">很多pȝ只支持批量的索引Q有时数据源有一点增加也需要重建烦引?/td> </tr> <tr> <td width="18%">数据?/td> <td width="45%">Lucene没有定义具体的数据源Q而是一个文档的l构Q因此可以非常灵zȝ适应各种应用Q只要前端有合适的转换器把数据源{换成相应l构Q,</td> <td width="37%">很多pȝ只针对网,~Z其他格式文档的灵zL?/td> </tr> <tr> <td width="18%">索引内容抓取</td> <td width="45%">Lucene的文档是由多个字D늻成的Q甚臛_以控刉些字D需要进行烦引,那些字段不需要烦引,q一步烦引的字段也分为需要分词和不需要分词的cdQ?br />   需要进行分词的索引Q比如:标题Q文章内容字D?br />   不需要进行分词的索引Q比如:作?日期字段</td> <td width="37%">~Z通用性,往往文档整个烦引了</td> </tr> <tr> <td width="18%">语言分析</td> <td width="45%">通过语言分析器的不同扩展实现Q?br />可以qo掉不需要的词:an the of {,<br />西文语法分析Q将jumps jumped jumper都归l成jumpq行索引/?br />非英文支持:对亚z语aQ阿拉伯语言的烦引支?/td> <td width="37%">~Z通用接口实现</td> </tr> <tr> <td width="18%">查询分析</td> <td width="45%">通过查询分析接口的实玎ͼ可以定制自己的查询语法规则:<br />比如Q?多个关键词之间的 + - and or关系{?/td> <td width="37%"> </td> </tr> <tr> <td width="18%">q发讉K</td> <td width="45%">能够支持多用L(fng)使用</td> <td width="37%"> </td> </tr> </tbody> </table> <p> </p> <p> <b> <a name="segment">关于亚洲语言的的切分词问?Word Segment)</a> </b> </p> <p>对于中文来说Q全文烦引首先还要解决一个语a分析的问题,对于英文来说Q语句中单词之间是天焉过I格分开的,但亚z语a的中日韩文语句中的字是一个字挨一个,所有,首先要把语句中按“词”进行烦引的话,q个词如何切分出来就是一个很大的问题?/p> <p>首先Q肯定不能用单个字符?si-gram)为烦引单元,否则查“上”时Q不能让含有“v上”也匚w?/p> <p>但一句话Q“北京天安门”,计算机如何按照中文的语言?fn)惯q行切分呢?<br />“北?天安门?q是“北 ?天安门”?让计机能够按照语言?fn)惯q行切分Q往往需要机器有一个比较丰富的词库才能够比较准的识别句中的单词?/p> <p>另外一个解决的办法是采用自动切分算法:单词按?元语?bigram)方式切分出来Q比如:<br />"北京天安? ==> "北京 京天 天安 安门"?/p> <p>q样Q在查询的时候,无论是查?北京" q是查询"天安?Q将查询词组按同L(fng)规则q行切分Q?北京"Q?天安安门"Q多个关键词之间按与"and"的关pȝ合,同样能够正确地映到相应的烦引中。这U方式对于其他亚z语aQ韩文,日文都是通用的?/p> <p>Z自动切分的最大优Ҏ(gu)没有词表l护成本Q实现简单,~点是烦引效率低Q但对于中小型应用来_Z2元语法的切分q是够用的。基?元切分后的烦引一般大和源文件差不多Q而对于英文,索引文g一般只有原文g?0%-40%不同Q?/p> <table height="68" width="100%" border="1"> <tbody> <tr> <td align="middle" width="11%" height="18"> <br /> </td> <td align="middle" width="39%" height="18">自动切分</td> <td align="middle" width="50%" height="18">词表切分</td> </tr> <tr> <td width="11%" height="16">实现</td> <td width="39%" height="16">实现非常?/td> <td width="50%" height="16">实现复杂</td> </tr> <tr> <td width="11%" height="16">查询</td> <td width="39%" height="16">增加了查询分析的复杂E度Q?/td> <td width="50%" height="16">适于实现比较复杂的查询语法规?/td> </tr> <tr> <td width="11%" height="16">存储效率</td> <td width="39%" height="16">索引冗余大,索引几乎和原文一样大</td> <td width="50%" height="16">索引效率高,为原文大的30Q左?/td> </tr> <tr> <td width="11%" height="16">l护成本</td> <td width="39%" height="16">无词表维护成?/td> <td width="50%" height="16">词表l护成本非常高:中日韩等语言需要分别维护?br />q需要包括词频统计等内容</td> </tr> <tr> <td width="11%" height="16">适用领域</td> <td width="39%" height="16">嵌入式系l:q行环境资源有限<br />分布式系l:无词表同步问?br />多语a环境Q无词表l护成本</td> <td width="50%" height="16">Ҏ(gu)询和存储效率要求高的专业搜烦引擎<br /></td> </tr> </tbody> </table> <p>目前比较大的搜烦引擎的语a分析法一般是Z以上2个机制的l合。关于中文的语言分析法Q大家可以在Google查关键词"wordsegment search"能找到更多相关的资料?/p> <p> <a name="demo"> <b>安装和?/b> </a> </p> <p>下蝲Q?a >http://jakarta.apache.org/lucene/</a></p> <p>注意QLucene中的一些比较复杂的词法分析是用JavaCC生成的(JavaCCQJavaCompilerCompilerQ纯Java的词法分析生成器Q,所以如果从源代码编译或需要修改其中的QueryParser、定制自q词法分析器,q需要从<a >https://javacc.dev.java.net/</a>下蝲javacc?/p> <p>lucene的组成结构:对于外部应用来说索引模块(index)和检索模?search)是主要的外部应用入口</p> <table width="100%" border="1"> <tbody> <tr> <td width="27%">org.apache.Lucene.search/</td> <td width="73%">搜烦入口</td> </tr> <tr> <td width="27%">org.apache.Lucene.index/</td> <td width="73%">索引入口</td> </tr> <tr> <td width="27%">org.apache.Lucene.analysis/</td> <td width="73%">语言分析?/td> </tr> <tr> <td width="27%">org.apache.Lucene.queryParser/</td> <td width="73%">查询分析?/td> </tr> <tr> <td width="27%">org.apache.Lucene.document/</td> <td width="73%">存储l构</td> </tr> <tr> <td width="27%">org.apache.Lucene.store/ </td> <td width="73%">底层IO/存储l构</td> </tr> <tr> <td width="27%">org.apache.Lucene.util/</td> <td width="73%">一些公用的数据l构</td> </tr> </tbody> </table> <p>单的例子演示一下Lucene的用方法:</p>索引q程Q从命o行读取文件名Q多个)Q将文g分\?path字段)和内?body字段)2个字D进行存储,q对内容q行全文索引Q烦引的单位是Document对象Q每个Document对象包含多个字段Field对象Q针对不同的字段属性和数据输出的需求,对字D还可以选择不同的烦?存储字段规则Q列表如下: <table border="1"><tbody><tr><th>Ҏ(gu)</th><th>切词</th><th>索引</th><th>存储</th><th>用?/th></tr><tr><td>Field.Text(String name, String value)</td><td>Yes</td><td>Yes</td><td>Yes</td><td valign="top">切分词烦引ƈ存储Q比如:标题Q内容字D?/td></tr><tr><td>Field.Text(String name, Reader value)</td><td>Yes</td><td>Yes</td><td>No</td><td valign="top">切分词烦引不存储Q比如:META信息Q?br />不用于返回显C,但需要进行检索内?/td></tr><tr><td>Field.Keyword(String name, String value)</td><td>No</td><td>Yes</td><td>Yes</td><td valign="top">不切分烦引ƈ存储Q比如:日期字段</td></tr><tr><td>Field.UnIndexed(String name, String value)</td><td>No</td><td>No</td><td>Yes</td><td valign="top">不烦引,只存储,比如Q文件\?/td></tr><tr><td>Field.UnStored(String name, String value)</td><td>Yes</td><td>Yes</td><td>No</td><td valign="top">只全文烦引,不存?/td></tr></tbody></table><pre>public class IndexFiles { <br /> //使用Ҏ(gu)Q? IndexFiles [索引输出目录] [索引的文件列表] ... <br /> public static void main(String[] args) throws Exception {<br /> String indexPath = args[0];<br /> IndexWriter writer;<br /> //用指定的语言分析器构造一个新的写索引器(W?个参数表C是否ؓq加索引Q?br /> writer = new IndexWriter(indexPath, new SimpleAnalyzer(), false);<br /><br /> for (int i=1; i<args.length; i++) {<br /> System.out.println("Indexing file " + args[i]);<br /> InputStream is = new FileInputStream(args[i]);<br /><br /> //构造包?个字DField的Document对象<br /> //一个是路径path字段Q不索引Q只存储<br /> //一个是内容body字段Q进行全文烦引,q存?br /> Document doc = new Document();<br /> doc.add(Field.UnIndexed("path", args[i]));<br /> doc.add(Field.Text("body", (Reader) new InputStreamReader(is)));<br /> //文档写入烦?br /> writer.addDocument(doc);<br /> is.close();<br /> };<br /> //关闭写烦引器<br /> writer.close();<br /> }<br />}<br /> </pre><p>索引q程中可以看刎ͼ</p><ul><li>语言分析器提供了抽象的接口,因此语言分析(Analyser)是可以定制的Q虽然lucene~省提供?个比较通用的分析器SimpleAnalyser和StandardAnalyserQ这2个分析器~省都不支持中文Q所以要加入对中文语a的切分规则,需要修改这2个分析器? </li><li>Luceneq没有规定数据源的格式,而只提供了一个通用的结构(Document对象Q来接受索引的输入,因此输入的数据源可以是:数据库,W(xu)ORD文档QPDF文档QHTML文档……只要能够设计相应的解析转换器将数据源构造成成Docuement对象卛_q行索引? </li><li>对于大批量的数据索引Q还可以通过调整IndexerWrite的文件合q率属性(mergeFactorQ来提高扚w索引的效率?</li></ul><p>索过E和l果昄Q?/p><p>搜烦l果q回的是Hits对象Q可以通过它再讉KDocument==>Field中的内容?/p><p>假设Ҏ(gu)body字段q行全文索,可以查询结果的path字段和相应查询的匚w?score)打印出来Q?/p><pre>public class Search { <br /> public static void main(String[] args) throws Exception {<br /> String indexPath = args[0], queryString = args[1];<br /> //指向索引目录的搜索器<br /> Searcher searcher = new IndexSearcher(indexPath);<br /> //查询解析器:使用和烦引同L(fng)语言分析?br /> Query query = QueryParser.parse(queryString, "body", <br /> new SimpleAnalyzer());<br /> //搜烦l果使用Hits存储<br /> Hits hits = searcher.search(query);<br /> //通过hits可以讉K到相应字D늚数据和查询的匚w?br /> for (int i=0; i<hits.length(); i++) {<br /> System.out.println(hits.doc(i).get("path") + "; Score: " + <br /> hits.score(i));<br /> };<br /> }<br />}</pre>在整个检索过E中Q语a分析器,查询分析器,甚至搜烦器(SearcherQ都是提供了抽象的接口,可以Ҏ(gu)需要进行定制? <p><b><a name="hacking">Hacking Lucene</a></b></p><p><b>化的查询分析?/b></p><p>个h感觉lucene成ؓJAKARTA目后,d了太多的旉用于调试日趋复杂QueryParserQ而其中大部分是大多数用户q不很熟(zhn)的Q目前LUCENE支持的语法:</p><p>Query ::= ( Clause )*<br />Clause ::= ["+", "-"] [<TERM> ":"] ( <TERM> | "(" Query ")")</p><p>中间的逻辑包括Qand or + - &&||{符P而且q有"短语查询"和针对西文的前缀/模糊查询{,个h感觉对于一般应用来_q些功能有一些华而不实,其实能够实现目前cM于Google的查询语句分析功能其实对于大多数用户来说已经够了。所以,Lucene早期版本的QueryParser仍是比较好的选择?/p><p><b>d修改删除指定记录QDocumentQ?/b></p><p>Lucene提供了烦引的扩展机制Q因此烦引的动态扩展应该是没有问题的,而指定记录的修改也似乎只能通过记录的删除,然后重新加入实现。如何删除指定的记录呢?删除的方法也很简单,只是需要在索引时根据数据源中的记录ID专门另徏索引Q然后利用IndexReader.delete(Termterm)Ҏ(gu)通过q个记录ID删除相应的Document?/p><p><b>Ҏ(gu)某个字段值的排序功能</b></p><p>lucene~省是按照自q相关度算法(scoreQ进行结果排序的Q但能够Ҏ(gu)其他字段q行l果排序是一个在LUCENE的开发邮件列表中l常提到的问题,很多原先Z数据库应用都需要除了基于匹配度QscoreQ以外的排序功能。而从全文索的原理我们可以了解刎ͼM不基于烦引的搜烦q程效率都会D效率非常的低Q如果基于其他字D늚排序需要在搜烦q程中访问存储字D,速度回大大降低,因此非常是不可取的?/p><p>但这里也有一个折中的解决Ҏ(gu)Q在搜烦q程中能够媄响排序结果的只有索引中已l存储的docID和scoreq?个参敎ͼ所以,Zscore以外的排序,其实可以通过数据源预先排好序,然后Ҏ(gu)docIDq行排序来实现。这样就避免了在LUCENE搜烦l果外对l果再次q行排序和在搜烦q程中访问不在烦引中的某个字D倹{?/p><p>q里需要修改的是IndexSearcher中的HitCollectorq程Q?/p><pre>...<br /> scorer.score(new HitCollector() {<br /> private float minScore = 0.0f;<br /> public final void collect(int doc, float score) {<br /> if (score > 0.0f && // ignore zeroed buckets<br /> (bits==null || bits.get(doc))) { // skip docs not in bits<br /> totalHits[0]++;<br /> if (score >= minScore) {<br /> /* 原先QLucenedocID和相应的匚w度score例入l果命中列表中:<br /> * hq.put(new ScoreDoc(doc, score)); // update hit queue<br /> * 如果用doc ?1/doc 代替 scoreQ就实现了根据docID排或逆排<br /> * 假设数据源烦引时已经按照某个字段排好了序Q而结果根据docID排序也就实现?br /> * 针对某个字段的排序,甚至可以实现更复杂的score和docID的拟合?br /> */<br /> hq.put(new ScoreDoc(doc, (float) 1/doc )); <br /> if (hq.size() > nDocs) { // if hit queue overfull<br /> hq.pop(); // remove lowest in hit queue<br /> minScore = ((ScoreDoc)hq.top()).score; // reset minScore<br /> }<br /> }<br /> }<br /> }<br /> }, reader.maxDoc());</pre><p><b>更通用的输入输出接?/b></p><p>虽然lucene没有定义一个确定的输入文档格式Q但来多的h惛_使用一个标准的中间格式作ؓLucene的数据导入接口,然后其他数据Q比如PDF只需要通过解析器{换成标准的中间格式就可以q行数据索引了。这个中间格式主要以XMLZQ类似实现已l不?Q?个:</p><pre>数据? WORD PDF HTML DB other<br /> \ | | | /<br /> XML中间格式<br /> |<br /> Lucene INDEX</pre><p>目前q没有针对MSWord文档的解析器Q因为Word文档和基于ASCII的RTF文档不同Q需要用COM对象机制解析。这个是我在Google上查的相兌料:<a >http://www.intrinsyc.com/products/enterprise_applications.asp</a><br />另外一个办法就是把Word文档转换成textQ?a >http://www.winfield.demon.nl/index.html</a><br /></p><p><br /><b>索引q程优化</b></p><p>索引一般分2U情况,一U是批量的索引扩展Q一U是大批量的索引重徏。在索引q程中,q不是每ơ新的DOC加入q去索引都重新进行一ơ烦引文件的写入操作Q文件I/O是一仉常消耗资源的事情Q?/p><p>Lucene先在内存中进行烦引操作,q根据一定的扚wq行文g的写入。这个批ơ的间隔大Q文件的写入ơ数少Q但占用内存会很多。反之占用内存少Q但文gIO操作频繁Q烦引速度会很慢。在IndexWriter中有一个MERGE_FACTOR参数可以帮助你在构造烦引器后根据应用环境的情况充分利用内存减少文g的操作。根据我的用经验:~省Indexer是每20条记录烦引后写入一ơ,每将MERGE_FACTOR增加50倍,索引速度可以提高1倍左叟?br /></p><p><span style="FONT-WEIGHT: bold">搜烦q程优化<br /></span></p><p><span style="FONT-WEIGHT: bold"></span>lucene支持内存索引Q这L(fng)搜烦比基于文件的I/O有数量的速度提升?br /><a >http://www.onjava.com/lpt/a/3273</a><br />而尽可能减少IndexSearcher的创建和Ҏ(gu)索结果的前台的缓存也是必要的?br /><span style="FONT-WEIGHT: bold"></span></p><p><b></b></p><p>Lucene面向全文索的优化在于首次索引索后Qƈ不把所有的记录QDocumentQ具体内容读取出来,而v只将所有结果中匚w度最高的?00条结果(TopDocsQ的ID攑ֈl果集缓存中q返回,q里可以比较一下数据库索:如果是一?0,000条的数据库检索结果集Q数据库是一定要把所有记录内定w取得以后再开始返回给应用l果集的。所以即使检索匹配L很多QLucene的结果集占用的内存空间也不会很多。对于一般的模糊索应用是用不到这么多的结果的Q头100条已l可以满?0%以上的检索需求?br /></p><p>如果首批~存l果数用完后q要d更后面的l果时Searcher会再ơ检索ƈ生成一个上ơ的搜烦~存数大1倍的~存Qƈ再重新向后抓取。所以如果构造一个SearcherL1Q?20条结果,Searcher其实是进行了2ơ搜索过E:?00条取完后Q缓存结果用完,Searcher重新索再构造一?00条的l果~存Q依此类推,400条缓存,800条缓存。由于每ơSearcher对象消失后,q些~存也访问那不到了,你有可能惛_l果记录~存下来Q缓存数量保证?00以下以充分利用首ơ的l果~存Q不让Lucene费多次索,而且可以分q行l果~存?br /></p><p>Lucene的另外一个特Ҏ(gu)在收集结果的q程中将匚w度低的结果自动过滤掉了。这也是和数据库应用需要将搜烦的结果全部返回不同之处?/p><p><a >我的一些尝?/a>Q?/p><ul><li>支持中文的TokenizerQ这里有2个版本,一个是通过JavaCC生成的,对CJK部分按一个字W一个TOKEN索引Q另外一个是从SimpleTokenizer改写的,对英文支持数字和字母TOKENQ对中文按P代烦引? </li><li>ZXML数据源的索引器:XMLIndexerQ因此所有数据源只要能够按照DTD转换成指定的XMLQ就可以用XMLIndxerq行索引了? </li><li>Ҏ(gu)某个字段排序Q按记录索引序排序l果的搜索器QIndexOrderSearcherQ因此如果需要让搜烦l果Ҏ(gu)某个字段排序Q可以让数据源先按某个字D|好序Q比如:PriceFieldQ,q样索引后,然后在利用这个按记录的ID序索的搜烦器,l果是相当于是那个字段排序的结果了?</li></ul><p><a name="learn"><b>从Lucene学到更多</b></a></p><p>Luene的确是一个面对对象设计的典范</p><ul><li>所有的问题都通过一个额外抽象层来方便以后的扩展和重用:你可以通过重新实现来达到自q目的Q而对其他模块而不需要; </li><li>单的应用入口Searcher, IndexerQƈ调用底层一pdlg协同的完成搜索Q务; </li><li>所有的对象的Q务都非常专一Q比如搜索过E:QueryParser分析查询语句{换成一pd的精查询的l合(Query),通过底层的烦引读取结构IndexReaderq行索引的读取,q用相应的打分器l搜索结果进行打?排序{。所有的功能模块原子化程度非帔RQ因此可以通过重新实现而不需要修改其他模块。? </li><li>除了灉|的应用接口设计,Luceneq提供了一些适合大多数应用的语言分析器实玎ͼSimpleAnalyser,StandardAnalyserQ,q也是新用户能够很快上手的重要原因之一?</li></ul><p>q些优点都是非常值得在以后的开发中学习(fn)借鉴的。作Z个通用工具包,Lunece的确l予了需要将全文索功能嵌入到应用中的开发者很多的便利?/p><p>此外Q通过对Lucene的学?fn)和使用Q我也更深刻地理解了Z么很多数据库优化设计中要求,比如Q?/p><ul><li>可能对字段q行索引来提高查询速度Q但q多的烦引会Ҏ(gu)据库表的更新操作变慢Q而对l果q多的排序条Ӟ实际上往往也是性能的杀手之一? </li><li>很多商业数据库对大批量的数据插入操作会提供一些优化参敎ͼq个作用和烦引器的merge_factor的作用是cM的, </li><li>20%/80%原则Q查的结果多q不{于质量好,其对于q回l果集很大,如何优化q头几十条结果的质量往往才是最重要的? </li><li>可能让应用从数据库中获得比较小的结果集Q因为即使对于大型数据库Q对l果集的随机讉K也是一个非常消耗资源的操作?br /></li></ul><p>参考资料:</p><p>Apache: Lucene Project<br /><a >http://jakarta.apache.org/lucene/<br /></a>Lucene开?用户邮g列表归档<br /><a >Lucene-dev@jakarta.apache.org</a><br /><a >Lucene-user@jakarta.apache.org</a></p><p>The Lucene search engine: Powerful, flexible, and free<br /><a >http://www.javaworld.com/javaworld/jw-09-2000/jw-0915-Lucene_p.html</a></p><p>Lucene Tutorial<br /><a >http://www.darksleep.com/puff/lucene/lucene.html</a></p><p>Notes on distributed searching with Lucene<br /><a >http://home.clara.net/markharwood/lucene/</a></p><p>中文语言的切分词<br /><a >http://www.google.com/search?sourceid=navclient&hl=zh-CN&q=chinese+word+segment</a></p><p>搜烦引擎工具介绍<a ><br />http://searchtools.com/</a></p><p>Lucene作者Cutting的几论文和专利<br /><a >http://lucene.sourceforge.net/publications.html</a> </p><p>Lucene?NET实现QdotLucene<br /><a >http://sourceforge.net/projects/dotlucene/<br /></a></p><p>Lucene作者Cutting的另外一个项目:ZJava的搜索引擎Nutch<br /><a >http://www.nutch.org/</a>   <a >http://sourceforge.net/projects/nutch/<br /></a></p><p>关于Z词表和N-Gram的切分词比较<br /><a >http://china.nikkeibp.co.jp/cgi-bin/china/news/int/int200302100112.html</a><br /><br />2005-01-08 <a >Cutting在Pisa大学做的关于Lucene的讲座:非常详细的Lucene架构解说</a></p><p>特别感谢Q?br /><a >前网易CTO许良?Jack Xu)</a>l我的指|是?zhn)我带入了搜索引擎这个行业?/p>原文出处Q?lt;a>http://www.chedong.com/tech/lucene.html</a><br /><br />from: <img src ="http://www.aygfsteel.com/weidagang2046/aggbug/87684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/weidagang2046/" target="_blank">weidagang2046</a> 2006-12-14 13:05 <a href="http://www.aygfsteel.com/weidagang2046/articles/87684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Similarity Flooding http://www.aygfsteel.com/weidagang2046/articles/81825.htmlweidagang2046weidagang2046Fri, 17 Nov 2006 10:25:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/81825.htmlhttp://www.aygfsteel.com/weidagang2046/comments/81825.htmlhttp://www.aygfsteel.com/weidagang2046/articles/81825.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/81825.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/81825.html法大致思\Q?br />        把要匚w的模型{换ؓ带标记的有向图(directed labeled graphs。由节点和弧l成的图Q允许对象用自n的属性及其和其他对象的关pL定义Q类gER图)。这些图要用来做q代的不动点计算Q计结果将告诉我们一张图里的哪些节点和第二张囄节点怼?br />        Z计算怼度,我们利用了这样一个直觉:两个不同的节Ҏ(gu)怼的,当它们邻接元素是怼的。换句话_两个元素怼性的一部分传播l了它们各自的邻居,q种传播方式cM于IPq播Q这也是SFq个名字的由来。我们把法的结果叫做一个 mappingQ然后根据匹配目标,选择特定的过滤器来过滤出一个原始结果的子集。我们希望能够h工对l果q行修正Q需要修正的成员数目反映了法的准性?br />
概述Q?br />
        假设?个schemaQS1和S2。我们要为S1里每一个元素在S2中找到匹配的元素?br />      q程如下Q?br />      1. G1 = SQL2Graph(S1); G2 = SQL2Graph(S2);  把schema变成图,N用了Open Information Model (OIM)规格Q图中node采用矩Ş和卵形,矩Ş是文字描qͼ卵Ş是标识符

      2. initialMap = StringMatch(G1, G2);      用字W串匚w做ؓ初始匚wQ主要是比较通常的前~和后~Q这L(fng)l果通常是不准确?br />
      3. product = SFJoin(G1, G2, initialMap);      用SF法生成l果?font color="#0000ff">假设两个不同的节Ҏ(gu)怼的,则它们邻接元素的怼度增加。经q一pd的P代,q种怼度会传遍整个?br />
      4. result = SelectThreshold(product);   l果{?br />

SF法

      图中的每条边Q用一个三元组表示QsQpQoQ,分别?源点Q边名,目的炏V?br />
δ2.JPG
      怼度传播图Q首先定义pairwise connectivity graph(PCG) Q?((x; y); p; (x'; y')) 属于 PCG(A;B)<==>(x; p; x') ?A and (y; p; y') ?B?关键是p要相同,也就是边的名字一栗?/font>式子从右向左推导Q就可以A、B从两个模型徏立v它们的PCG?/font>图中的每个节点,都是A和B中的元素构成?元组Q叫做map pairs?br />      induced propagation graph。从PCG推导而来Q加上了反向的边Q边上注明了[传播pL]Qgؓ 1/nQn为相应的边的数目?br />      不动点计:
            设?x; y) > 0 代表了节点x ?A ?y ?B 的相似度Q是在整个 A X B的范围上定义的。我们把 Q(mo) 叫做 mapping。相似度的计就是基于?values的P代计。设 Q(mo)i 代表了第 i ơP代后的结果,Q(mo)0 是初始相似度Q可以用字符串相似度的办法的得出Q在我们的例子里Q没?Q(mo)0 Q即?Q(mo)0 =1Q?br />            每次q代中,Q(mo)-values 都会Ҏ(gu)光居paris?Q(mo)-values  乘以[传播pL] 来增加。例如,在第一ơP?Q(mo)1(a1; b1) = Q(mo)0(a1; b1) + Q(mo)0(a; b) * 0.5 = 1.5。类似的Q?sup>1(a, b) = Q(mo)0(a, b) + Q(mo)0(a1; b1) * 1.0 + Q(mo)0(a2, b1) *1.0 = 3.0。接下来Q所?Q(mo) D行正规化Q比如除以当前P代的 Q(mo)的最大|保证所?Q(mo) 都不大于1。所以在正规化以后,Q(mo)1(a; b) = 1.0, Q(mo)1(a1, b1) = 1.5/3.0 = 0.5。一般情况下QP代如下进行:

未命?.JPG

δ3.JPG
      上面的计进行P代,直到 Q(mo)n ?Q(mo)n-1之间的差别小于一个阈|如果计算没有聚合Q我们就在P代超q一定次数后停止。上?的第三副图,是5ơP代后的结果。表3时一些计方法,后面的实验表明,C比较好。A叫做 sparceQB叫做 exceptedQC叫做verbose


qo

      q代出的l果是一U[多匹配]Q可能包含有用的匚w子集?br />      三个步骤Q?br />            1。用E序定义的[限制条g]q行qo?br />            2。用双向图中的匹配上下文技术进行过?br />            3。比较各U技术的有效性(满用户需求的能力Q?br />      限制Q主要有两种Q一个是[cd]限制Q比如只考虑[列]的匹配(匚w双方都是列)。第二个?cardinality 限制Q即模式S1中的所有元素都要在S2中有一个映?br />
stable marriage问题Qn奛_n男配对,不存在这L(fng)两对 (x; y)?x0; y0)Q其中x喜欢 y0 胜过 yQ而且 y0 喜欢 x 胜过 x0。具有stable marriage的匹配结果的total satisfaction可能会比不具有stable marriage的匹配结果还低!

匚w质量的评?br />
   基本的评估思想Q就是?用户对匹配结果做的修改越,匚w质量p高(修改l果包括L错误的pairQ加上正的pairQ?br />未命?.JPG  n是找到的匚w敎ͼm是理想的匚w敎ͼc是用户作Z正的数目?br />
from: http://www.cnblogs.com/anf/archive/2006/08/15/477700.html



weidagang2046 2006-11-17 18:25 发表评论
]]>
用Java实现HTTP文g队列下蝲http://www.aygfsteel.com/weidagang2046/articles/81696.htmlweidagang2046weidagang2046Fri, 17 Nov 2006 02:26:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/81696.htmlhttp://www.aygfsteel.com/weidagang2046/comments/81696.htmlhttp://www.aygfsteel.com/weidagang2046/articles/81696.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/81696.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/81696.html 序言

  许多用户可能会遇到这L(fng)情况Q在|站上发C个很好的资源Q但是这个资源是分成了很多个文g存放的,如果x它保存到本地Q只有靠用户点击另存来完成保存,如果资源分了几百甚至上千上万Q那直是个灾难?

  在Internet上很多的资源分成多个文g存放Ӟ它的文g命名是有一定的规则的;正因如此Q我们就可以用程序来完成q个资源的完全下载?br />
  1. 基础知识

  在Internet上,我们要下载网站上的某个资源,我们会获得一个URLQUniform Resource LocatorQ,它是一个服务器资源定位的描qͼ下蝲的过EL如下步骤:

  步骤1:客户端发赯接请求一个URL

  步骤2:服务器解析URLQƈ指定的资源q回一个输入流l客?

  步骤3:客户端接收输入流Q将中的内容存到文?

  2. |络q接的徏?/strong>

  Java提供了对URL讉K和大量的操作的的APIQ我们可以很Ҏ(gu)的完成对|络上资源的存取,下面的代码段完成了对一个网站的资源q行讉K:

......
destUrl="http://www.ebook.com/java/|络~程001.zip";
url = new URL(destUrl);
httpUrl = (HttpURLConnection) url.openConnection();
//q接指定的网l资?br />httpUrl.connect();
//获取|络输入?br />bis = new BufferedInputStream(httpUrl.getInputStream());
......

  3. 代理的访?/strong>

  Java 中通过代理服务器访问外|的Ҏ(gu)已经是世人皆知的U密了。这里就不再多描qCQ访问的JAVA代码如下:

//讄代理服务?br />System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost", "10.154.134.110");
System.getProperties().put("proxyPort", "8080");

  4. |络资源的保?/strong>

  在上节中Q我们已l获取了指定|络资源的输入流Q接下来我们要完成的是d输入中的所以内容,q将其保存在文g中。示例代?

......
fos = new FileOutputStream(fileName);
if (this.DEBUG)
System.out.println("正在获取链接[" + destUrl + "]的内?..\n其保存为文件[" + fileName +"]");

//保存文g
while ( (size = bis.read(buf)) != -1)
fos.write(buf, 0, size);
......

  上面的示例代码就网l资源的内容保存C本地指定的文件中?br />
  5. 代码清单

import java.io.*;
import java.net.*;
import java.util.*;

/**
* QpQTitle: 个h开发的APIQ?pQ?br />* QpQDescription: 指定的HTTP|络资源在本C文g形式存放Q?pQ?br />* QpQCopyright: Copyright (c) 2004Q?pQ?br />* QpQCompany: NewSkyQ?pQ?br />* @author MagicLiao
* @version 1.0
*/
public class HttpGet {

  public final static boolean DEBUG = true;//调试?br />  private static int BUFFER_SIZE = 8096;//~冲区大?br />  private Vector vDownLoad = new Vector();//URL列表
  private Vector vFileList = new Vector();//下蝲后的保存文g名列?br />
  /**
  * 构造方?br />  */
  public HttpGet() {}

  /**
  * 清除下蝲列表
  */
  public void resetList() {
   vDownLoad.clear();
   vFileList.clear();
  }

  /**
  * 增加下蝲列表?br />  *
  * @param url String
  * @param filename String
  */

public void addItem(String url, String filename) {
  vDownLoad.add(url);
  vFileList.add(filename);
}

  /**
  * Ҏ(gu)列表下蝲资源
  */
public void downLoadByList() {
  String url = null;
  String filename = null;

  //按列表顺序保存资?br />  for (int i = 0; i Q?vDownLoad.size(); i++) {
   url = (String) vDownLoad.get(i);
   filename = (String) vFileList.get(i);

   try {
    saveToFile(url, filename);
   }
   catch (IOException err) {
    if (DEBUG) {
     System.out.println("资源[" + url + "]下蝲p|!!!");
    }
   }
  }

  if (DEBUG) {
   System.out.println("下蝲完成!!!");
  }
}

/**
* HTTP资源另存为文?br />*
* @param destUrl String
* @param fileName String
* @throws Exception
*/
public void saveToFile(String destUrl, String fileName) throws IOException {
  FileOutputStream fos = null;
  BufferedInputStream bis = null;
  HttpURLConnection httpUrl = null;
  URL url = null;
  byte[] buf = new byte[BUFFER_SIZE];
  int size = 0;

  //建立链接
  url = new URL(destUrl);
  httpUrl = (HttpURLConnection) url.openConnection();
  //q接指定的资?br />  httpUrl.connect();
  //获取|络输入?br />  bis = new BufferedInputStream(httpUrl.getInputStream());
  //建立文g
  fos = new FileOutputStream(fileName);

  if (this.DEBUG)
   System.out.println("正在获取链接[" + destUrl + "]的内?..\n其保存为文件[" + fileName + "]");

  //保存文g
  while ( (size = bis.read(buf)) != -1)
   fos.write(buf, 0, size);

  fos.close();
  bis.close();
  httpUrl.disconnect();
}

/**
* 讄代理服务?br />*
* @param proxy String
* @param proxyPort String
*/
public void setProxyServer(String proxy, String proxyPort) {
  //讄代理服务?
  System.getProperties().put("proxySet", "true");
  System.getProperties().put("proxyHost", proxy);
  System.getProperties().put("proxyPort", proxyPort);
}

/**
* 讄认证用户名与密码
*
* @param uid String
* @param pwd String
*/
public void setAuthenticator(String uid, String pwd) {
Authenticator.setDefault(new MyAuthenticator(uid, pwd));
}

/**
* L?用于试)
*
* @param argv String[]
*/
public static void main(String argv[]) {
  HttpGet oInstance = new HttpGet();
  try {
   //增加下蝲列表Q此处用户可以写入自׃码来增加下蝲列表Q?br />   oInstance.addItem("http://www.ebook.com/java/|络~程001.zip","./|络~程1.zip");
   oInstance.addItem("http://www.ebook.com/java/|络~程002.zip","./|络~程2.zip");
   oInstance.addItem("http://www.ebook.com/java/|络~程003.zip","./|络~程3.zip");
   oInstance.addItem("http://www.ebook.com/java/|络~程004.zip","./|络~程4.zip");
   oInstance.addItem("http://www.ebook.com/java/|络~程005.zip","./|络~程5.zip");
   oInstance.addItem("http://www.ebook.com/java/|络~程006.zip","./|络~程6.zip");
   oInstance.addItem("http://www.ebook.com/java/|络~程007.zip","./|络~程7.zip");
   //开始下?br />   oInstance.downLoadByList();
  }
  catch (Exception err) {
   System.out.println(err.getMessage());
  }
}
}

from: http://www.1-100.org/other/11548.htm


weidagang2046 2006-11-17 10:26 发表评论
]]>ZLinux的搜索引擎实?http://www.aygfsteel.com/weidagang2046/articles/81673.htmlweidagang2046weidagang2046Fri, 17 Nov 2006 01:35:00 GMThttp://www.aygfsteel.com/weidagang2046/articles/81673.htmlhttp://www.aygfsteel.com/weidagang2046/comments/81673.htmlhttp://www.aygfsteel.com/weidagang2046/articles/81673.html#Feedback0http://www.aygfsteel.com/weidagang2046/comments/commentRss/81673.htmlhttp://www.aygfsteel.com/weidagang2046/services/trackbacks/81673.html搜烦引擎的基本组成一般分为网|集程序、网后端数据组l存储、网|据检索三部分。决定搜索引擎好坏的关键因素是数据查询的响应旉Q即如何l织好满_文检索需要的大量|页数据。?br />GNU/Linux作ؓ一个优U的网l操作系l,其发行版本中集成了大量的|络应用软gQ如 Web服务器(Apache Q?PHPQ、目录服务器QOpenLDAPQ、脚本语aQPerlQ、网|集程序(WgetQ等。所以,通过它们集中进行应用,便可以实C个简单、高效的搜烦引擎服务器。?br />一、基本组成和使用Ҏ(gu) 
1、网|据收集?br />WgetE序是一个优U的网|集程序,它采用多U程设计能够方便地将|站内容镜像到本地目录中Qƈ且能够灵zd制收集网늚cd、递归攉层次、目录限额、收集时间等。通过专用的收集程序完成网늚攉工作Q既降低了设计的隑ֺ又提高了pȝ的性能。ؓ了减本地数据的规模Q可只收集能够查询的html文g、txt文g、脚本程序asp和php只用缺省的l果Q而不攉如图形文件或是其他的数据文g。?br />2、网|据过滤?br />׃html文g中存在大量的标记Q如<body><table>{,q些标记数据没有实际的搜索h(hun)|所以加入数据库前必d攉的数据进行过滤。Perl作ؓq泛使用的脚本语aQ拥有非常强大而丰富的E序库,可以方便地完成网늚qo。通过使用HTML-Parser库可以方便地提取出网中包含的文字数据、标题数据、链接数据等。该E序库可以在www.cpan.net中下载,q且该网站收集的PerlE序涉及范围之广Q远q超出我们的现象。?br />3、目录服务?br />目录服务是针对大量数据检索需要开发的服务Q最早出现在X.500协议集中Q后来扩展到TCP/IP中发展成为LDAPQLightweight Directory Acess ProtocolQ协议,其相关的标准?995q制定的RFC1777?997q制定的RFC2251{。LDAP协议已经作ؓ工业标准被Sun、Lotus、微软等公司q泛应用到其相关产品中,但是专用的基于Windowsq_的目录服务器却较?yu)见QOpenLDAP是免费的q行于Unixpȝ的目录服务器Q其产品的性能优秀Q已l被许多的Linux发行版本攉QRedhat、Mandrake{)Qƈ且提供了包括C、Perl、PHP{的开发接口。?br />使用目录服务技术代替普通的关系数据库作为网|据的后端存取q_主要Z目录服务的技术优ѝ目录服务简化了数据处理cdQ去掉了通用关系数据库的Ҏ(gu)的事务机Ӟ而是采用全局替换的策略对数据q行更新Q其应用的重Ҏ(gu)大量数据的检索服务(一般数据更新和索的频率比例要求?:10以上Q,索速度和全文查询,提供完整的数据备份,非常适合搜烦引擎之类服务的需要。从目录服务技术解决问题的重点不难看出其在数据索上的优势,它的提出旉q远落后于关pL据库的提出时_实际上反映了Ҏ(gu)具体问题优化数据解决Ҏ(gu)的原则。这与目前广泛存在的凡是涉及大量数据处理必选SQL Server的处理方法Ş成鲜明对比。?br />通过选用成熟的目录服务技术提高网|询的效率Q能够简z有效地提高数据处理能力。这也充分显CZGNU/Linuxpȝq行开放Y件的优势Q毕竟不能方便地获得q行于其他^台的目录服务器。?br />4、查询程序设计?br />搜烦引擎的前端界面是|页Q用户通过在特定的|页中输入关键字提交lWeb服务器进行处理。运行在Apache Web服务器上的PHP脚本通过q行其相关ldap函数便可以执行关键字的查询工作。主要进行的工作是根据关键字构造查询、向目录服务器提交查询、显C查询结果等。Linux + Apache + PHP作ؓq泛使用Web服务器,与WinNT + IIS + ASP相比其性能毫不逊色Q在目前的Linux发行版本中都集成了Apache + PHP 以及~省的ldap、pgsql、imap{模块。?br />5、计划Q务?br />搜烦引擎的网|据收集、数据过滤、加入目录数据库{工作都应该是自动完成的Q在UNIXpȝ中有cronq程来专门完成按照特定时间调度Q务,Z不媄响系l的q行Q一般可以把q些工作安排到深夜进行。?br />二、具体步骤和注意事项 
1、配|Wget软g 
在RedHat 6.2发行版中已经集成了该软g包,可以直接q行安装。将需要镜像的站点地址~辑Z个文件中Q通过 -I 参数d该文Ӟ为镜像的站点指定一个本C载目录;Z避免内部|中链接的重复引用,一般只镜像该站点内的数据;q可以根据网站的具体情况Q指定其镜像的深度。?br />2、配|Openldap服务 
在RedHat 6.2发行版中已经集成了Openldap-1.2.9Q其配置文g存放?etc/openldap的目录中。主要的配置文g是slapd.confQ关键要打开Ҏ(gu)索速度臛_重要的index选项Q可以用setup工具Q将ldap在系l引导后作ؓ~省服务启动。?br />Ldap服务可以通过文本文g方式存放数据Q即LDIF文g格式。用此方式可以高效地更新目录服务数据,需要注意LDIF格式是通过IҎ(gu)据进行分隔的Qƈ且通过q行ldif2lbmLDIF格式数据导入目录数据库中旉要暂停目录服务。?br />3、编制数据过滤和LDIF文g生成脚本 
Z方便地过滤网|据,可以调用Perl的HTML-Parser库函敎ͼ该程序包下蝲后需要进行编译,在eg目录下生成了相关的htextQhtitleE序Q在Perl中可以通过调用外部E序的方式运行该E序Qƈ对其qol果通过重定向的Ҏ(gu)生成临时文g。本搜烦引擎设计的目录数据属性有dn 、link、title、modifydate、contentsQ其中的dn通过Linkq行唯一性标识,过滤后的网|本内定w过/usr/sbin/ldifE序q行自动~码后放入LDIF文g中。?br />基本的LDIF文g格式如下Q?br />dn: dc=27jd,dc=zzb 
objectclass: top 
objectclass: organization 
?br />dn: link= http://freemail.27jd.zzh/index.html, dc=27jd ,dc=zzb 
link: http://freemail.27jd.zzh/index.html 
title: Webmail主页 
modifydate: 2001q??日?br />contents:: 
CgpXZWJtYWls1vfSswoKCgoKIKHvoaG7ttOtyrnTw1dlYm1haWzPtc2zoaGh7yDO0t 
KqyerH69PKz+QhISFPdXRsb29rxeTWw6O6U01UUDogZnJlZW1haWwuMjdqZC56emJQ 
T1AzOiBmcm 
VlbWFpbC4yN2pkLnp6YkROUyA6IDExLjk5LjY0Ljiy4srU08O7p6O6bWFpbGd1ZXN00 
8O7p7/awe 
6jum1haWxndWVzdNLR16Ky4dPDu6cg08O7p8P7OkAgZnJlZW1haWwuMjdqZC56emK/ 
2sHuOqChoa 
AgIKHyzOG5qbf+zvEgofKzo7z7zsrM4iCh8s2o0bbCvKHyICCh8sq1z9bUrcDtIKHywfTR1 
LK+of 
IgofK8vMr1sr/W99Kzsb7Ptc2z08nK1NHpvLzK9bK/zfjC59bQ0MS9qMGius3OrLukCgoK 
CqAKCg 
o= 
objectclass:webpage 
?br />基本的slapd.conf文g如下Q?br />defaultaccess read 
include /etc/openldap/slapd.at.conf 
#include /etc/openldap/slapd.oc.conf 
schemacheck off 
sizelimit 20000 
pidfile /var/run/slapd.pid 
argsfile /var/run/slapd.args 
####################################################################### 
# ldbm database definitions 
####################################################################### 
database ldbm 
dbcachesize 1000000 
index contents,title 
suffix "dc=27jd, dc=zzb" 
directory /usr/tmp 
rootdn "cn=root,dc=27jd, dc=zzb" 
rootpw secret 
?br />通过对一?万个|页Q约300M左右Q的本地html文g目录q行qo后生成的LDIF文gU?80M左右Q如果只取文字数据的?00个字W作为网内容,则生成文件约35M左右。?br />4、配|PHP+LDAP服务 
在Redhat6.2中已l集成了PHP3和php-ldap模块Q选择完全安装时便已经安装?usr/lib/apache目录中,注意?etc/httpd/php3.ini中的动态扩展(Dynamic ExtensionsQ中的extension=ldap.so是否被选择。PHP3中提供了丰富的LDAP存取函数Q能够方便完成对目录数据的搜索功能。有关Apach + PHP~程斚w的资料较多,在此不在赘述。注意在PHP3中的LDAP搜烦函数l(f)dap_search不能处理其返回结果超q目录服务设定的最大检索数据,所以可以根据具体情况,在slapd的配|文件中讑֮较大的检索数据限?sizelimit)Q此问题在PHP4中已l解冟뀂?br />5、Q务调度?br />在Redhat6.2中已l集成了crondq且~省安装后便已经启动。其相关配置文g?etc/crontab?etc/cron.daily?etc/cron.hourly?etc/weekly?etc/monthlyQ你只需要根据数据的更新频度Q将|页攉、网过滤、生成LDIF文g、停止目录服务、更新目录数据、重新启动目录服务,作ؓ一个简单的ShellE序攑օ到相应的目录中即可。?br />三、效果与思考?br />以上单的介绍了我们的搜烦引擎的实现方法和注意事项Q这仅仅是我们在对GNU/Linux了解得非常肤的情况下设计的以目录服务ؓ核心的满_部网需要的搜烦引擎pȝQƈ不能代表GNU/Linux和它集成的大量Y件的真正实力。?br />通过在一台安装RedHat Linux 6.2 的Sparc Ultra 250上实际测试,Ҏ(gu)?万个|页的目录数据进行搜索时Q基于上q方法设计的搜烦引擎响应速度一般在3U左叻I目录数据完全更新大约需?时左右Q能够满_部网的需要。实际上Q限制搜索响应速度的关键是PHP3的ldap_search函数没有提供数据限制的功能,D在查询结果集q大时系l响应速度变慢Q因为每ơ用戯够浏览的查询l果实际是非常少的,而服务器端每ơ的查询Lq回全部l果Q在PHP4中的ldap_search通过指定sizelimit参数Q能够有效解册问题。?br />目录服务的应用范围非常广泛,实际上作为大型的信息站点Z提高客户讉K效率Q都或多或少采用了目录服务的技术。目录服务根据具体的应用需求的优化设计Ҏ(gu)Q对我们军_应用pȝ的开发无疑是一个启发,应该说在Z索引信息的领域LDAP服务q远优于传统的关pL据库pȝ。?br />ZGNU/Linuxq行|络服务器程序设计,能够充分体会到开放源代码的魅力和实力Q它既能够简化系l的设计Q又大大地提高了工作效率Q同时也有效降低了系l的成本。程序设计由一切从零开始的复杂J琐的重复劳动,化ؓ问题抽象、功能分解、查找资源、组合系l四个部分,更加对系l的认识、开阔的视野和学?fn)的能力Q同时开放源代码也ؓpȝq一步优化提供了坚实的基。?br />

weidagang2046 2006-11-17 09:35 发表评论
]]>
վ֩ģ壺 ʲ| ˮ| | ӻ| Ͼ| | ͨ| ƽ| ɽ| ʦ| | ɽʡ| Ρɽ| | ¹Ȫ| ء| ɽ| | ƽ| ҽ| ո| ˳| | ʦ| ʡ| ǭ| | | | ޵| °| ³| | ɽ| ͼľ| ٳ| ̶| ¡| | Ϫ| |