[长篇/原创]为XX总署开发行业OO全文检索数据库(持续进行中)

  1. 云栖社区>
  2. 博客>
  3. 正文

[长篇/原创]为XX总署开发行业OO全文检索数据库(持续进行中)

五岳之巅 2011-11-05 21:58:37 浏览959
展开阅读全文


    这是知名XX的一个国家级OO,我提供技术支持。需要搜集所有与XX业有关的法律法规,并制作成一个数据库,并留出接口,有可能在官方网站提供该服务。

    中华人民共和国XXXX总署网站使用jsp编写,估计整站架构在J2EE上。对于那个庞大的系统而言,我个人只是个游击队员,做好我的事情,让他们iframe去吧。

    我打算使用Mysql(高于5的版本)+PHP完成。虽说Mysql内部已经支持FullText检索,但对于大量汉字而言,还是很不理想,如果数据量巨大,等待时间会很长。所以在网上搜寻解决方案。看到了Xunsearch的开源项目,看了他们的API,头有点大了,于是再找,所有线索都指向SCWS这个东东。最后突然发现:SCWS就是Xunsearch的爷爷。所以硬着头皮还是自己认真再搞吧。这是项目历史:

  1.     在 Xungle 项目的运作过程中,我们发现还有大量的用户出于各种原因,不得不自行解决搜索技术。此外, 我们发现了国外一个优秀的开源搜索引擎基础库 Xapian,它采用 C/C++ 开发,并且性能卓越,久经考验。 但是并没有整合中文分词,并且开发难度、复杂度也较大。于是我们下决心整合 Xapian 和 Scws,并在此基础上 提供更多、更常用的搜索功能。这就是 Xunsearch ,目前版本发布正在准备中,代码也已托管到 github 中。
    接着看看项目的许可协议,很好,很给力GPL。
  1.     Xunsearch (包含 SDK 在内) 是一个免费开源的全文搜索软件,在以下描述的 GPL 通用许可证的条款下发布。

    首先,我使用的是Win7(32Bit),Xunsearch需要Linux运行环境,正好是我的强项。下载Virtualbox(Opensource的,鄙视日常使用盗版VM)。
    网址是:virtualbox.org
img_9f8452fa785b5de01f123db078e63601.jpg
    
    然后去下载CentOS,登陆mirrors.sohu.com,选择合适的版本,我用的可是精简版哦。
img_61ffc53c6938055346884779cc5206f4.jpg
    ok,一边下着ISO一边安装并新建一个3G的虚拟机,我不是财迷只分3G空间,我用的是固态硬盘,一共才30个G。再说也没必要弄那么大,我估计2个G就够。建好后如下图:

img_d2c5754be494dcde373b17c8acd11bef.jpg

    接下来就是安装CentOS6。呵呵,固态硬盘真是给力,笔记本2分钟搞定系统安装,真的只有2分钟啊。系统重启,然后就是LAMP罗:
  1.   yum install mysql-server php php-mysql ntsysv
    在YUM的时候错了,闹出了一些小插曲,首先是虚拟机没IP,不知怎么回事,编辑几个文件,设定好。然后设置mirrors.sohu.com的yum源,把mirrors打成了mirror,让我好半天才找到这个错误。

    接着yum install wget,下载xunsearch-full-latest.tar.bz2稳定包,放到/opt下解压。
    郁闷的事来了,告诉我先是没有g++,我就装。又是没有make,我又装。后来告诉我没有c++的编译器。。。晕了,gcc不就能编译c++了么。。。怎么回事,又上网搜。最后找到一个gcc-c++软件包。安装,再次回来执行
  1.     sh setup.sh
    又出问题了,提示我zlib.h没找到。需要安装zlib1g-dev或者zlib-devel包。麻烦的,zlib1g-dev库里没有,安装的是zlib-devel。接着继续编译。千万别在error了,拜托。过了很久、很久,终于装好了。%>_

    看来用最小化的CentOS包下载简单,稍复杂点使用的时候就麻烦了。
    使用/opt/bin/xs-ctl.sh start/restart/stop可以开始、重启和关闭。
    按照安装建议,编辑/etc/rc.local文件加入/opt/bin/xs-ctl.sh start。

    后来发现问题,httpd启动了但从WIN7下访问不到。两天后我又重做了系统,按xunsearch的默认目录安装,还是访问不到。弄了半天,才发现Iptalbes给拒绝了。所以关闭iptables。就ok罗。
img_3e714be1b37063224b9c150a533cf397.png

    现在可以做测试了。vi index.php
img_b98a85e34ddcf5b6c3145ebc29e49044.png
    
    结果是这样的:
img_e2e850df195630fe29558ebc4afef5d2.jpg

    看来符合要求。

    后来才发现,在Linux下直接把这个PHP文件当作命令即可:
  1. [root@sm ~]# cd /usr/local/xunsearch/
  2. [root@sm xunsearch]# ls
  3. bin data etc include lib sdk share tmp
  4. [root@sm xunsearch]# ./sdk/php/util/
  5. Indexer.php Quest.php SearchSkel.php XSDataSource.class.php
  6. IniWizzard.php RequiredCheck.php skel/ XSUtil.class.php
  7. [root@sm xunsearch]# ./sdk/php/util/RequiredCheck.php
  8. Xunsearch PHP-SDK 运行需求检查
  9. ==============================

  10. 检查内容
  11. --------

  12. 本程序用于确认您的服务器配置是否能满足运行 Xunsearch PHP-SDK 的要求。
  13. 它将检查服务器所运行的 PHP 版本,查看是否安装了合适的PHP扩展模块,以及
  14. 确认 php.ini 文件是否正确设置。

  15. +------------+------------+--------------------------+--------------------------------+
  16. | 项目 | 结果 | 用于 | 备注 |
  17. +------------+------------+--------------------------+--------------------------------+
  18. | PHP 版本 | 5.3.8 | XS(core) | PHP 5.2.0 或更高版本是必须的。 |
  19. | SPL 扩展 | OK | XS(core) | SPL 扩展用于自动加载和对象戏法 |
  20. | PCRE 扩展 | OK | XSDocument, XSSearch | 用于字符串切割、判断 |
  21. | 编码转换 | mbstring | XSDocument, XSSearch | 用于支持非 UTF-8 字符集 |
  22. | 缓存模块 | WARNING | XS | 用于缓存项目配置文件的解析结果 |
  23. | JSON 扩展 | OK | util.Quest, util.Indexer | 用于读取或输出 JSON 格式的数据 |
  24. | XML 扩展 | OK | util.Indexer | 用于读取导入 XML 格式的数据 |
  25. | MySQL 扩展 | mysql | util.Indexer | 用于读取导入 MySQL 的数据库 |
  26. | SQLite 扩 | sqlite | util.Indexer | 用于读取导入 SQLite 的数据库 |
  27. +------------+------------+--------------------------+--------------------------------+

  28. 检查结果
  29. --------

  30. 共计 8 项通过,1 项警告,0 项错误。

  31. 您的服务器配置符合 Xunsearch/PHP-SDK 的最低要求。
  32. 如果您需要使用特定的功能,请关注上述的 WARNING 项。
  33. [root@sm xunsearch]# ls
  34. bin data etc include lib sdk share tmp
  35. [root@sm xunsearch]# ./bin/xs-ctl.sh restart
  36. INFO: stopping server[xs-indexd] (BIND:127.0.0.1:8383) .... [OK]
  37. INFO: re-starting server[xs-indexd] ... (BIND:127.0.0.1:8383)
  38. INFO: stopping server[xs-searchd] (BIND:127.0.0.1:8384) .... [OK]
  39. INFO: re-starting server[xs-searchd] ... (BIND:127.0.0.1:8384)
  40. ./bin/xs-ctl.sh: line 71: 5576 段错误 bin/xs-searchd -l tmp/searchd.log -b $bsearch -k $cmd
  41. [root@sm xunsearch]# ls
  42. bin data etc include lib sdk share tmp
  43. [root@sm xunsearch]# ll
  44. 总计 32
  45. drwxr-xr-x 2 root root 4096 12-01 21:46 bin
  46. drwxr-xr-x 2 root root 4096 12-01 21:46 data
  47. drwxr-xr-x 2 root root 4096 12-01 21:45 etc
  48. drwxr-xr-x 4 root root 4096 12-01 21:45 include
  49. drwxr-xr-x 3 root root 4096 12-01 21:45 lib
  50. drwxr-xr-x 3 root root 4096 12-01 21:46 sdk
  51. drwxr-xr-x 5 root root 4096 12-01 21:44 share
  52. drwxr-xr-x 2 root root 4096 12-01 22:13 tmp
  53. [root@sm xunsearch]# ls data/
  54. [root@sm xunsearch]# ls tmp/
  55. indexd.log pid.127_0_0_1_8383 pid.127_0_0_1_8384 searchd.log
  56. [root@sm xunsearch]# cat tmp/searchd.log
  57. 2011-12-01 22:13:48 searchd[26192] caught system exceptional signal[11], terminate immediately
  58. 2011-12-01 22:13:48 searchd[26194] bind() or listen() failed, error: Address already in use(#98)
  59. 2011-12-01 22:13:48 searchd[26194] socket server listen/bind failed
  60. 2011-12-01 22:17:06 searchd[5103] caught system exceptional signal[11], terminate immediately
  61. 2011-12-01 22:17:06 searchd[5105] succesful to spawn child worker[1] process (PID:5106)
  62. 2011-12-01 22:17:06 searchd[5105] succesful to spawn child worker[2] process (PID:5107)
  63. 2011-12-01 22:17:06 searchd[5105] succesful to spawn child worker[3] process (PID:5108)
  64. 2011-12-01 22:17:06 ~master[5105] search server is ready for waiting system signal (WORKER_NUM:3)
  65. 2011-12-01 22:17:06 worker1[5106] I came, happy to meet you
  66. 2011-12-01 22:17:06 worker1[5106] init the thread pool
  67. 2011-12-01 22:17:06 worker2[5107] I came, happy to meet you
  68. 2011-12-01 22:17:06 worker2[5107] init the thread pool
  69. 2011-12-01 22:17:06 worker3[5108] I came, happy to meet you
  70. 2011-12-01 22:17:06 worker3[5108] init the thread pool
  71. 2011-12-01 22:17:06 worker1[5106] event server start (FLAG:0x0004)
  72. 2011-12-01 22:17:06 worker2[5107] event server start (FLAG:0x0004)
  73. 2011-12-01 22:17:06 worker3[5108] event server start (FLAG:0x0004)
  74. 2011-12-01 22:21:07 ~master[5105] caught SIGINT, shutdown gracefully
  75. 2011-12-01 22:21:07 ~master[5105] broadcast exit signal[2] to all worker processes
  76. 2011-12-01 22:21:07 worker1[5106] caught SIGINT, shutdown gracefully
  77. 2011-12-01 22:21:07 worker1[5106] NULL connection pointer received, server quit gracefully
  78. 2011-12-01 22:21:07 worker1[5106] event server end
  79. 2011-12-01 22:21:07 worker1[5106] deinit the thread pool
  80. 2011-12-01 22:21:07 worker2[5107] caught SIGINT, shutdown gracefully
  81. 2011-12-01 22:21:07 worker2[5107] NULL connection pointer received, server quit gracefully
  82. 2011-12-01 22:21:07 worker2[5107] event server end
  83. 2011-12-01 22:21:07 worker2[5107] deinit the thread pool
  84. 2011-12-01 22:21:07 worker3[5108] caught SIGINT, shutdown gracefully
  85. 2011-12-01 22:21:07 worker3[5108] NULL connection pointer received, server quit gracefully
  86. 2011-12-01 22:21:07 worker3[5108] event server end
  87. 2011-12-01 22:21:07 worker3[5108] deinit the thread pool
  88. 2011-12-01 22:21:07 ~master[5105] child process worker[2] exit (PID:5107, STATUS:0)
  89. 2011-12-01 22:21:07 ~master[5105] child process worker[1] exit (PID:5106, STATUS:0)
  90. 2011-12-01 22:21:07 ~master[5105] child process worker[3] exit (PID:5108, STATUS:0)
  91. 2011-12-01 22:21:07 ~master[5105] byebye, I should exit now
  92. 2011-12-01 22:21:08 searchd[5576] caught system exceptional signal[11], terminate immediately
  93. 2011-12-01 22:21:08 searchd[5578] succesful to spawn child worker[1] process (PID:5579)
  94. 2011-12-01 22:21:08 searchd[5578] succesful to spawn child worker[2] process (PID:5580)
  95. 2011-12-01 22:21:08 searchd[5578] succesful to spawn child worker[3] process (PID:5581)
  96. 2011-12-01 22:21:08 ~master[5578] search server is ready for waiting system signal (WORKER_NUM:3)
  97. 2011-12-01 22:21:08 worker1[5579] I came, happy to meet you
  98. 2011-12-01 22:21:08 worker1[5579] init the thread pool
  99. 2011-12-01 22:21:08 worker1[5579] event server start (FLAG:0x0004)
  100. 2011-12-01 22:21:08 worker2[5580] I came, happy to meet you
  101. 2011-12-01 22:21:08 worker2[5580] init the thread pool
  102. 2011-12-01 22:21:08 worker3[5581] I came, happy to meet you
  103. 2011-12-01 22:21:08 worker3[5581] init the thread pool
  104. 2011-12-01 22:21:08 worker2[5580] event server start (FLAG:0x0004)
  105. 2011-12-01 22:21:08 worker3[5581] event server start (FLAG:0x0004)
  106. [root@sm xunsearch]# ./bin/xs-ctl.sh restart
  107. INFO: stopping server[xs-indexd] (BIND:127.0.0.1:8383) .... [OK]
  108. INFO: re-starting server[xs-indexd] ... (BIND:127.0.0.1:8383)
  109. INFO: stopping server[xs-searchd] (BIND:127.0.0.1:8384) .... [OK]
  110. INFO: re-starting server[xs-searchd] ... (BIND:127.0.0.1:8384)
  111. [root@sm xunsearch]# ls
  112. bin data etc include lib sdk share tmp
  113. [root@sm xunsearch]# ./sdk/php/util/Indexer.php --source=csv --clean demo
  114. 清空现有索引数据 ...
  115. 初始化数据源 ... csv
  116. WARNING: input file not specified, read data from STDIN>
  117. 开始批量导入数据 (请直接输入数据) ...
  118. 1,关于 xunsearch 的 DEMO 项目测试,项目测试是一个很有意思的行为!,1314336158
  119. 2,测试第二篇,这里是第二篇文章的内容,1314336160
  120. 3,项目测试第三篇,俗话说,无三不成礼,所以就有了第三篇,1314336168
  121. INFO: reach end of file or error occured, total lines: 3
  122. 完成索引导入:成功 3 条,失败 0 条
  123. 刷新索引提交 ...
  124. [root@sm xunsearch]#
    接着做测试:
  1. [root@sm xunsearch]# ./sdk/php/util/Quest.php demo 项目
  2. 在 3 条数据中,大约有 2 条包含 项目 ,第 1-2 条,用时:0.0307 秒。

  3. 1. 项目测试第三篇 #3# [100%]
  4. 俗话说,无三不成礼,所以就有了第三篇
  5. Chrono:1.31434e+09

  6. 2. 关于 xunsearch 的 DEMO 项目测试 #1# [98%]
  7. 项目测试是一个很有意思的行为!
  8. Chrono:1.31434e+09

  9. [root@sm xunsearch]# ./sdk/php/util/Quest.php demo 测试
  10. 在 3 条数据中,大约有 3 条包含 测试 ,第 1-3 条,用时:0.0071 秒。

  11. 1. 测试第二篇 #2# [100%]
  12. 这里是第二篇文章的内容
  13. Chrono:1.31434e+09

  14. 2. 项目测试第三篇 #3# [97%]
  15. 俗话说,无三不成礼,所以就有了第三篇
  16. Chrono:1.31434e+09

  17. 3. 关于 xunsearch 的 DEMO 项目测试 #1# [96%]
  18. 项目测试是一个很有意思的行为!
  19. Chrono:1.31434e+09

  20. [root@sm xunsearch]#
    其实,已经能够看到返回结果了。效果还不错。这个Demo展示了xunsearch的主要功能。最后看一下这个Demo的ini配置文件:
  1. [root@sm xunsearch]# cat ./sdk/php/app/demo.ini
  2. project.name = demo
  3. project.default_charset = utf-8
  4. server.index = 8383
  5. server.search = 8384

  6. [pid]
  7. type = id

  8. [subject]
  9. type = title

  10. [message]
  11. type = body

  12. [chrono]
  13. type = numeric

  14. [root@sm xunsearch]#
    其中8383是索引服务端口,8384是搜索服务端口。这两个端口一定都得正常运行才能提供有效服务。
    接下来,测试字段和布尔搜索功能:


  1. [root@sm xunsearch]# ./sdk/php/util/Indexer.php --flush-log demo
  2. 刷新搜索日志 ...
  3. 成功,注意:后台更新需要一些时间,并不是真正立即完成。
  4. [root@sm xunsearch]# ./sdk/php/util/Quest.php demo subject:测试
  5. 在 3 条数据中,大约有 3 条包含 subject:测试 ,第 1-3 条,用时:0.0095 秒。

  6. 1. 测试第二篇 #2# [100%]
  7. 这里是第二篇文章的内容
  8. Chrono:1.31434e+09

  9. 2. 项目测试第三篇 #3# [97%]
  10. 俗话说,无三不成礼,所以就有了第三篇
  11. Chrono:1.31434e+09

  12. 3. 关于 xunsearch 的 DEMO 项目测试 #1# [93%]
  13. 项目测试是一个很有意思的行为!
  14. Chrono:1.31434e+09

  15. [root@sm xunsearch]# ./sdk/php/util/Quest.php demo pid:2
  16. 在 3 条数据中,大约有 1 条包含 pid:2 ,第 1-1 条,用时:0.0060 秒。

  17. 1. 测试第二篇 #2# [100%]
  18. 这里是第二篇文章的内容
  19. Chrono:1.31434e+09

  20. [root@sm xunsearch]# ./sdk/php/util/Quest.php demo "第三篇 OR pid:1"
  21. 在 3 条数据中,大约有 2 条包含 第三篇 OR pid:1 ,第 1-2 条,用时:0.0066 秒。

  22. 1. 项目测试第三篇 #3# [100%]
  23. 俗话说,无三不成礼,所以就有了第三篇
  24. Chrono:1.31434e+09

  25. 2. 关于 xunsearch 的 DEMO 项目测试 #1# [0%]
  26. 项目测试是一个很有意思的行为!
  27. Chrono:1.31434e+09

  28. 相关搜索:第三

  29. [root@sm xunsearch]# ./sdk/php/util/Quest.php demo "第三篇 or pid:1"
  30. 在 3 条数据中,大约有 0 条包含 第三篇 or pid:1 ,第 0-0 条,用时:0.0056 秒。

  31. 相关搜索:第三

  32. [root@sm xunsearch]#
    这是再测试一下日志相关的搜索情况,其中 --suggest 是搜索建议,当用户敲入少许汉字或字母时给出相应的关键词建议(常用于搜索输入框下拉自动提示),而 --related 表示相关搜索、--hot 表示热门搜索、 --correct 表示搜索纠错。

    现在还暂时不涉及到编程,估计下一步就开始做开发了。但毕竟弄懂原理是第一位的。











网友评论

登录后评论
0/500
评论
五岳之巅
+ 关注