<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>郑州网建 - 搜索引擎</title><link>http://camnpr.com/</link><description>Good Good Study ,Day Day Up! - </description><generator>RainbowSoft Studio Z-Blog 1.8 Walle Build 100427</generator><language>zh-CN</language><copyright>豫ICP备10013645号 Copyright 2009-2022 camnpr.com</copyright><pubDate>Mon, 09 Mar 2026 01:55:21 +0800</pubDate><item><title>Google广告营销利器：Tag Manager管理Google动态再营销</title><author>bubuol@126.com (llmaomi)</author><link>http://camnpr.com/search/2119.html</link><pubDate>Tue, 08 Sep 2015 10:55:55 +0800</pubDate><guid>http://camnpr.com/search/2119.html</guid><description><![CDATA[<div id="noimgcss"><p>记录设置Google动态再营销（Dynamic remarketing）时的一些思路，以及如何通过Google Tag Manager管理Google动态再营销代码，获取动态再营销中的自定义参数。下面先来简单说明下什么是Google的动态再营销。</p><p><img title="Google_Remarketing1" src="http://camnpr.com/upload/2015/8/201508271938091826.jpg" alt="Google广告营销利器：Tag Manager" width="580" height="250" /></p><h1>1，Google动态再营销的工作原理</h1><p>Google动态再营销的功能是将曾经访问过你网站的访问者，通过Goolge的展示广告或关键词广告，再次吸引到你的网站中，并促进访问者完成转化或购买。</p><p><img title="Google广告营销利器：Tag Manager" src="http://camnpr.com/upload/2015/8/remarketing_proceso_en_foto3.png" alt="Google广告营销利器：Tag Manager" width="560" height="198" /></p><p>在这个过程中，Google动态再营销的价值并不在于能将曾经来访的访客再次吸引回网站，而在于他能促进这些访问者完成转化或购买。要实现这个价值，最关键的因素是要让Google认识你网站的访问者。这里的认识有两层含义，第一层含义是要让Google能够识别出哪些是曾经访问过你网站的访问者。这比较简单，只要我们在网站中实施了Google的再营销代码就可以实现。Google会对网站的访问者植入一个身份识别Cookie，并在访问者再次浏览Google广告时使用Cookie ID进行身份识别。认识的第二层含义是要让Google了解这些访问者的行为癖好。注意，这里我们使用了&ldquo;行为癖好&rdquo;这个词，而不是&ldquo;兴趣爱好&rdquo;。这就好像是一种介于普通朋友与亲密关系之间的认识程度。你懂得。</p><p>Google动态再营销并不能自动完成第二层含义的认识。这里需要有一个人来帮助Google真正的认识网站的访问者，理解他们的行为癖好。而这个人就是你，和你手里的两个强大的武器：你的网站和Google动态再营销的标签(Tag)。要深入的认识一个人，了解他们的想法和目的有两个方法。第一个方法是直接问他。这种方法简单且直接，但对于网站中的海量用户来说并不实际。还有一个问题就是通过直接询问获得的答案未必准确。第二个方法就是观察并记录这个人的行为。对于访问网站的访问者来说就是他浏览网站的行为。例如，这个人浏览了网站中哪些类型和内容的页面，搜索了哪些关键词等等。通过这些行为轨迹我们可以推测出网站访问者的想法和目的，进而认识这个人的行为和癖好。</p><p>当然，你还需要将这个人的行为和癖好告诉Google，让Google动态再营销可以更深入的认识你网站中的访问者。具体的方法就是按照访问者在网站中的行为对他们打标签。例如，你可以将浏览过体育频道页面的访问者标记为&ldquo;体育爱好者&rdquo;，把浏览过降价促销页面的访问者标记为&ldquo;价格敏感型用户&rdquo;，把只看了首页就离开的访问者标记为&ldquo;随便看看的用户&rdquo;等等。这里我们只是举了几个非常简单的例子，在实际的操作中要复杂的多。现实的情况是访问者在一次访问中可能会同时浏览多个页面或内容，同时也会反复的浏览不同类型的页面。这种情况该如何给用户打标签呢？后面我们也会介绍对用户打标签之前的准备工作和需要遵守的规则。</p><p><img title="tag people" src="http://camnpr.com/upload/2015/8/tag-hr.jpg" alt="" width="600" height="355" /></p><p>现在，我们可以说Google真正认识网站的访问者了，在用户浏览Google展示广告或搜索关键词广告时，Google不仅知道这个用户之前是否访问过你的网站，还知道他浏览过哪些内容以及这个用户的标签信息。每一个用户看起来都像是由不同标签组成的用户画像。</p><h1>2，对访问者打标签之前的准备工作</h1><p>在前面介绍的过程中，最关键的步骤就是让Google动态再营销能够真正认识网站中的访问者。也就是我们通过访问者在网站中的行为对用户进行打标签的过程。这个过程说起来简单，但在实际的操作中，由于网站结构的复杂性以及访问者访问路径的多样性而变的非常复杂。因此，在实际进行这项工作之前，我们需要先进行一些准备工作。</p><p>前面我们说过，对网站访问者打标签是一种通过访问者行为推断意图和访问目的的方法。因此，在对访问者打标签之前，我们首先要了解网站的架构和不同功能模块的使用流程及逻辑，以及内容的分类方式和层级。这么做主要是为了方便我们对网站内容和用户行为进行分类。</p><p>我们对网站进行两个维度的分类，分别是内容维度和任务维度。内容维度用来对网站中的内容和不同功能进行分类。任务维度则用来对用户从感兴趣到最终完成网站目标的行为进行分类，这非常类似于我们常见的访客转化漏斗。</p><p>对于新闻资讯类的网站来说，内容维度的分类可能会包括体育新闻，娱乐新闻，财经新闻，科技新闻，房产新闻等等。而对于体育新闻可能还会包含更细一级的分类，例如英超资讯，NBA资讯等等的子内容维度。而从任务维度的分类则可能会包括新闻资讯浏览，发表评论，完成注册，订阅新闻等等。</p><p>对于电商类网站来说，内容维度的分类可能是商品的品类，例如：家用电器，手机数码，服饰内衣等等。而对于家用电器可能还会包含二级品类的子分类，例如生活家电，厨房家电，个人护理等等的子内容维度。从任务维度的分类可能包括品类浏览，商品筛选或搜索，浏览商品详情，加入购物车以及购买等。<br />在完成了对网站内容及访问者行为进行分类的准备工作以后，我们来回答之前的问题，对于访问者在网站中复杂多变的访问轨迹，我们可能会对同一个访问者标记很多属性，例如不同的内容分类标签和不同的任务分类标签。那么该如何对用户进行分类呢？下面我们来说明Google动态再营销对用户列表的分类规则。</p><h1>3，Google动态再营销的访问者分类原则</h1><p>当我们在adwords中设置完动态再营销的广告系列后，Google会为我们自动创建5个访问者列表分类。他们分别是所有访问者，一般访问者，查看产品的访问者，放弃购物车的访问者，和过去的购买者。除去所有访问者以外，我们可以通过查看另外四个访问者的分类规则发现，他们都是按任务维度创建的访问者列表，只记录了用户在任务分类中最后一层的任务分类标签，及最后一个页面的标签。并且各个列表间的用户并不重叠。</p><ul>    <li>一般访问者：访问过网站但未曾查看具体产品的用户</li>    <li>查看产品的访问者：在网站上查看过具体的产品页面但未将产品添加到购物车的用户</li>    <li>放弃购物车的访问者：曾将产品添加到购物车中但未完成交易的用户</li>    <li>过去的购买者 ：30天内在网站中购买过产品的用户</li></ul><p><img title="访问者任务分类规则" src="http://camnpr.com/upload/2015/8/%E8%AE%BF%E9%97%AE%E8%80%85%E4%BB%BB%E5%8A%A1%E5%88%86%E7%B1%BB%E8%A7%84%E5%88%99.png" alt="" width="700" height="224" /></p><p>对于内容维度Google动态再营销会记录访问者浏览的所有页面标签，例如前面的放弃购物车访问者，在任务维度的用户列表中只会记录他最后访问的页面所属于的任务维度分类。而在内容维度用户列表中，则会分别记录首页，商品详情页及购物车页的内容标签。在Google动态再营销的管理后台会提供按内容维度筛选用户的高级细分功能。</p><p><img title="再营销后台用户细分界面" src="http://camnpr.com/upload/2015/8/%E5%86%8D%E8%90%A5%E9%94%80%E5%90%8E%E5%8F%B0%E7%94%A8%E6%88%B7%E7%BB%86%E5%88%86%E7%95%8C%E9%9D%A2.png" alt="" width="700" height="586" /><br />在这个界面中你可以按内容维度对用户进行筛选或细分操作。找出哪些复合广告投放要求的网站访问者。</p><h1>4，Google动态再营销网站代码实施</h1><p>前面用了很大篇幅来说明Google动态再营销的工作原理，以及实施动态再营销之前的准备工作。下面我们开始真正的代码实施过程。首先需要将你的Google Adwords账户与 Google Merchant Center 帐户进行关联，启用Google动态再营销功能。</p><p><img title="google merchant" src="http://camnpr.com/upload/2015/8/google-merchant.png" alt="" width="550" height="262" /></p><p>Google动态再营销的代码分为两个部分。第一部分是自定义参数部分，用来对访问者打标签，第二部分是再营销代码部分。</p><pre class="brush:js">&lt;script type=&quot;text/javascript&quot;&gt;<br />//此部分代码为Google动态再营销的自定义参数<br /> var google_tag_params = {<br /> ecomm_prodid: 'REPLACE_WITH_VALUE', <br /> ecomm_pagetype: 'REPLACE_WITH_VALUE', <br /> ecomm_totalvalue: 'REPLACE_WITH_VALUE'<br /> }; <br />&lt;/script&gt;<br /> &lt;script type=&quot;text/javascript&quot;&gt;<br />//此部分代码无需添加再页面中，可使用Tag Manager进行管理 <br />/* &lt;![CDATA[ */ <br />var google_conversion_id = XXXXXXXXXX; <br />var google_conversion_label = &quot;YYYYYYYYYY&quot;; <br />var google_custom_params = window.google_tag_params; <br />var google_remarketing_only = true;<br /> /* ]]&gt; */ <br />&lt;/script&gt;<br /> &lt;script type=&quot;text/javascript&quot; src=&quot;//www.googleadservices.com/pagead/conversion.js&quot;&gt; &lt;/script&gt;<br /> &lt;noscript&gt;<br /> &lt;div&gt;<br /> &lt;img height=&quot;1&quot; width=&quot;1&quot; alt=&quot;&quot; src=&quot;//googleads.g.doubleclick.net/pagead/viewthroughconversion/XXXXXXXXXX/?value=0&amp;amp;label=YYYYYYYYYY&amp;amp;guid=ON&amp;amp;script=0&quot;/&gt; <br />&lt;/div&gt;<br /> &lt;/noscript&gt;</pre><p>我们需要将第一部分自定义参数的代码添加到网站的所有页面中，并且按照不同的页面内容维度对自定义参数进行赋值。第二部分的再营销代码会包含在Google Tag Manager的代码容器中，不需要我们在页面中添加，后面我们会说明在GTM中的设置和操作过程。上面示例中的三个自定义参数Google的官方解释如下。</p><p><img title="自定义参数中的基本参数" src="http://camnpr.com/upload/2015/8/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8F%82%E6%95%B0%E4%B8%AD%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%8F%82%E6%95%B0.png" alt="" width="645" height="314" /><br />其中ecomm_pagetype为每个页面都添加并且设置值的自定义参数。同时这也是用来进行内容维度分类的重要参数。其他的自定义参数你可以按照实际的需求来自定义添加。例如，你可以将age定义为访问者的年龄，这里唯一的规则就是不能收集涉及用户个人隐私的信息，例如IP地址，手机号等等。以下是亭集势首页的自定义参数：</p><pre class="brush:js">prodid : '', // product's id<br />pname : '', // product's name<br />pcat : '', // product's category<br />pvalue : '', // price of each product in the cart<br />pmargin : '',//EF / 3.3 * 1.2<br />pagetype : 'home', // home, product, category, cart, purchase<br />language : 'en', //{en, fr, es, ....}<br />currency : 'USD', //<br />ordervalue : '', // filled with the order value[EF] after user purchases<br />usertype : 'unregistered',//registered, unregisteredgender : '', // user's <br />gender( male, female) - available after login</pre><p>本文的主题是通过Tag Manager来管理Google动态再营销。因此，我们再对页面设置好自定义参数对访问者打标签以后，还需要将这些标签的值传递给Google。这里我们就要用到Google Tag Manager的数据层变量(dataLaye)。因此在你的网页中应该按以下顺序包含以下三类代码。</p><pre class="brush:js">&lt;script type=&quot;text/javascript&quot;&gt;// &lt;![CDATA[<br />var google_tag_params = {<br /> 	ecomm_pagetype: 'product', 	 //set the value<br />	ecomm_pcat: 'electronics',	 // product category<br />	ecomm_prodid: '123A', 	         // sku<br />	ecomm_pname: 'Bluewhale'	 // product name<br />};<br />// ]]&gt;&lt;/script&gt;<br />&lt;script type=&quot;text/javascript&quot;&gt;// &lt;![CDATA[<br />dataLayer = [{<br />  'google_tag_params': window.google_tag_params<br />}];<br />// ]]&gt;&lt;/script&gt;<br />Google Tag Manager 容器代码</pre><p>5，Tag Manager动态再营销设置</p><p>最后，我们完成在Google Tag Manager中的设置，让Google能够认识（对访问者设置Cookie并收集访问者的标签）网站的访问者。在这一步中我们需要进行三个设置。第一步是设置宏，第二步是向现有的Google Tag Manager代码容器添加Google再营销代码，第三步是设置再营销代码触发规则。<br />第一步，我们创建一个名为Google_tag_params的宏。并设定宏类型为数据层变量，从之前部署在页面中的标签代码中获取自定义参数的值。</p><p><img title="动态再营销的宏" src="http://camnpr.com/upload/2015/8/%E5%8A%A8%E6%80%81%E5%86%8D%E8%90%A5%E9%94%80%E7%9A%84%E5%AE%8F.png" alt="" width="700" height="533" /></p><p>第二步，向现有的Google Tag Manager容器中添加Google再营销的代码。在这一步中有单点需要注意：</p><ol>    <li>代码类型选择为AdWords再营销</li>    <li>需要从AdWords中获取再营销代码的转化ID，具体的转换ID位置在AdWords广告系列类别下的共享库菜单中。点击受众群体部分的查看，在查看代码详情中可以找到动态再营销代码以及转化ID。</li>    <li>在自定义参数中选择使用数据层，并使用之前设置的宏作为数据层变量。</li></ol><p><img title="动态再营销代码" src="http://camnpr.com/upload/2015/8/%E5%8A%A8%E6%80%81%E5%86%8D%E8%90%A5%E9%94%80%E4%BB%A3%E7%A0%81.png" alt="" width="700" height="569" /><br />第三步，是对AdWords代码设置触发规则。在规则中，你可以使用Google Tag Manager提供的所有页面规则，也可以以网站URL作为包含条件进行设置。另外，还需要设置一个内置的gtm.dom事件，以等待网页完全加载。避免代码提前被触发。</p><p><img title="动态再营销规则" src="http://camnpr.com/upload/2015/8/%E5%8A%A8%E6%80%81%E5%86%8D%E8%90%A5%E9%94%80%E8%A7%84%E5%88%99.png" alt="" width="579" height="512" /><br />完成以上三步后，使用Google Tag Manager管理Google动态再营销的工作的代码实施部分就已经完成了。要使Google动态再营销真正开始工作，并发挥价值。你还需要在AdWords中针对不同的内容维度和任务维度的访问者创建广告系列。</p></div>]]></description><category>搜索引擎</category><comments>http://camnpr.com/search/2119.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=2119</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=2119&amp;key=249d618f</trackback:ping></item><item><title>基于 lucene 的站内搜索 经验分享1</title><author>camnpr@163.com (camnpr)</author><link>http://camnpr.com/search/345.html</link><pubDate>Tue, 14 Jun 2011 11:55:53 +0800</pubDate><guid>http://camnpr.com/search/345.html</guid><description><![CDATA[<p>imobile 站内搜索 &mdash;&mdash; 基于 lucene 的站内搜索，阶段性成果介绍</p><p>关键词：准实时搜索，及时更新，快速重建，可配置，可监控，高性能</p><p>实现：分离读写，分离索引和存储，拆分大小库，新索引 reopen，新索引预热</p><p><a title="基于Lucene的站内搜索" href="http://www.slideshare.net/tangfl/lucene-1536149?type=powerpoint">基于Lucene的站内搜索</a></p><object height="355" width="425"><br/><param value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lucene-090604220650-phpapp02&amp;stripped_title=lucene-1536149" name="movie" /><param value="true" name="allowFullScreen" /><param value="always" name="allowScriptAccess" /><embed height="355" width="425" allowfullscreen="true" allowscriptaccess="always" type="application/x-shockwave-flash" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lucene-090604220650-phpapp02&amp;stripped_title=lucene-1536149"></embed></object>]]></description><category>搜索引擎</category><comments>http://camnpr.com/search/345.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=345</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=345&amp;key=02990889</trackback:ping></item><item><title>当前几个主要的Lucene中文分词器的比较</title><author>camnpr@163.com (camnpr)</author><link>http://camnpr.com/search/343.html</link><pubDate>Tue, 14 Jun 2011 11:00:53 +0800</pubDate><guid>http://camnpr.com/search/343.html</guid><description><![CDATA[<p><p>&nbsp;</p></p><p><strong>1. 基本介绍：</strong></p><p><a target="_blank" href="http://code.google.com/p/paoding/">paoding</a>&nbsp;：Lucene中文分词&ldquo;庖丁解牛&rdquo; Paoding Analysis<br /><a target="_blank" href="http://code.google.com/p/imdict-chinese-analyzer/">imdict</a>&nbsp;：imdict智能词典所采用的智能中文分词程序<br /><a target="_blank" href="http://code.google.com/p/mmseg4j/">mmseg4j</a>&nbsp;： 用 Chih-Hao Tsai 的&nbsp;<a href="http://technology.chtsai.org/mmseg/">MMSeg 算法</a>&nbsp;实现的中文分词器<br /><a target="_blank" href="http://code.google.com/p/ik-analyzer/">ik</a>&nbsp;：采用了特有的&ldquo;正向迭代最细粒度切分算法&ldquo;，多子处理器分析模式</p><p><strong>2. 开发者及开发活跃度：</strong></p><p><a target="_blank" href="http://code.google.com/p/paoding/">paoding</a>&nbsp;：<a href="http://code.google.com/u/qieqie.wang/">qieqie.wang</a>， google code 上最后一次代码提交：2008-06-12，svn 版本号 132<br /><a target="_blank" href="http://code.google.com/p/imdict-chinese-analyzer/">imdict</a>&nbsp;：<a href="http://code.google.com/p/imdict-chinese-analyzer/source/detail?r=2">XiaoPingGao</a>， 进入了 lucene contribute，lucene trunk 中 contrib/analyzers/smartcn/ 最后一次提交：2009-07-24，<br /><a target="_blank" href="http://code.google.com/p/mmseg4j/">mmseg4j</a>&nbsp;：<a href="http://code.google.com/u/chenlb2008/">chenlb2008</a>，google code 中 2009-08-03 （昨天），版本号 57，log为：mmseg4j-1.7 创建分支<br /><a target="_blank" href="http://code.google.com/p/ik-analyzer/">ik</a>&nbsp;：<a href="http://code.google.com/u/linliangyi2005/">linliangyi2005</a>，google code 中 2009-07-31，版本号 41</p><p><strong>3. 用户自定义词库：</strong></p><p><a target="_blank" href="http://code.google.com/p/paoding/">paoding</a>&nbsp;：支持不限制个数的用户自定义词库，纯文本格式，一行一词，使用后台线程检测词库的更新，自动编译更新过的词库到二进制版本，并加载<br /><a target="_blank" href="http://code.google.com/p/imdict-chinese-analyzer/">imdict</a>&nbsp;：暂时不支持用户自定义词库。但 原版&nbsp;<a title="中科院中文分词系统" target="_blank" href="http://ictclas.org/">ICTCLAS</a>&nbsp;支持。支持用户自定义 stop words<br /><a target="_blank" href="http://code.google.com/p/mmseg4j/">mmseg4j</a>&nbsp;：自带sogou词库，支持名为 wordsxxx.dic， utf8文本格式的用户自定义词库，一行一词。不支持自动检测。 -Dmmseg.dic.path<br /><a target="_blank" href="http://code.google.com/p/ik-analyzer/">ik</a>&nbsp;： 支持api级的用户词库加载，和配置级的词库文件指定，无 BOM 的 UTF-8 编码，rn 分割。不支持自动检测。</p><p><strong>4. 速度（基于官方介绍，非自己测试）</strong></p><p><a target="_blank" href="http://code.google.com/p/paoding/">paoding</a>&nbsp;：在PIII 1G内存个人机器上，<strong>1秒</strong>&nbsp;可准确分词&nbsp;<strong>100万</strong>&nbsp;汉字<br /><a target="_blank" href="http://code.google.com/p/imdict-chinese-analyzer/">imdict</a>&nbsp;：<strong>483.64&nbsp;</strong>(字节/秒)，<strong>259517</strong>(汉字/秒)<br /><a target="_blank" href="http://code.google.com/p/mmseg4j/">mmseg4j</a>&nbsp;： complex 1200kb/s左右, simple 1900kb/s左右<br /><a target="_blank" href="http://code.google.com/p/ik-analyzer/">ik</a>&nbsp;：具有50万字/秒的高速处理能力</p><p><strong>5. 算法和代码复杂度</strong></p><p><a target="_blank" href="http://code.google.com/p/paoding/">paoding</a>&nbsp;：svn src 目录一共1.3M，6个properties文件，48个java文件，6895 行。使用不用的 Knife 切不同类型的流，不算很复杂。<br /><a target="_blank" href="http://code.google.com/p/imdict-chinese-analyzer/">imdict</a>&nbsp;：词库 6.7M（这个词库是必须的），src 目录 152k，20个java文件，2399行。使用&nbsp;<a title="中科院中文分词系统" target="_blank" href="http://ictclas.org/">ICTCLAS</a>&nbsp;HHMM隐马尔科夫模型，&ldquo;利用大量语料库的训练来统计汉语词汇的词频和跳转概率，从而根据这些统计结果对整个汉语句子计算最似然(likelihood)的切分&rdquo;<br /><a target="_blank" href="http://code.google.com/p/mmseg4j/">mmseg4j</a>&nbsp;： svn src 目录一共 132k，23个java文件，2089行。<a href="http://technology.chtsai.org/mmseg/">MMSeg 算法</a>&nbsp;，有点复杂。<br /><a target="_blank" href="http://code.google.com/p/ik-analyzer/">ik</a>&nbsp;： svn src 目录一共6.6M(词典文件也在里面)，22个java文件，4217行。多子处理器分析，跟paoding类似，歧义分析算法还没有弄明白。</p><p><strong>6. 文档</strong></p><p><a target="_blank" href="http://code.google.com/p/paoding/">paoding</a>&nbsp;：几乎无。代码里有一些注释，但因为实现比较复杂，读代码还是有一些难度的。<br /><a target="_blank" href="http://code.google.com/p/imdict-chinese-analyzer/">imdict</a>&nbsp;： 几乎无。&nbsp;<a title="中科院中文分词系统" target="_blank" href="http://ictclas.org/">ICTCLAS</a>&nbsp;也没有详细的文档，HHMM隐马尔科夫模型的数学性太强，不太好理解。<br /><a target="_blank" href="http://code.google.com/p/mmseg4j/">mmseg4j</a>&nbsp;：&nbsp;<a href="http://technology.chtsai.org/mmseg/">MMSeg 算法</a>&nbsp;是英文的，但原理比较简单。实现也比较清晰。<br /><a target="_blank" href="http://code.google.com/p/ik-analyzer/">ik</a>&nbsp;： 有一个pdf使用手册，里面有使用示例和配置说明。</p><p><strong>7. 其它</strong></p><p><a target="_blank" href="http://code.google.com/p/paoding/">paoding</a>&nbsp;：引入隐喻，设计比较合理。search 1.0 版本就用的这个。主要优势在于原生支持词库更新检测。主要劣势为作者已经不更新甚至不维护了。<br /><a target="_blank" href="http://code.google.com/p/imdict-chinese-analyzer/">imdict</a>&nbsp;：进入了 lucene trunk，原版 ictclas 在各种评测中都有不错的表现，有坚实的理论基础，不是个人山寨。缺点为暂时不支持用户词库。<br /><a target="_blank" href="http://code.google.com/p/mmseg4j/">mmseg4j</a>&nbsp;： 在complex基础上实现了最多分词(max-word)，但是还不成熟，还有很多需要改进的地方。<br /><a target="_blank" href="http://code.google.com/p/ik-analyzer/">ik</a>&nbsp;：&nbsp; 针对Lucene全文检索优化的查询分析器IKQueryParser</p><p><strong>8. 结论</strong></p><p>个人觉得，可以在 mmseg4j 和 paoding 中选一个。关于这两个分词效果的对比，可以参考：</p><p><a title="mmseg4j与paoding分词效果比较" target="_blank" href="http://blog.chenlb.com/2009/04/mmseg4j-max-word-segment-compare-with-paoding-in-effect.html">http://blog.chenlb.com/2009/04/mmseg4j-max-word-segment-compare-with-paoding-in-effect.html</a></p><p>或者自己再包装一下，将 paoding 的词库更新检测做一个单独的模块实现，然后就可以在所有基于词库的分词算法之间无缝切换了。</p><p><strong>ps</strong>，对不同的 field 使用不同的分词器是一个可以考虑的方法。比如 tag 字段，就应该使用一个最简单的分词器，按空格分词就可以了。</p>]]></description><category>搜索引擎</category><comments>http://camnpr.com/search/343.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=343</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=343&amp;key=033b0e0f</trackback:ping></item><item><title>收集8个高质量图标的最佳搜索引擎</title><author>camnpr@163.com (camnpr)</author><link>http://camnpr.com/search/264.html</link><pubDate>Fri, 15 Apr 2011 09:36:14 +0800</pubDate><guid>http://camnpr.com/search/264.html</guid><description><![CDATA[<p><p>&nbsp;</p></p><p style="font-size: 14px; text-indent: 25px; line-height: 25px">对于每个网站开发者来说，设计是很重要的一部分。图标是设计中一个环节。你可以找到许多集合图标的网站。但很难找到免费的高质量图标。这是我在此分享一些免费的高质量图标搜索引擎的原因。你要访问这些引擎以找到高质量图标。如果你知道更多的网站，也请与我们分享！</p><p style="font-size: 14px; text-indent: 25px; line-height: 25px"><a target="_blank" rel="nofollow" style="color: rgb(1,95,182); text-decoration: none" href="http://camnpr.com/upload/2012/3/201203291509064108.jpg" /></p><p style="font-size: 14px; text-indent: 25px; line-height: 25px"><a target="_blank" rel="nofollow" style="color: rgb(1,95,182); text-decoration: none" href="http://camnpr.com/upload/2012/3/201203291509102853.jpg" /></p><p style="font-size: 14px; text-indent: 25px; line-height: 25px"><a target="_blank" rel="nofollow" style="color: rgb(1,95,182); text-decoration: none" href="http://camnpr.com/upload/2012/3/201203291509117280.jpg" /></p><p style="font-size: 14px; text-indent: 25px; line-height: 25px; text-align: left">&nbsp;</p><p style="font-size: 14px; text-indent: 25px; line-height: 25px"><a target="_blank" rel="nofollow" style="color: rgb(1,95,182); text-decoration: none" href="http://www.iconseeker.com/">IconSeeker</a></p><p style="font-size: 14px; text-indent: 25px; line-height: 25px; text-align: center"><img alt="" border="0" style="border-top-width: 0px; display: block; border-left-width: 0px; border-bottom-width: 0px; margin-left: auto; width: 366px; margin-right: auto; height: 146px; border-right-width: 0px" src="http://articles.csdn.net/uploads/allimg/110408/1005504V0-3.jpg" /></p><p style="font-size: 14px; text-indent: 25px; line-height: 25px">是最好的在线图标搜索引擎，它有5万多个高质量的图标，每个图标都有适合 Windows、Macintosh和Linux系统的PNG、ICO和ICNS 格式。</p><p style="font-size: 14px; text-indent: 25px; line-height: 25px"><a target="_blank" rel="nofollow" style="color: rgb(1,95,182); text-decoration: none" href="http://camnpr.com/upload/2012/3/201203291509247138.jpg" /></p><p style="font-size: 14px; text-indent: 25px; line-height: 25px">是有助于你在网上找到高质量图标的图标搜索引擎。</p><p style="font-size: 14px; text-indent: 25px; line-height: 25px"><a target="_blank" rel="nofollow" style="color: rgb(1,95,182); text-decoration: none" href="http://camnpr.com/upload/2012/3/201203291510110303.jpg" /></p><p style="font-size: 14px; text-indent: 25px; line-height: 25px"><a target="_blank" rel="nofollow" style="color: rgb(1,95,182); text-decoration: none" href="http://camnpr.com/upload/2012/3/201203291510127863.jpg" /></p><p style="font-size: 14px; text-indent: 25px; line-height: 25px">也是一个非常有用的网站，你可以用它找到高质量的图标，它有1千多个图标包共2万多个高质量的网络图标。</p><p style="font-size: 14px; text-indent: 25px; line-height: 25px"><a target="_blank" rel="nofollow" style="color: rgb(1,95,182); text-decoration: none" href="http://camnpr.com/upload/2012/3/201203291510130817.jpg" /></p><p style="font-size: 14px; text-indent: 25px; line-height: 25px">在ICONlook.com 上你可以找到你想要的图标。</p><p style="font-size: 14px; text-indent: 25px; line-height: 25px">原文链接：<a target="_blank" style="color: rgb(1,95,182); text-decoration: none" href="http://www.jobbole.com/entry.php/610-8%E4%B8%AA%E9%AB%98%E8%B4%A8%E9%87%8F%E5%9B%BE%E6%A0%87%E7%9A%84%E6%9C%80%E4%BD%B3%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E">8个高质量图标的最佳搜索引擎</a></p>]]></description><category>搜索引擎</category><comments>http://camnpr.com/search/264.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=264</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=264&amp;key=2a62d187</trackback:ping></item><item><title>Lucene 简介 (Lucene.Net)</title><author>camnpr@163.com (camnpr)</author><link>http://camnpr.com/search/238.html</link><pubDate>Mon, 14 Mar 2011 19:22:24 +0800</pubDate><guid>http://camnpr.com/search/238.html</guid><description><![CDATA[<p><style type="text/css"><br/>    .pfmblb{padding:0px 0px 0px 10px; font-size: 1em;  margin: 0px 0px 0px 38px; border-left: rgb(209,215,220) 1px solid; line-height: 18px; background-color: rgb(250,250,250)}<br/>    .pfmblb span{display:block;}</style></p><p><span class="Apple-style-span" style="word-spacing: 0px; font: medium Simsun; text-transform: none; color: rgb(0,0,0); text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><span class="Apple-style-span" style="font-size: 12px; line-height: 18px; font-family: Tahoma; text-align: left; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px">Lucene 是一个基于 Java 的全文信息检索工具包，它不是一个完整的搜索应用程序，而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。<span>&nbsp;</span><br /><br />目前已经有很多应用程序的搜索功能是基于 Lucene 的，比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引，所以你只要能把你要索引的数据格式转化的文本的，Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档，PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的，然后将转化后的内容交给 Lucene 进行索引，然后把创建好的索引文件保存到磁盘或者内存中，最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。<span>&nbsp;</span><br /><br />图 1 表示了搜索应用程序和 Lucene 之间的关系，也反映了利用 Lucene 构建搜索应用程序的流程：<span>&nbsp;</span><br /><br /><br /><span style="font-size: large">索引和搜索</span><span>&nbsp;</span><br /><br />索引是现代搜索引擎的核心，建立索引的过程就是把源数据处理成非常方便查询的索引文件的过程。为什么索引这么重要呢，试想你现在要在大量的文档中搜索含有某个关键词的文档，那么如果不建立索引的话你就需要把这些文档顺序的读入内存，然后检查这个文章中是不是含有要查找的关键词，这样的话就会耗费非常多的时间，想想搜索引擎可是在毫秒级的时间内查找出要搜索的结果的。这就是由于建立了索引的原因，你可以把索引想象成这样一种数据结构，他能够使你快速的随机访问存储在索引中的关键词，进而找到该关键词所关联的文档。Lucene 采用的是一种称为反向索引（inverted index）的机制。反向索引就是说我们维护了一个词 / 短语表，对于这个表中的每个词 / 短语，都有一个链表描述了有哪些文档包含了这个词 / 短语。这样在用户输入查询条件的时候，就能非常快的得到搜索结果。我们将在本系列文章的第二部分详细介绍 Lucene 的索引机制，由于 Lucene 提供了简单易用的 API，所以即使读者刚开始对全文本进行索引的机制并不太了解，也可以非常容易的使用 Lucene 对你的文档实现索引。<span>&nbsp;</span><br /><br />对文档建立好索引后，就可以在这些索引上面进行搜索了。搜索引擎首先会对搜索的关键词进行解析，然后再在建立好的索引上面进行查找，最终返回和用户输入的关键词相关联的文档。<span>&nbsp;</span><br /><br /><span style="font-size: large">Lucene 软件包分析</span><span>&nbsp;</span><br />Lucene 软件包的发布形式是一个 JAR 文件，下面我们分析一下这个 JAR 文件里面的主要的 JAVA 包，使读者对之有个初步的了解。<span>&nbsp;</span><br /><br />Package: org.apache.lucene.document<span>&nbsp;</span><br /><br />这个包提供了一些为封装要索引的文档所需要的类，比如 Document, Field。这样，每一个文档最终被封装成了一个 Document 对象。<span>&nbsp;</span><br /><br />Package: org.apache.lucene.analysis<span>&nbsp;</span><br /><br />这个包主要功能是对文档进行分词，因为文档在建立索引之前必须要进行分词，所以这个包的作用可以看成是为建立索引做准备工作。<span>&nbsp;</span><br /><br />Package: org.apache.lucene.index<span>&nbsp;</span><br /><br />这个包提供了一些类来协助创建索引以及对创建好的索引进行更新。这里面有两个基础的类：IndexWriter 和 IndexReader，其中 IndexWriter 是用来创建索引并添加文档到索引中的，IndexReader 是用来删除索引中的文档的。<span>&nbsp;</span><br /><br />Package: org.apache.lucene.search<span>&nbsp;</span><br /><br />这个包提供了对在建立好的索引上进行搜索所需要的类。比如 IndexSearcher 和 Hits, IndexSearcher 定义了在指定的索引上进行搜索的方法，Hits 用来保存搜索得到的结果。<span>&nbsp;</span><br /><br /><span style="font-size: large">一个简单的搜索应用程序</span><span>&nbsp;</span><br />假设我们的电脑的目录中含有很多文本文档，我们需要查找哪些文档含有某个关键词。为了实现这种功能，我们首先利用 Lucene 对这个目录中的文档建立索引，然后在建立好的索引中搜索我们所要查找的文档。通过这个例子读者会对如何利用 Lucene 构建自己的搜索应用程序有个比较清楚的认识。<span>&nbsp;</span><br /><br /><span style="font-size: large">建立索引</span><span>&nbsp;</span><br />为了对文档进行索引，Lucene 提供了五个基础的类，他们分别是 Document, Field, IndexWriter, Analyzer, Directory。下面我们分别介绍一下这五个类的用途：<span>&nbsp;</span><br /><br /><strong style="font-weight: bold">Document</strong><span>&nbsp;</span><br /><br />Document 是用来描述文档的，这里的文档可以指一个 HTML 页面，一封电子邮件，或者是一个文本文件。一个 Document 对象由多个 Field 对象组成的。可以把一个 Document 对象想象成数据库中的一个记录，而每个 Field 对象就是记录的一个字段。<span>&nbsp;</span><br /><br /><strong style="font-weight: bold">Field<span>&nbsp;</span></strong><br />Field 对象是用来描述一个文档的某个属性的，比如一封电子邮件的标题和内容可以用两个 Field 对象分别描述。<span>&nbsp;</span><br /><br /><strong style="font-weight: bold">Analyzer</strong><span>&nbsp;</span><br /><br />在一个文档被索引之前，首先需要对文档内容进行分词处理，这部分工作就是由 Analyzer 来做的。Analyzer 类是一个抽象类，它有多个实现。针对不同的语言和应用需要选择适合的 Analyzer。Analyzer 把分词后的内容交给 IndexWriter 来建立索引。<span>&nbsp;</span><br /><br /><strong style="font-weight: bold">IndexWriter</strong><span>&nbsp;</span><br /><br />IndexWriter 是 Lucene 用来创建索引的一个核心的类，他的作用是把一个个的 Document 对象加到索引中来。<span>&nbsp;</span><br /><br /><strong style="font-weight: bold">Directory</strong><span>&nbsp;</span><br /><br />这个类代表了 Lucene 的索引的存储的位置，这是一个抽象类，它目前有两个实现，第一个是 FSDirectory，它表示一个存储在文件系统中的索引的位置。第二个是 RAMDirectory，它表示一个存储在内存当中的索引的位置。<span>&nbsp;</span><br /><br />熟悉了建立索引所需要的这些类后，我们就开始对某个目录下面的文本文件建立索引了，清单 1 给出了对某个目录下的文本文件建立索引的源代码。<span>&nbsp;</span><br /><br />对文本文件建立索引<span>&nbsp;</span><br /></span></span></p><div id="" style="padding-right: 1px; overflow-y: auto; padding-left: 1px; font-size: 12px; overflow-x: auto; padding-bottom: 1px; margin-left: 9px; width: 766px; word-break: break-all; padding-top: 1px; font-family: Monaco, ’DejaVu Sans Mono’, ’Bitstream Vera Sans Mono’, Consolas, ’Courier New’, monospace; background-color: transparent; word-wrap: break-word"><div><div style="padding-right: 3px; padding-left: 3px; font-weight: bold; padding-bottom: 3px; margin: 0px; color: black; padding-top: 3px; text-align: left">Java代码<span>&nbsp;</span></div></div><ol class="dp-j" style="border-right: rgb(209,215,220) 1px solid; padding-right: 0px; border-top: rgb(209,215,220) 1px solid; padding-left: 0px; font-size: 1em; padding-bottom: 2px; margin: 0px 0px 1px; border-left: rgb(209,215,220) 1px solid; color: rgb(43,145,175); line-height: 1.4em; padding-top: 2px; border-bottom: rgb(209,215,220) 1px solid; list-style-type: decimal; background-color: rgb(255,255,255)"><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">package</span><span>&nbsp;TestLucene;</span></span></li><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;java.io.File;</span></span></li><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;java.io.FileReader;</span></span></li><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;java.io.Reader;</span></span></li><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;java.util.Date;</span></span></li><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.analysis.Analyzer;</span></span></li><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.analysis.standard.StandardAnalyzer;</span></span></li><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.document.Document;</span></span></li><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.document.Field;</span></span></li><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.index.IndexWriter;</span></span></li><li class="pfmblb"><span><span class="comment" style="color: rgb(0,130,0)">/**&nbsp;</span>&nbsp;</span></li><li class="pfmblb"><span><span class="comment" style="color: rgb(0,130,0)">*&nbsp;This&nbsp;class&nbsp;demonstrate&nbsp;the&nbsp;process&nbsp;of&nbsp;creating&nbsp;index&nbsp;with&nbsp;Lucene&nbsp;</span>&nbsp;</span></li><li class="pfmblb"><span><span class="comment" style="color: rgb(0,130,0)">*&nbsp;for&nbsp;text&nbsp;files&nbsp;</span>&nbsp;</span></li><li class="pfmblb"><span><span class="comment" style="color: rgb(0,130,0)">*/</span></span></li><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">public</span><span>&nbsp;</span><span style="font-weight: bold; color: rgb(127,0,85)">class</span><span>&nbsp;TxtFileIndexer&nbsp;{</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">public</span><span>&nbsp;</span><span style="font-weight: bold; color: rgb(127,0,85)">static</span><span>&nbsp;</span><span style="font-weight: bold; color: rgb(127,0,85)">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="font-weight: bold; color: rgb(127,0,85)">throws</span><span>&nbsp;Exception{</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;<span class="comment" style="color: rgb(0,130,0)">//indexDir&nbsp;is&nbsp;the&nbsp;directory&nbsp;that&nbsp;hosts&nbsp;Lucene’s&nbsp;index&nbsp;files&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;FileindexDir&nbsp;=&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;File(</span><span class="string" style="color: blue">&quot;D:\\luceneIndex&quot;</span><span>);</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;<span class="comment" style="color: rgb(0,130,0)">//dataDir&nbsp;is&nbsp;the&nbsp;directory&nbsp;that&nbsp;hosts&nbsp;the&nbsp;text&nbsp;files&nbsp;that&nbsp;to&nbsp;be&nbsp;indexed&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;FiledataDir&nbsp;&nbsp;=&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;File(</span><span class="string" style="color: blue">&quot;D:\\luceneData&quot;</span><span>);</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;Analyzer&nbsp;luceneAnalyzer&nbsp;=&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;StandardAnalyzer();</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;File[]&nbsp;dataFiles&nbsp;&nbsp;=&nbsp;dataDir.listFiles();</span></li><li class="pfmblb"><span>&nbsp;&nbsp;IndexWriter&nbsp;indexWriter&nbsp;=&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;IndexWriter(indexDir,luceneAnalyzer,</span><span style="font-weight: bold; color: rgb(127,0,85)">true</span><span>);</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">long</span><span>&nbsp;startTime&nbsp;=&nbsp;</span><span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;Date().getTime();</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">for</span><span>(</span><span style="font-weight: bold; color: rgb(127,0,85)">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number" style="color: rgb(192,0,0)">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;dataFiles.length;&nbsp;i++){</span></span></li><li class="pfmblb"><span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">if</span><span>(dataFiles[i].isFile()&nbsp;&amp;&amp;&nbsp;dataFiles[i].getName().endsWith(</span><span class="string" style="color: blue">&quot;.txt&quot;</span><span>)){&nbsp;&nbsp;</span></span></li><li class="pfmblb"><span>System.out.println(<span class="string" style="color: blue">&quot;Indexing&nbsp;file&nbsp;&quot;</span><span>&nbsp;+&nbsp;dataFiles[i].getCanonicalPath());</span></span></li><li class="pfmblb"><span>Document&nbsp;document&nbsp;=&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;Document();</span></span></li><li class="pfmblb"><span>Reader&nbsp;txtReader&nbsp;=&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;FileReader(dataFiles[i]);</span></span></li><li class="pfmblb"><span>document.add(Field.Text(<span class="string" style="color: blue">&quot;path&quot;</span><span>,dataFiles[i].getCanonicalPath()));</span></span></li><li class="pfmblb"><span>document.add(Field.Text(<span class="string" style="color: blue">&quot;contents&quot;</span><span>,txtReader));</span></span></li><li class="pfmblb"><span>indexWriter.addDocument(document);</span></li><li class="pfmblb"><span>&nbsp;}</span></li><li class="pfmblb"><span>&nbsp;&nbsp;}</span></li><li class="pfmblb"><span>&nbsp;&nbsp;indexWriter.optimize();</span></li><li class="pfmblb"><span>&nbsp;&nbsp;indexWriter.close();</span></li><li class="pfmblb"><span>&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">long</span><span>&nbsp;endTime&nbsp;=&nbsp;</span><span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;Date().getTime();</span></span></li><li class="pfmblb"><span>&nbsp;</span></li><li class="pfmblb"><span>&nbsp;&nbsp;System.out.println(<span class="string" style="color: blue">&quot;It&nbsp;takes&nbsp;&quot;</span><span>&nbsp;+&nbsp;(endTime&nbsp;-&nbsp;startTime)</span></span></li><li class="pfmblb"><span>+&nbsp;<span class="string" style="color: blue">&quot;&nbsp;milliseconds&nbsp;to&nbsp;create&nbsp;index&nbsp;for&nbsp;the&nbsp;files&nbsp;in&nbsp;directory&nbsp;&quot;</span><span>&nbsp;&nbsp;</span></span></li><li class="pfmblb"><span>+&nbsp;dataDir.getPath());&nbsp;</span></li><li class="pfmblb"><span>&nbsp;&nbsp;}</span></li><li class="pfmblb"><span>}</span></li></ol></div><p><br />&nbsp; 以上代码中我们注意到类 IndexWriter 的构造函数需要三个参数，第一个参数指定了所创建的索引要存放的位置，他可以是一个 File 对象，也可以是一个 FSDirectory 对象或者 RAMDirectory 对象。第二个参数指定了 Analyzer 类的一个实现，也就是指定这个索引是用哪个分词器对文挡内容进行分词。第三个参数是一个布尔型的变量，如果为 true 的话就代表创建一个新的索引，为 false 的话就代表在原来索引的基础上进行操作。接着程序遍历了目录下面的所有文本文档，并为每一个文本文档创建了一个 Document 对象。然后把文本文档的两个属性：路径和内容加入到了两个 Field 对象中，接着在把这两个 Field 对象加入到 Document 对象中，最后把这个文档用 IndexWriter 类的 add 方法加入到索引中去。这样我们便完成了索引的创建。接下来我们进入在建立好的索引上进行搜索的部分。<span>&nbsp;</span><br /><br /><span style="font-size: large">搜索文档</span><span>&nbsp;</span><br />利用 Lucene 进行搜索就像建立索引一样也是非常方便的。在上面一部分中，我们已经为一个目录下的文本文档建立好了索引，现在我们就要在这个索引上进行搜索以找到包含某个关键词或短语的文档。Lucene 提供了几个基础的类来完成这个过程，它们分别是呢 IndexSearcher, Term, Query, TermQuery, Hits. 下面我们分别介绍这几个类的功能。<span>&nbsp;</span><br /><br /><strong style="font-weight: bold">Query<span>&nbsp;</span></strong><br />这是一个抽象类，他有多个实现，比如 TermQuery, BooleanQuery, PrefixQuery. 这个类的目的是把用户输入的查询字符串封装成 Lucene 能够识别的 Query。<span>&nbsp;</span><br /><br /><strong style="font-weight: bold">Term<span>&nbsp;</span></strong><br />Term 是搜索的基本单位，一个 Term 对象有两个 String 类型的域组成。生成一个 Term 对象可以有如下一条语句来完成：Term term = new Term(&ldquo;fieldName&rdquo;,&rdquo;queryWord&rdquo;); 其中第一个参数代表了要在文档的哪一个 Field 上进行查找，第二个参数代表了要查询的关键词。<span>&nbsp;</span><br /><br /><strong style="font-weight: bold">TermQuery<span>&nbsp;</span></strong><br />TermQuery 是抽象类 Query 的一个子类，它同时也是 Lucene 支持的最为基本的一个查询类。生成一个 TermQuery 对象由如下语句完成： TermQuery termQuery = new TermQuery(new Term(&ldquo;fieldName&rdquo;,&rdquo;queryWord&rdquo;)); 它的构造函数只接受一个参数，那就是一个 Term 对象。<span>&nbsp;</span><br /><br /><strong style="font-weight: bold">IndexSearcher</strong><span>&nbsp;</span><br /><br />IndexSearcher 是用来在建立好的索引上进行搜索的。它只能以只读的方式打开一个索引，所以可以有多个 IndexSearcher 的实例在一个索引上进行操作。<span>&nbsp;</span><br /><br /><strong style="font-weight: bold">Hits<span>&nbsp;</span></strong><br />Hits 是用来保存搜索的结果的。<span>&nbsp;</span><br /><br />介绍完这些搜索所必须的类之后，我们就开始在之前所建立的索引上进行搜索了，清单 2 给出了完成搜索功能所需要的代码。<span>&nbsp;</span><br /><br />在建立好的索引上进行搜索<span>&nbsp;</span><br />&nbsp;</p><div id="" style="padding-right: 1px; overflow-y: auto; padding-left: 1px; font-size: 12px; overflow-x: auto; padding-bottom: 1px; margin-left: 9px; width: 766px; word-break: break-all; padding-top: 1px; font-family: Monaco, ’DejaVu Sans Mono’, ’Bitstream Vera Sans Mono’, Consolas, ’Courier New’, monospace; background-color: transparent; word-wrap: break-word"><div><div style="padding-right: 3px; padding-left: 3px; font-weight: bold; padding-bottom: 3px; margin: 0px; color: black; padding-top: 3px; text-align: left">Java代码<span>&nbsp;</span>&nbsp;</div></div><ol class="dp-j" style="border-right: rgb(209,215,220) 1px solid; padding-right: 0px; border-top: rgb(209,215,220) 1px solid; padding-left: 0px; font-size: 1em; padding-bottom: 2px; margin: 0px 0px 1px; border-left: rgb(209,215,220) 1px solid; color: rgb(43,145,175); line-height: 1.4em; padding-top: 2px; border-bottom: rgb(209,215,220) 1px solid; list-style-type: decimal; background-color: rgb(255,255,255)"><li class="pfmblb"><span><span style="font-weight: bold; color: rgb(127,0,85)">package</span><span>&nbsp;TestLucene;</span></span></li><li class="pfmblb"><span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;java.io.File;</span></span></li><li class="pfmblb"><span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.document.Document;</span></span></li><li class="pfmblb"><span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.index.Term;</span></span></li><li class="pfmblb"><span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.search.Hits;</span></span></li><li class="pfmblb"><span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.search.IndexSearcher;</span></span></li><li class="pfmblb"><span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.search.TermQuery;</span></span></li><li class="pfmblb"><span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">import</span><span>&nbsp;org.apache.lucene.store.FSDirectory;</span></span></li><li class="pfmblb"><span>&nbsp;<span class="comment" style="color: rgb(0,130,0)">/**&nbsp;</span>&nbsp;</span></li><li class="pfmblb"><span><span class="comment" style="color: rgb(0,130,0)">&nbsp;*&nbsp;This&nbsp;class&nbsp;is&nbsp;used&nbsp;to&nbsp;demonstrate&nbsp;the&nbsp;</span>&nbsp;</span></li><li class="pfmblb"><span><span class="comment" style="color: rgb(0,130,0)">&nbsp;*&nbsp;process&nbsp;of&nbsp;searching&nbsp;on&nbsp;an&nbsp;existing&nbsp;</span>&nbsp;</span></li><li class="pfmblb"><span><span class="comment" style="color: rgb(0,130,0)">&nbsp;*&nbsp;Lucene&nbsp;index&nbsp;</span>&nbsp;</span></li><li class="pfmblb"><span><span class="comment" style="color: rgb(0,130,0)">&nbsp;*&nbsp;</span>&nbsp;</span></li><li class="pfmblb"><span><span class="comment" style="color: rgb(0,130,0)">&nbsp;*/</span></span></li><li class="pfmblb"><span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">public</span><span>&nbsp;</span><span style="font-weight: bold; color: rgb(127,0,85)">class</span><span>&nbsp;TxtFileSearcher&nbsp;{</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">public</span><span>&nbsp;</span><span style="font-weight: bold; color: rgb(127,0,85)">static</span><span>&nbsp;</span><span style="font-weight: bold; color: rgb(127,0,85)">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="font-weight: bold; color: rgb(127,0,85)">throws</span><span>&nbsp;Exception{</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;String&nbsp;queryStr&nbsp;=&nbsp;<span class="string" style="color: blue">&quot;lucene&quot;</span><span>;</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;<span class="comment" style="color: rgb(0,130,0)">//This&nbsp;is&nbsp;the&nbsp;directory&nbsp;that&nbsp;hosts&nbsp;the&nbsp;Lucene&nbsp;index&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;File&nbsp;indexDir&nbsp;=&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;File(</span><span class="string" style="color: blue">&quot;D:\\luceneIndex&quot;</span><span>);</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;FSDirectory&nbsp;directory&nbsp;=&nbsp;FSDirectory.getDirectory(indexDir,<span style="font-weight: bold; color: rgb(127,0,85)">false</span><span>);</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;IndexSearcher&nbsp;searcher&nbsp;=&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;IndexSearcher(directory);</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">if</span><span>(!indexDir.exists()){</span></span></li><li class="pfmblb"><span>&nbsp;System.out.println(<span class="string" style="color: blue">&quot;The&nbsp;Lucene&nbsp;index&nbsp;is&nbsp;not&nbsp;exist&quot;</span><span>);</span></span></li><li class="pfmblb"><span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">return</span><span>;</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;}</span></li><li class="pfmblb"><span>&nbsp;&nbsp;Term&nbsp;term&nbsp;=&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;Term(</span><span class="string" style="color: blue">&quot;contents&quot;</span><span>,queryStr.toLowerCase());</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;TermQuery&nbsp;luceneQuery&nbsp;=&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">new</span><span>&nbsp;TermQuery(term);</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;Hits&nbsp;hits&nbsp;=&nbsp;searcher.search(luceneQuery);</span></li><li class="pfmblb"><span>&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85)">for</span><span>(</span><span style="font-weight: bold; color: rgb(127,0,85)">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number" style="color: rgb(192,0,0)">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;hits.length();&nbsp;i++){</span></span></li><li class="pfmblb"><span>&nbsp;Document&nbsp;document&nbsp;=&nbsp;hits.doc(i);</span></li><li class="pfmblb"><span>&nbsp;System.out.println(<span class="string" style="color: blue">&quot;File:&nbsp;&quot;</span><span>&nbsp;+&nbsp;document.get(</span><span class="string" style="color: blue">&quot;path&quot;</span><span>));</span></span></li><li class="pfmblb"><span>&nbsp;&nbsp;}</span></li><li class="pfmblb"><span>&nbsp;searcher.close();&nbsp;&nbsp;</span></li><li class="pfmblb"><span>&nbsp;&nbsp;}</span></li><li class="pfmblb"><span>&nbsp;}</span></li></ol></div><p><br />以上代码中，类 IndexSearcher 的构造函数接受一个类型为 Directory 的对象，Directory 是一个抽象类，它目前有两个子类：FSDirctory 和 RAMDirectory. 我们的程序中传入了一个 FSDirctory 对象作为其参数，代表了一个存储在磁盘上的索引的位置。构造函数执行完成后，代表了这个 IndexSearcher 以只读的方式打开了一个索引。然后我们程序构造了一个 Term 对象，通过这个 Term 对象，我们指定了要在文档的内容中搜索包含关键词&rdquo;lucene&rdquo;的文档。接着利用这个 Term 对象构造出 TermQuery 对象并把这个 TermQuery 对象传入到 IndexSearcher 的 search 方法中进行查询，返回的结果保存在 Hits 对象中。最后我们用了一个循环语句把搜索到的文档的路径都打印了出来。好了，我们的搜索应用程序已经开发完毕，怎么样，利用 Lucene 开发搜索应用程序是不是很简单。<span>&nbsp;</span><br /><br /><span style="font-size: large">总结</span><span>&nbsp;</span><br />本文首先介绍了 Lucene 的一些基本概念，然后开发了一个应用程序演示了利用 Lucene 建立索引并在该索引上进行搜索的过程。希望本文能够为学习 Lucene 的读者提供帮助。<span>&nbsp;</span><br /><br />Lucene下载地址： http://apache.oregonstate.edu/lucene/java/<span>&nbsp;</span><br /><br />之前有童鞋下载不到包，请到这篇博文的附件下载jar包：&nbsp; http://rwg109.javaeye.com/blog/840630<span>&nbsp;</span></p>]]></description><category>搜索引擎</category><comments>http://camnpr.com/search/238.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=238</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=238&amp;key=3f7bbf90</trackback:ping></item><item><title>【使用技巧】“搜索引擎”你了解多少</title><author>camnpr@163.com (camnpr)</author><link>http://camnpr.com/search/39.html</link><pubDate>Tue, 14 Sep 2010 00:19:03 +0800</pubDate><guid>http://camnpr.com/search/39.html</guid><description><![CDATA[<p align="center">在浩海的网络信息中，怎么能快速准确地找到我们想要的信息呢？大家肯定会说用搜索引擎，但是搜索引擎你又了解多少呢？知道Goolge、baidu不就足够了吗？这可是最强的搜索引擎了。是，这确实是最强的搜索引擎，但是在如此庞大的数据系统中，要找到我们想要的信息还是相当的困难。下面，看看我给大家带来的搜索引擎使用技巧，也许对你会有些帮助。 . <br />　　每种搜索引擎都有不同的特点，只有选择合适的搜索工具才能得到最佳的结果。在这里我说说Goolge。 ..</p><p>　　首先，我们来看看Goolge，<a target="_top" href="{$->>repath}articles/?type=list&amp;class=3"><font color="#0240a3">http://www.google.com/intl/zh-CN/</font></a>世界上最强大的搜索引擎，有了它，你可以在网上是找到你想要的任何东西，怎么样？动心了吧？跟我来，看看这里有什么技巧： 本站所提供的摄影照片，插画，设计作品，如需使用，请与原作者联系。</p><p>1、翻译英文单词 .　</p><p>　　在你看一篇非常好的英文短文的时候，或者有朋友用英语聊天看到不认识的单词的时候，而此时手头又没有字典，电脑中也没有安装诸如&ldquo;金山词霸&rdquo;等电子字典。面对这种情况，是不是只能将这些拦路虎置之不理，直接跳过呢？其实，利用搜索引擎为我们提供的在线翻译功能，便能解决这一问题。这时你只要在搜索栏中输入&ldquo;fy 需要查询的英文单词&rdquo;，就可以轻松的解决问题了。例如：查询&ldquo;dragon&rdquo;这个单词，那么就在地址栏输入&ldquo;fy dragon&rdquo;或&ldquo;dragon fy&rdquo;回车就可以看到你要找到单词的意思了。 .</p><p>　　提示： .</p><p>　　A、将fy放置于英文单词后同样有效。 ..</p><p>　　B、你也可以查找中文的&ldquo;翻译&rdquo;，如果输入的是&ldquo;fy 中文单词&rdquo;，搜索的结果将会是对应的英文单词。如果你使用的是Baidu，那便可以直接在搜索栏中输入英文单词，例如&ldquo;dragon&rdquo;回车后，点击结果页中的&ldquo;词典&rdquo;链接，便会在一个新页面中得到该单词的中文解释。有了这些，你就不用怕自己的英语不如别人了吧！最起码单词这关是过了。 !</p><p>　　2、搜索指定类型的文件 ..</p><p>　　确定你要搜索的信息的文件类型，也是扩展名：以后在搜索的时候你只需用&ldquo;关键字 filetype:扩展名&rdquo;的形式即可轻松找到你要的信息，其实&ldquo;filetype:&rdquo;是Goolge 开发的一个非常强大而且实用的搜索语法。通过这个语法，Goolge 不仅能搜索一般的网页，还能对某些二进制文件进行检索。如图1： !</p><p><img alt="" src="{$->>repath}articles/common/upload/2010/09/14/0172po.jpg" /></p><p align="center">&nbsp;</p><p>　　我们搜索&ldquo;电脑爱好者 filetype:pdf&rdquo;可以得看到搜索都是pdf格式的文件，同样你也可以其他别的格式的文件。喜欢看Flash动画的人有福了，通过使用&ldquo;filetype:&rdquo;语法，你可以搜索到能直接下载的Flash歌曲、MTV，而不必使用专门的搜索下载工具。例如：搜索关于伍佰的歌曲Flash MTV。关键词：&ldquo;伍佰 filetype:swf&rdquo;。试试看，有没有你要的歌曲。 版权申明：本站文章均来自网络，如有侵权，请联系028-86262244-215，我们收到后立即删除,谢谢！</p><p>　　3、搜索&ldquo;限制级&rdquo;内容 对真正的成功者来说，不论他的生存条件如何，都不会自我磨灭</p><p>　　网络上很多的东西都添加了一定的访问限制，并不允许我们随便访问，或者即使允许访问也不设立访问的入口（即只有知道完整链接才可以访问），例如网上的加了诸多限制的图书、软件等，或者即时的摄像头画面。而这些只需要你会使用一些特殊的关键字。 根据专家观察，这样的理论和现象都是值得各位站长深思的，所以希望大家多做研究学习，争取总结出更多更好的经验!</p><p>　　A、搜索在线的摄像头，在Goolge中输入&ldquo;inurl:&quot;ViewerFrame?Mode=&quot;&rdquo;或者&ldquo;inurl:&quot;MultiCameraFrame?Mode=&quot;&rdquo;、&ldquo;inurl:&quot;view/index.shtml&quot;&rdquo;回车后即可打开搜索后的结果，单击其中的任意一个链接，即可看到世界上某个地方监视镜头拍摄下来的内容，如图3： 本站所提供的摄影照片，插画，设计作品，如需使用，请与原作者联系。</p><p align="center">&nbsp;</p><p>B、突破下载的限制，我们可以利用关键字&ldquo;index of/&rdquo;来跳过网页的验证限制，直接找到一些资源的下载链接，例如输入&ldquo;&quot;index of/&quot; inurl:lib&rdquo;，则可搜索到很多可以直接下载的书籍。输入&ldquo;&quot;index of/&quot; cnki&rdquo;可以找到许多超星图书馆的VIP图书下载地址。用同样的道理还可以搜索ppt、mp3、动画、软件等内容。 !</p><p>　　我这里所说的只是搜索技巧的一小部分，还有很多需要大家一点一滴的积累。其实知识有是这样的，要厚积薄发！ 对真正的成功者来说，不论他的生存条件如何，都不会自我磨灭 <br />&nbsp;</p><p>4、复杂计算你有它厉害吗？ 版权申明：本站文章均来自网络，如有侵权，请联系028-86262244-215，我们收到后立即删除,谢谢！</p><p>　　看看这个小计算题：log((sin(30))^2)-3 pi=？怎么样，难倒了吧？没关系，有Goolge呢？打开Goolge，直接在搜索栏中输入相应的计算公式，例如&ldquo;log((sin(30))^2)-3 pi&rdquo;，按下回车键后，你便会惊喜的发现，结果已经出现在眼前了，</p><p align="center">&nbsp;</p><p>　　比你自己算的要快多了吧，而且你算的还不一定是正确的呢？ ..</p>]]></description><category>搜索引擎</category><comments>http://camnpr.com/search/39.html#comment</comments><wfw:comment>http://camnpr.com/</wfw:comment><wfw:commentRss>http://camnpr.com/feed.asp?cmt=39</wfw:commentRss><trackback:ping>http://camnpr.com/cmd.asp?act=tb&amp;id=39&amp;key=35ac009a</trackback:ping></item></channel></rss>
