使用Lucene 构建强大的discuz 论坛搜索模块

作者 : admin 于 2010年07月27日, 14:21:18
2010
07-27

在我搞完公司的论坛优化后,我一直想写一个圈套的dz性能优化的方案。当时的全文检索使用的是公司内部某人开发的检索系统,没有开源,所以我做此方案来实现。
此文刚打完草稿,处于调试通过的状态。没有形成具体可用的用户文档。希望在这个底稿的基础上,朋友能给予测试和支持,以鼓励我做出一套完整的方案。

下载:lucene_dz

欢迎加入QQ讨论群:41886598

jar命令的一些应用

作者 : admin 于 2008年10月21日, 16:29:46
2008
10-21

对于我,最常用的两个功能,就是打包类库,创建可执行的JAR。

打包文件,可以看下边的功能呢个表:

功能 命令
用一个单独的文件创建一个 JAR 文件 jar cf jar-file input-file…
用一个目录创建一个 JAR 文件 jar cf jar-file dir-name
创建一个未压缩的 JAR 文件 jar cf0 jar-file dir-name
更新一个 JAR 文件 jar uf jar-file input-file…
查看一个 JAR 文件的内容 jar tf jar-file
提取一个 JAR 文件的内容 jar xf jar-file
从一个 JAR 文件中提取特定的文件 jar xf jar-file archived-file…
运行一个打包为可执行 JAR 文件的应用程序 java -jar app.jar

创建一个可执行 JAR 很容易。首先将所有应用程序代码放到一个目录中。假设应用程序中的主类是 com.mycompany.myapp.Sample 。您要创建一个包含应用程序代码的 JAR 文件并标识出主类。为此,在某个位置(不是在应用程序目录中)创建一个名为 manifest 的文件,并在其中加入以下一行: Main-Class: com.mycompany.myapp.Sample

引用地址:http://www-128.ibm.com/developerworks/cn/java/j-jar/index.html

WordPress使用Lucene进行搜索

作者 : admin 于 2008年10月18日, 13:52:56
2008
10-18

接上篇,我们使用Lucene Document Field IndexWrite 等方法创建了索引,现在,使用内建的搜索的方法进行检索。
代码如下:

  1. import java.io.*;
  2. import org.apache.lucene.index.Term;
  3. import org.apache.lucene.index.IndexReader;
  4. import org.apache.lucene.analysis.*;
  5. import org.apache.lucene.queryParser.QueryParser;
  6. import org.apache.lucene.search.*;
  7.  
  8. public class Search
  9. {
  10. public static void main( String argv[] ) throws Exception
  11. {
  12. IndexReader reader = IndexReader.open("./index");
  13. Searcher searcher = new IndexSearcher(reader);
  14. SimpleAnalyzeranalyzer = new SimpleAnalyzer();
  15. QueryParser parser = new QueryParser("post_content", analyzer);
  16. Query query = parser.parse( argv[0] );
  17. Hits hits = searcher.search(query);
  18. System.out.println(hits.length() + "个结果");
  19. for(int i=0;i
  20. {
  21. System.out.println(hits.doc(i).get("guid"));
  22. }
  23. }
  24. }

编译后,我们在命令行进行查询:

E:\java>java Search php
40个结果
http://www.sunboyu.cn/?p=332
http://www.sunboyu.cn/?p=164
http://www.sunboyu.cn/?p=213
http://www.sunboyu.cn/?p=123
http://www.sunboyu.cn/?p=124
http://www.sunboyu.cn/?p=180
http://www.sunboyu.cn/?p=283
http://www.sunboyu.cn/?p=282
http://www.sunboyu.cn/?p=234
http://www.sunboyu.cn/?p=53
http://www.sunboyu.cn/?p=159
http://www.sunboyu.cn/?p=235
http://www.sunboyu.cn/?p=221
http://www.sunboyu.cn/?p=73
http://www.sunboyu.cn/?p=11
http://www.sunboyu.cn/?p=51
http://www.sunboyu.cn/?p=240
http://www.sunboyu.cn/?p=196
http://www.sunboyu.cn/?p=52
http://www.sunboyu.cn/?p=308
http://www.sunboyu.cn/?p=298
http://www.sunboyu.cn/?p=9
http://www.sunboyu.cn/?page_id=38
http://www.sunboyu.cn/?p=236
http://www.sunboyu.cn/?p=320
http://www.sunboyu.cn/?p=141
http://www.sunboyu.cn/?p=78
http://www.sunboyu.cn/?p=291
http://www.sunboyu.cn/?p=218
http://www.sunboyu.cn/?p=154
http://www.sunboyu.cn/?p=121
http://www.sunboyu.cn/?p=200
http://www.sunboyu.cn/?p=244
http://www.sunboyu.cn/?p=280
http://www.sunboyu.cn/?page_id=112
http://www.sunboyu.cn/?p=288
http://www.sunboyu.cn/?p=292
http://www.sunboyu.cn/?p=20
http://www.sunboyu.cn/?p=130
http://www.sunboyu.cn/?p=87

E:\java>
可以看到,当我们搜索关键词“php”,返回了所有存在php关键词的链接。

当然,这个只是个简单的演示,在创建索引的时候,我们使用了SimpleAnalyzer的方法,这个方法对中文,其实就是基于单字的分词,对于中文信息检索基本是没有意义的。Lucene提供了开发的源代码,因为,我们可以很方便得为其附加我们自己的中文分词方法。

使用Lucene为WordPress创建索引

作者 : admin 于 2008年10月15日, 15:41:04
2008
10-15

上次说到Lucene的Document模型,现在,我们使用WordPress为例,为其创建索引。

分析wordpress数据库结构,我们只需要为标题内容,即主要的文本内容创建索引即可。

具体语句为:  SELECT ID,post_title,post_content,guid FROM wp_posts ORDER BY ID DESC

如下代码,mysql连接类用的上文的mysql类,代码风格还是很PHP。生成的索引全保存在当前的index文件夹下

E:\java\index 的目录

2008-10-16 14:40

.
2008-10-16 14:40 ..
2008-10-16 14:40 20 segments.gen
2008-10-16 14:40 98 segments_a4
2008-10-16 14:40 268,174 _a0.fdt
2008-10-16 14:40 2,600 _a0.fdx
2008-10-16 14:40 37 _a0.fnm
2008-10-16 14:40 20,990 _a0.frq
2008-10-16 14:40 1,304 _a0.nrm
2008-10-16 14:40 27,210 _a0.prx
2008-10-16 14:40 1,281 _a0.tii
2008-10-16 14:40 130,051 _a0.tis
2008-10-16 14:40 356 _a1.fdt
阅读全部 »

Lucene创建Document代码部分-循序渐进学Lucene

作者 : admin 于 2008年10月08日, 18:47:49
2008
10-8
  1. import java.io.*;
  2. import org.apache.lucene.document.Document;
  3. import org.apache.lucene.document.Field;
  4. import org.apache.lucene.index.IndexWriter;
  5. import org.apache.lucene.analysis.SimpleAnalyzer;
  6. public class Index
  7. {
  8. public static void main( String args[] )
  9. {
  10. Document doc = new Document();
  11. //注释1
  12. Field f1 = new Field("name1","value1",Field.Store.YES,Field.Index.TOKENIZED);
  13. Field f2 = new Field("name2","value2",Field.Store.YES,Field.Index.TOKENIZED);
  14. doc.add( f1 );
  15. doc.add( f2 );
  16. try
  17. {
  18. IndexWriter writer = new IndexWriter( "./" , new SimpleAnalyzer() , true );
  19. writer.addDocument( doc );
  20. writer.close();
  21. }
  22. catch (Exception e)
  23. {
  24.                        e.printStackTrace();
  25. }
  26. }
  27. }

注释1:Field方法的在2.0.0版本中有5种方法,在2.3.2中增加到了7种,详细用法请参阅官方文档
http://lucene.apache.org/java/2_0_0/api/org/apache/lucene/document/Field.html
http://lucene.apache.org/java/2_3_2/api/org/apache/lucene/document/Field.html

Lucene文档模型(Document)简解

作者 : admin 于 2008年10月04日, 11:39:51
2008
10-4

最近仔细研究了Lucene的文档模式,现用通俗语言来解释。

Lucene的索引,基本结构为 Index->Document->Field 这样可以构建一个非关系型二维结构,由不同field构成的一个Document,由不同的Document构成的Index。

Lucene的Field方法很丰富,在2.0版本以后,由三种Field类型增加到了5种,支持三种数据流的传入方式(字符串,读取,二进制传入),支持数据的存储,索引,分词。

而我们使用Lucene的主要功能在于分词和生成索引。具体应用待详细使用后介绍。

我的一个Java程序

作者 : admin 于 2008年10月03日, 17:42:56
2008
10-3

PHP总有其局限性,比如解释型语言在速度上的弱点,制约了它在效率方面的发挥。facebook开放了源代码,其底层大都是c来编写,而我现在计划用Java为一些服务写后台,这是我的第一个Java程序,希望大家多批评,虽然上边依然有太多php的影子。

  1. import java.sql.*;
  2. /*
  3.  *  Java Mysql数据库连接类
  4.  *  我的第一个java程序
  5.  */
  6. public class MysqlConn
  7. {
  8. private String dsn = "jdbc:mysql://localhost:3306/test";
  9. private String username = "root";
  10. private String password = "123456";
  11.  
  12. private Connection conn = null;
  13. private Statement stmt = null;
  14. private ResultSet rs = null;
  15.  
  16.  
  17.  
  18.  
  19.     public void MysqlConn()
  20. {
  21. }
  22.     //初始化连接参数
  23. public void SetDsn( String Dsn )
  24. {
  25. this.dsn = Dsn;
  26. }
  27. //初始化用户名密码
  28. public void SetUserPass( String Username , String Password )
  29. {
  30. this.username = Username;
  31. this.password = Password;
  32. }
  33. //连接函数
  34. public void Conn()
  35. {
  36. try
  37. {
  38. //加载Connetc/J驱动
  39. //Class.forName("com.mysql.jdbc.Driver");
  40. Class.forName("org.gjt.mm.mysql.Driver");
  41. //开始连接
  42. this.conn = DriverManager.getConnection( this.dsn , this.username , this.password );
  43. this.stmt = this.conn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE , ResultSet.CONCUR_UPDATABLE );
  44. }
  45. catch(SQLException ex)
  46. {
  47. System.out.println("Error : " + ex.toString());
  48. System.out.println("没有找到JDBC/ODBC驱动程序!");
  49. System.exit(0);
  50. }
  51. catch(Exception e)
  52. {
  53. System.out.println("Errors: " + e.toString());
  54. System.exit(0);
  55. }
  56. }
  57.     //返回结果集
  58. public ResultSet sqlQuery( String sql )
  59. {
  60. try
  61. {
  62. this.rs = this.stmt.executeQuery( sql );
  63. }
  64. catch (SQLException ex)
  65. {
  66. System.out.println("Error : " + ex.toString());
  67. System.exit(0);
  68. }
  69. catch (Exception ex)
  70. {
  71. System.out.println("Error : " + ex.toString());
  72. System.exit(0);
  73. }
  74. return rs;
  75. }
  76. //执行 update,insert之类
  77. public void Exec( String sql )
  78. {
  79. try
  80. {
  81. this.stmt.executeUpdate( sql )
  82. }
  83. catch (SQLException ex)
  84. {
  85. System.out.println("Error : " + ex.toString());
  86. System.exit(0);
  87. }
  88. catch (Exception ex)
  89. {
  90. System.out.println("Error : " + ex.toString());
  91. System.exit(0);
  92. }
  93. }
  94.  
  95. }