首页 > gforge, wordpress > 使用google自定义搜索引擎

使用google自定义搜索引擎

google搜索引擎很强大,如果没有机密信息的话,是否可以尝试让google来帮我们完成全站搜索引擎,而不必再自己去建立。

下文是个例子,用google自定义搜索引擎来搜索指定的邮件列表,具体步骤如下:

 

1)下载并安装sitemap生成器
参考:http://code.google.com/p/perlsitemapgenerator/

2)(可能需要)安装XML:SAX

$ perl -MCPAN -e shell
cpan> install XML::LibXML XML::SAX::Base XML::SAX::ExpatXS XML::SAX::Writer
cpan> quit

参考:http://www.ibm.com/developerworks/cn/xml/x-xmlperl2.html#resources

3)按要求修改comfig.xml ,另存为testlist_config.xml

   内容如下:

[root@retailsolution sitemap_gen_perl]# vi testlist_config.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<!--
  sitemap_gen.pl example configuration script
 
  This file specifies a set of sample input parameters for the
  sitemap_gen.pl client.
 
  You should copy this file into "config.xml" and modify it for
  your server.
 
 
  ********************************************************* -->
 
 
<!-- ** MODIFY **
  The "site" node describes your basic web site.
 
  Required attributes:
    base_url   - the top-level URL of the site being mapped
    store_into - the webserver path to the desired output file.
                 This should end in '.xml' or '.xml.gz'
                 (the script will create this file)
 
  Optional attributes:
    verbose    - an integer from 0 (quiet) to 3 (noisy) for
                 how much diagnostic output the script gives
    suppress_search_engine_notify="1"
               - disables notifying search engines about the new map
                 (same as the "testing" command-line argument.)
    default_encoding
               - names a character encoding to use for URLs and
                 file paths.  (Example: "UTF-8")
-->
<site base_url="http://report.retailsolution.cn/mhonarchive/testlist/" store_into="/var/lib/mhonarc/archives/testlist/sitemap.xml" verbose="1">
 
  <!-- ********************************************************
          INPUTS
 
  All the various nodes in this section control where the script
  looks to find URLs.
 
  MODIFY or DELETE these entries as appropriate for your server.
  ********************************************************* -->
 
  <!-- ** MODIFY or DELETE **
    "url" nodes specify individual URLs to include in the map.
 
    Required attributes:
      href       - the URL
 
    Optional attributes:
      lastmod    - timestamp of last modification (ISO8601 format)
      changefreq - how often content at this URL is usually updated
      priority   - value 0.0 to 1.0 of relative importance in your site
  -->
 
 
 
  <!-- ** MODIFY or DELETE **
    "urllist" nodes name text files with lists of URLs.
    An example file "example_urllist.txt" is provided.
 
    Required attributes:
      path       - path to the file
 
    Optional attributes:
      encoding   - encoding of the file if not US-ASCII
  -->
 
 
 
  <!-- ** MODIFY or DELETE **
    "directory" nodes tell the script to walk the file system
    and include all files and directories in the Sitemap.
 
    Required attributes:
      path       - path to begin walking from
      url        - URL equivalent of that path
 
    Optional attributes:
      default_file - name of the index or default file for directory URLs
  -->
  <directory path="/var/lib/mhonarc/archives/testlist/" url="http://report.retailsolution.cn/mhonarchive/testlist/" />
 
 
 
  <!-- ** MODIFY or DELETE **
    "accesslog" nodes tell the script to scan webserver log files to
    extract URLs on your site.  Both Common Logfile Format (Apache's default
    logfile) and Extended Logfile Format (IIS's default logfile) can be read.
 
    Required attributes:
      path       - path to the file
 
    Optional attributes:
      encoding   - encoding of the file if not US-ASCII
  -->
 
 
  <!-- ** MODIFY or DELETE **
    "sitemap" nodes tell the script to scan other Sitemap files.  This can
    be useful to aggregate the results of multiple runs of this script into
    a single Sitemap.
 
    Required attributes:
      path       - path to the file
  -->
 
 
  <!-- ********************************************************
          FILTERS
 
  Filters specify wild-card patterns that the script compares
  against all URLs it finds.  Filters can be used to exclude
  certain URLs from your Sitemap, for instance if you have
  hidden content that you hope the search engines don't find.
 
  Filters can be either type="wildcard", which means standard
  path wildcards (* and ?) are used to compare against URLs,
  or type="regexp", which means regular expressions are used
  to compare.
 
  Filters are applied in the order specified in this file.
 
  An action="drop" filter causes exclusion of matching URLs.
  An action="pass" filter causes inclusion of matching URLs,
  shortcutting any other later filters that might also match.
  If no filter at all matches a URL, the URL will be included.
  Together you can build up fairly complex rules.
 
  The default action is "drop".
  The default type is "wildcard".
 
  You can MODIFY or DELETE these entries as appropriate for
  your site.  However, unlike above, the example entries in
  this section are not contrived and may be useful to you as
  they are.
  ********************************************************* -->
 
  <!-- Exclude URLs that end with a '~'   (IE: emacs backup files)      -->
  <filter action="drop" type="wildcard" pattern="*~" />
 
  <!-- Exclude URLs that is a picture gz bak file       -->
  <filter action="drop" type="wildcard" pattern="*jpg" />
  <filter action="drop" type="wildcard" pattern="*gif" />
  <filter action="drop" type="wildcard" pattern="*bmp" />
  <filter action="drop" type="wildcard" pattern="*gz" />
  <filter action="drop" type="wildcard" pattern="*bak" />
 
  <!-- Exclude URLs within UNIX-style hidden files or directories       -->
  <filter action="drop" type="regexp" pattern="/\.[^/]*" />
 
</site>

 

参考:http://code.google.com/p/perlsitemapgenerator/wiki/Create

4)测试

   perl sitemap_gen.pl –config=testlist_config.xml –testing

   参考:README

   没问题,一切OK

4) 运行

   perl sitemap_gen.pl –config=testlist_config.xml

   没问题,一切OK, 成功生成sitemap.xml 并且通知了google的搜索引擎。

5)用gmail帐号登录 google, 使用向导创建一个自定义搜索引擎

6) 自定义搜索引擎后,在我的帐户->网站管理员工具->选择一条你创建自定义搜索引擎时使用的网站地址

   ->SiteMaps

   在我的 SiteMaps处输入 sitemap.xml

   然后点击【提交SiteMap】  
7) 在我的帐户->我的搜索引擎->针对刚才创建的搜索引擎->控制面板->编制索引

   在 按需编入索引 下选择刚才提交的 sitemap.xml,然后【Index Now】

   完成后,google提示成功刷新了索引。

8) 在我的帐户->我的搜索引擎->针对刚才创建的搜索引擎->控制面板->预览  中

   输入一个你的邮件列表中的关键词,执行搜索,结果没有搜到。别灰心,你需要等待大约2个小时。

   2小时以后再执行搜索,发现已经能够搜索到指定的关键词了。

   到这里,自定义搜索引擎创建,测试成功。

9)在我的帐户->我的搜索引擎->针对刚才创建的搜索引擎->控制面板->代码

   把 搜索框代码 下面的代码copy到要显示搜索框的网页中,比如邮件类表的索引页:threads.html中

   现在当我们访问邮件列表归档的时候,就可以看到搜索框了:

http://report.retailsolution.cn/mhonarchive/testlist/threads.html

   试着这行一个搜索,确实是我们期望的结果。

10)使用 cron job 周期执行  perl sitemap_gen.pl –config=testlist_config.xml

    可参考:http://www.linuxsir.org/main/?q=node/209

11)我们还可以创建另一个自定义搜索引擎,把我们要搜索的内容全部整合到一起。

    11.1) 建立一个脚本文件,为其他maillist创建sitemap:gen_maillist_sitemap.sh 内容如下:

sitemap_gen_path=/d01/sitemap_gen_perl 
export sitemap_gen_path 
perl $sitemap_gen_path/sitemap_gen.pl --config=$sitemap_gen_path/testlist_config.xml 
perl $sitemap_gen_path/sitemap_gen.pl --config=$sitemap_gen_path/channelproject-commits_config.xml 
perl $sitemap_gen_path/sitemap_gen.pl --config=$sitemap_gen_path/datafix_config.xml 
perl $sitemap_gen_path/sitemap_gen.pl --config=$sitemap_gen_path/handtech_config.xml 
perl $sitemap_gen_path/sitemap_gen.pl --config=$sitemap_gen_path/report-maillist_config.xml

 
    chmod 744 gen_maillist_sitemap.sh

    11.2)把这个脚本放到crontab 每天定时运行

    cd /etc

    cp crontab crontab.bak

    vi crontab ,  添加:

    02 4 * * * root /d01/sitemap_gen_perl/gen_maillist_sitemap.sh

    #每天 4时2分运行这个脚本

    #重启crond 服务

    service crond restart

    11.3) 建立一个自定义搜索引擎,把上述sitemap都包括进去。同时把属于retailsolution.cn域上的其他站点的sitemap也包括进去。

    这样可以形成一个对retailsolution.cn全域的搜索引擎

比如这个搜索引擎就可以搜索retaisolution.cn上的 report.retailsolution.cn,blog.retailsolution.cn,all maillist 
   

<!-- Google Customer serch engine begin -->
<form id="cse-search-box" action="http://www.google.com/cse">
  <div>
    <input type="hidden" value="016037023302352540634:y7c8yn6q_ra" name="cx" />
    <input type="hidden" value="UTF-8" name="ie" />
    <input style="border-right: #7e9db9 1px solid; padding-right: 2px; border-top: #7e9db9 1px solid; padding-left: 2px; background: url(http://www.google.com/coop/intl/zh-Hans/images/google_custom_search_watermark.gif) #ffffff no-repeat left 50%; padding-bottom: 2px; border-left: #7e9db9 1px solid; padding-top: 2px; border-bottom: #7e9db9 1px solid" size="31" name="q" />
    <input type="submit" value="搜索" name="sa" />
  </div>
</form>
 
<script src="http://www.google.com/coop/cse/brand?form=cse-search-box&amp;lang=zh-Hans" type="text/javascript"></script>
<!-- Google Customer serch engine End -->

完。

 

Issue:

Issue1: google自定义搜索引擎的不足,

主要有:       
    1) 索引的建立不稳定,或者说延迟太厉害,经验感受下:          
       1.1 testlist邮件列表的sitemap提交给googl后,第一次是在半小时后能看到效果。 第二次添加一篇文章 ,里面含有"测试GB2312” 这个字符串,我看到google控制台上已经显示该sitemap.xml对应的文章数增加了,我针对这个sitemap 运行了"index Now" 然后过了半小时去搜索"测试GB2312” 依然是没有结果。3小时以后才看到了期望的结果。经过多次试验发现一般在运行"Index Now"以后3小时可完成sitemap中URL对应页面的索引.           
       1.2 report-maillist邮件列表中有很多页面,其sitemap已经在1天前提交给google,由于当时没有点"Index Now",今天在自定义搜索引擎中搜索其中包含的关键词时,还是搜索不到,说明google未曾给它做索引。难道是说如果提交了某个sitemap,而没有手动"Index Now"的话,就不知道google要隔多久才会主动来抓取sitemap中的网页并建立索引了?。

     这个问题其实很严重,因为你跟普通用户去解释全文搜索需要隔N个小时才起作用,很难解释得通,所以,如果使用google自定义搜索引擎作为企业级的正式搜索引擎,可能不妥,因为在用户看来它显得不可靠,但作为一个备用搜索引擎还是可以的。或者作为一个个人站点的邮件列表的搜索引擎也还勉强凑活。

     如果要使用google自定义索引,建议能些个脚本自动为每个sitemap定期运行"Index Now" ,分析"Index Now"页面的源码可以看到其执行的http请求。我们也可以自己执行这些请求,可以为多个sitemap执行"Index Now"

 

http://www.google.com/coop/manage/cse/index?cx=016037023302352540634:y7c8yn6q_ra&amp;hl=zh-CN&amp;sig=__4TuuBdvPw7mRe-F4gl4lRNM-56w=&amp;qauth=kcmf3TVXwKibiK2x&amp;qinfo=zvq2LnMpaIo&amp;sitemap=http://report.retailsolution.cn/mhonarchive/testlist/sitemap.xml.gz
http://www.google.com/coop/manage/cse/index?cx=016037023302352540634:y7c8yn6q_ra&amp;hl=zh-CN&amp;sig=__4TuuBdvPw7mRe-F4gl4lRNM-56w=&amp;qauth=kcmf3TVXwKibiK2x&amp;qinfo=zvq2LnMpaIo&amp;sitemap=http://report.retailsolution.cn/mhonarchive/datafix/sitemap.xml.gz
http://www.google.com/coop/manage/cse/index?cx=016037023302352540634:y7c8yn6q_ra&amp;hl=zh-CN&amp;sig=__4TuuBdvPw7mRe-F4gl4lRNM-56w=&amp;qauth=kcmf3TVXwKibiK2x&amp;qinfo=zvq2LnMpaIo&amp;sitemap=http://report.retailsolution.cn/mhonarchive/handtech/sitemap.xml.gz
http://www.google.com/coop/manage/cse/index?cx=016037023302352540634:y7c8yn6q_ra&amp;hl=zh-CN&amp;sig=__4TuuBdvPw7mRe-F4gl4lRNM-56w=&amp;qauth=kcmf3TVXwKibiK2x&amp;qinfo=zvq2LnMpaIo&amp;sitemap=http://report.retailsolution.cn/mhonarchive/report-maillist/sitemap.xml.gz
http://www.google.com/coop/manage/cse/index?cx=016037023302352540634:y7c8yn6q_ra&amp;hl=zh-CN&amp;sig=__4TuuBdvPw7mRe-F4gl4lRNM-56w=&amp;qauth=kcmf3TVXwKibiK2x&amp;qinfo=zvq2LnMpaIo&amp;sitemap=http://report.retailsolution.cn/mhonarchive/channelproject-commits/sitemap.xml.gz

Over 

不过可惜,这些请求不能直接执行,需要登录。不过在google文档中提供了login的API的。文档参考:我的帐户->我的搜索引擎->文档->开发人员指南。有时间的时候可以继续研究。

      google帐户,有不同级别,不同级别的帐户在使用Index Now功能的时候有不同的限制,一般的帐户提交"Index Now"不管你的SiteMap中有多少条URL,google只会为其中级别最高(如果级别都一样,就是最后更新的)的10个页面建立索引。级别高的帐户可以一次获得更多数量的页面索引,此外"Index Now" 针对一个CSE限制只能一天执行一次(不过你有多少个SiteMap); 这个一天执行一次是官方说法,实际上可以做到每隔1小时执行一次。如果写程序来执行"Index Now"需要试验,因为Google的标准Service API中没有明确支持通过程序执行"Index Now"

            2009-01-31 经过多次测试发现,如果没有手动"Index Now" ,在提交了SiteMap以后经过3天也没有被Google Index进去,真是郁闷,我们总部能每天手动去"Index Now"吧,唉,即使手动去"Index Now" ,Google还做了上面的很多限制,你要靠Google来对你的站点进行全文检索?天大的笑话,真是幼稚。

           看来,即便是一个个人站点的搜索引擎也不能靠Google, 得另寻出路。网上有关于全文检索引擎的资料,下一步研究方向:1、Oracle 商业搜索引擎,2、开源搜索引擎。 对于开源搜索引擎,首先研究:Lucene , 可参考:http://www.chedong.com/tech/lucene.html

 

 

关于作者:

昵称:商云方
档案信息:顾问, HAND张江技术中心
联系方式:你可以通过yunfang.shang@hand-china.com联系作者
点击查看发表过的所有文章...
本文永久链接: http://blog.retailsolution.cn/archives/2229

 

 

对本文的评价:

 

 

  1. hansen.wang
    2009年2月25日02:47 | #1

    老大 我试了下这个生成的都是静态的网址吧,但论坛基本上都是动态的啊? 有没有更好的收集动态网址的工具啊

  2. 商云方
    2009年2月28日22:20 | #2

    这是针对静态网页的。
    动态网页一般需要平台软件提供的插件来解决。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.