由于对lucene比较感兴趣,本人在网上找了点资料,终于成功地用lucene对mysql数据库进行索引创建并成功搜索,先总结如下:

首先介绍一个jdbc工具类,用于得到Connection对象:

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.SQLException;
  4. /**
  5. * JdbcUtil.java
  6. * @version 1.0
  7. * @createTime JDBC获取Connection工具类
  8. */
  9. public class JdbcUtil {
  10. private static Connection conn = null;
  11. private static final String URL = "jdbc:mysql://127.0.0.1/project?autoReconnect=true&characterEncoding=utf8";
  12. private static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
  13. private static final String USER_NAME = "root";
  14. private static final String PASSWORD = "";
  15. public static Connection getConnection() {
  16. try {
  17. Class.forName(JDBC_DRIVER);
  18. conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
  19. } catch (ClassNotFoundException e) {
  20. e.printStackTrace();
  21. } catch (SQLException e) {
  22. e.printStackTrace();
  23. }
  24. return conn;
  25. }
  26. }

然后就是本文的主要内容了,对数据库信息进行索引与对索引进行搜索:

  1. import java.io.File;
  2. import java.sql.Connection;
  3. import java.sql.ResultSet;
  4. import java.sql.Statement;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import org.apache.lucene.analysis.Analyzer;
  8. import org.apache.lucene.document.Document;
  9. import org.apache.lucene.document.Field;
  10. import org.apache.lucene.document.Field.TermVector;
  11. import org.apache.lucene.index.IndexWriter;
  12. import org.apache.lucene.queryParser.QueryParser;
  13. import org.apache.lucene.search.*;
  14. import org.apache.lucene.store.Directory;
  15. import org.apache.lucene.store.FSDirectory;
  16. import org.apache.lucene.util.Version;
  17. import org.wltea.analyzer.lucene.IKAnalyzer;
  18. import org.wltea.analyzer.lucene.IKSimilarity;
  19. /**
  20. * SearchLogic.java
  21. * @version 1.0
  22. * @createTime Lucene数据库检索
  23. */
  24. public class SearchLogic {
  25. private static Connection conn = null;
  26. private static Statement stmt = null;
  27. private static  ResultSet rs = null;
  28. private String searchDir = "E:\\Test\\Index";
  29. private static File indexFile = null;
  30. private static Searcher searcher = null;
  31. private static Analyzer analyzer = null;
  32. /** 索引页面缓冲 */
  33. private int maxBufferedDocs = 500;
  34. /**
  35. * 获取数据库数据
  36. * @return ResultSet
  37. * @throws Exception
  38. */
  39. public List<SearchBean> getResult(String queryStr) throws Exception {
  40. List<SearchBean> result = null;
  41. conn = JdbcUtil.getConnection();
  42. if(conn == null) {
  43. throw new Exception("数据库连接失败!");
  44. }
  45. String sql = "select id, username, password, type from account";
  46. try {
  47. stmt = conn.createStatement();
  48. rs = stmt.executeQuery(sql);
  49. this.createIndex(rs);   //给数据库创建索引,此处执行一次,不要每次运行都创建索引,以后数据有更新可以后台调用更新索引
  50. TopDocs topDocs = this.search(queryStr);
  51. ScoreDoc[] scoreDocs = topDocs.scoreDocs;
  52. result = this.addHits2List(scoreDocs);
  53. } catch(Exception e) {
  54. e.printStackTrace();
  55. throw new Exception("数据库查询sql出错! sql : " + sql);
  56. } finally {
  57. if(rs != null) rs.close();
  58. if(stmt != null) stmt.close();
  59. if(conn != null) conn.close();
  60. }
  61. return result;
  62. }
  63. /**
  64. * 为数据库检索数据创建索引
  65. * @param rs
  66. * @throws Exception
  67. */
  68. private void createIndex(ResultSet rs) throws Exception {
  69. Directory directory = null;
  70. IndexWriter indexWriter = null;
  71. try {
  72. indexFile = new File(searchDir);
  73. if(!indexFile.exists()) {
  74. indexFile.mkdir();
  75. }
  76. directory = FSDirectory.open(indexFile);
  77. analyzer = new IKAnalyzer();
  78. indexWriter = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED);
  79. indexWriter.setMaxBufferedDocs(maxBufferedDocs);
  80. Document doc = null;
  81. while(rs.next()) {
  82. doc = new Document();
  83. Field id = new Field("id", String.valueOf(rs.getInt("id")), Field.Store.YES, Field.Index.NOT_ANALYZED, TermVector.NO);
  84. Field username = new Field("username", rs.getString("username") == null ? "" : rs.getString("username"), Field.Store.YES,Field.Index.ANALYZED, TermVector.NO);
  85. doc.add(id);
  86. doc.add(username);
  87. indexWriter.addDocument(doc);
  88. }
  89. indexWriter.optimize();
  90. indexWriter.close();
  91. } catch(Exception e) {
  92. e.printStackTrace();
  93. }
  94. }
  95. /**
  96. * 搜索索引
  97. * @param queryStr
  98. * @return
  99. * @throws Exception
  100. */
  101. private TopDocs search(String queryStr) throws Exception {
  102. if(searcher == null) {
  103. indexFile = new File(searchDir);
  104. searcher = new IndexSearcher(FSDirectory.open(indexFile));
  105. }
  106. searcher.setSimilarity(new IKSimilarity());
  107. QueryParser parser = new QueryParser(Version.LUCENE_30,"username",new IKAnalyzer());
  108. Query query = parser.parse(queryStr);
  109. TopDocs topDocs = searcher.search(query, searcher.maxDoc());
  110. return topDocs;
  111. }
  112. /**
  113. * 返回结果并添加到List中
  114. * @param scoreDocs
  115. * @return
  116. * @throws Exception
  117. */
  118. private List<SearchBean> addHits2List(ScoreDoc[] scoreDocs ) throws Exception {
  119. List<SearchBean> listBean = new ArrayList<SearchBean>();
  120. SearchBean bean = null;
  121. for(int i=0 ; i<scoreDocs.length; i++) {
  122. int docId = scoreDocs[i].doc;
  123. Document doc = searcher.doc(docId);
  124. bean = new SearchBean();
  125. bean.setId(doc.get("id"));
  126. bean.setUsername(doc.get("username"));
  127. listBean.add(bean);
  128. }
  129. return listBean;
  130. }
  131. public static void main(String[] args) {
  132. SearchLogic logic = new SearchLogic();
  133. try {
  134. Long startTime = System.currentTimeMillis();
  135. List<SearchBean> result = logic.getResult("商家");
  136. int i = 0;
  137. for(SearchBean bean : result) {
  138. if(i == 10)
  139. break;
  140. System.out.println("bean.name " + bean.getClass().getName() + " : bean.id " + bean.getId()+ " : bean.username " + bean.getUsername());
  141. i++;
  142. }
  143. System.out.println("searchBean.result.size : " + result.size());
  144. Long endTime = System.currentTimeMillis();
  145. System.out.println("查询所花费的时间为:" + (endTime-startTime)/1000);
  146. } catch (Exception e) {
  147. e.printStackTrace();
  148. System.out.println(e.getMessage());
  149. }
  150. }
  151. }

对了上面的类还用到了一个javabean类,如下:

  1. public class SearchBean {
  2. private String id;
  3. private String username;
  4. public String getId() {
  5. return id;
  6. }
  7. public void setId(String id) {
  8. this.id = id;
  9. }
  10. public String getUsername() {
  11. return username;
  12. }
  13. public void setUsername(String username) {
  14. this.username = username;
  15. }
  16. }

这些代码大部分都是我在网上找到的doc文档中复制粘贴而来,本着“拿来主义”,我对这些代码修改不大,经测试,这些代码能够正常运行。

写了几篇博客,对lucene的使用方式也越来越清楚,在这里也很有必要总结一下:

使用lucene包括两个步骤,分别是索引和搜索。

•索引过程如下:
       ◦ 创建一个IndexWriter用来写索引文件,它有几个参数,INDEX_DIR就是索引文件所存放的位置,Analyzer便是用来对文档进行词法分析和语言处理的。
       ◦ 创建一个Document代表我们要索引的文档。
       ◦ 将不同的Field加入到文档中。我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等。不同类型的信息用不同的Field来表示。
       ◦ IndexWriter调用函数addDocument将索引写到索引文件夹中。
    •搜索过程如下:
       ◦ IndexReader将磁盘上的索引信息读入到内存,INDEX_DIR就是索引文件存放的位置。
       ◦ 创建IndexSearcher准备进行搜索。
       ◦ 创建Analyer用来对查询语句进行词法分析和语言处理。
       ◦ 创建QueryParser用来对查询语句进行语法分析。
       ◦ QueryParser调用parser进行语法分析,形成查询语法树,放到Query中。
       ◦ IndexSearcher调用search对查询语法树Query进行搜索,得到结果TopScoreDocCollector。

对了,必须说一下,上面的例子还用到了一个新的jar包IKAnalyzer.jar包,它是一个开源的中文分词器,如果不使用这个分词器,那么将无法解析中文,比如说我的第一篇关于Lucene的博客就无法解析中文字符串!

lucene索引并搜索mysql数据库[转]的更多相关文章

  1. 理解Lucene索引与搜索过程中的核心类

    理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.ƒDirectory.ƒAnalyzer.ƒDocument.ƒField 1.IndexWriter IndexWr ...

  2. PHP搜索MYSQL数据库加分页浏览小结

    PHP搜索加分页浏览小结: 1 分页后再做搜索 2 这里对于url的拼接,以及模糊查询,搜索时候的显示添加,SQL语句的拼接 3 对于页面传递过来的超级链接的变量,如果不存在就要设置,对于可能抛出异常 ...

  3. Lucene 索引功能

    Lucene 数据建模 基本概念 文档(doc): 文档是 Lucene 索引和搜索的原子单元,文档是一个包含多个域的容器. 域(field): 域包含“真正的”被搜索的内容,每一个域都有一个标识名称 ...

  4. mysql数据库详解

    001 数据库应用系统设计 1.规划   2.需求分析   3.概念模型设计   4.逻辑设计   5.物理设计   6.程序编制及调试   7.运行及维护. 002 创建数据库 CREATE DAT ...

  5. MySQL数据库和InnoDB存储引擎文件

    参数文件 当MySQL示例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了某种内存结构有多大等.在默认情况下,MySQL实例会按照一定 ...

  6. lucene索引

    一.lucene索引 1.文档层次结构 索引(Index):一个索引放在一个文件夹中: 段(Segment):一个索引中可以有很多段,段与段之间是独立的,添加新的文档可能产生新段,不同的段可以合并成一 ...

  7. MYSQL数据库的日志文件

    日志文件:用来记录MySQL实例对某种条件做出响应时写入的文件.如错误日志文件.二进制日志文件.慢查询日志文件.查询日志文件等. 错误日志 show variables like 'log_error ...

  8. MySQL数据库文件

    MySQL数据库文件 本文档从MySQL数据库和存储引擎层面介绍各种类型的文件. 参数文件(my.cnf) 错误日志(error log) 二进制日志文件(binary log) 慢查询日志(slow ...

  9. 用Lucene.net对数据库建立索引及搜索<转>

    用Lucene.net对数据库建立索引及搜索 最近我一直在研究 Lucene.net ,发现Lucene.net对数据库方面建索引的文章在网上很少见,其实它是可以对数据库进行索引的,我闲着没事,写了个 ...

随机推荐

  1. pyramid的第一个项目

    1,安装pyramid --在次之前最好先安装python virtualenv --python virtualenv ---激活方式pyenv activate pip install pyram ...

  2. HTML -- 元素和属性

    HTML -- 元素 HTML元素是从开始标签到结束标签之间的代码,如: <!-- 加粗标签 --> <b>一些元素</b> <!-- 换行 --> & ...

  3. Mvc基础(1)

  4. JAVA 反射特性

    1.   反射(概念):程序在运行期可以改变程序结构和变量类型,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力. 2.   反射的特性: •在运行时判断任意一个对象所属的类 •在运行时构造 ...

  5. hdu 4111 Alice and Bob

    组合游戏题: 组合游戏的规则: 1.必败态的所有后继都是必胜态: 2.必胜态最少有一个必败的后继: 这里的必胜态是f[1][0][0][0]; 其中f[a][b][c][d]表示有a个1,b个2,c个 ...

  6. DZ真是各种强大

    近期对论坛做了大装修,非常享受这个过程. 真是着迷了,这个装修工程让我接连几天几乎到了废寝忘食的地步. 终于告一段落,又想起来折腾,因为对之前的文库系统感觉种种别扭. 没有空调,没有风扇,居然忙到夜里 ...

  7. mysql Partition(分区)初探

    mysql Partition(分区)初探   表数据量大的时候一般都考虑水平拆分,即所谓的sharding.不过mysql本身具有分区功能,可以实现一定程度 的水平切分.  mysql是具有MERG ...

  8. The APR based Apache Tomcat Native library

    Tomcat启动的时候出现下面这样的提示: 2015-11-06 14:24:12 org.apache.catalina.core.AprLifecycleListener init 信息: The ...

  9. [转贴]C语言复习笔记-17种小算法-解决实际问题

    判断日期为一年中的第几天(考虑闰年) /* * 计算该日在本年中是第几天,注意闰年问题 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 * 特殊情况,闰年且输入月份大于3时 ...

  10. Android JNI使用方法

    经过几天的努力终于搞定了android JNI部分,下面将我的这个小程序和大家分享一下.android JNI是连接android Java部分和C/C++部分的纽带,完整使用JNI需要Java代码和 ...