lucene和JDBC

项目结构:

运行效果:

1.搜索关键字"是"

2.搜索关键字"我"

==========================================

数据库中表信息:

1 CREATE TABLE `mymails` (
2   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
3   `name` varchar(50) DEFAULT NULL COMMENT '寄件人',
4   `email` varchar(50) DEFAULT NULL COMMENT '件邮名称',
5   `content` varchar(200) DEFAULT NULL COMMENT '内容',
6   `attach` int(11) DEFAULT NULL COMMENT '附件数',
7   `sendtime` varchar(20) DEFAULT NULL COMMENT '发送日期',
8   PRIMARY KEY (`id`)
9 ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

==========================================

代码部分:

==========================================

/lucene_0500_jdbc/src/com/b510/lucene/util/LuceneUtil.java

  1 /**
  2  * 
  3  */
  4 package com.b510.lucene.util;
  5 
  6 import java.io.File;
  7 import java.io.IOException;
  8 import java.sql.Connection;
  9 import java.sql.DriverManager;
 10 import java.sql.PreparedStatement;
 11 import java.sql.ResultSet;
 12 import java.sql.SQLException;
 13 import java.util.HashMap;
 14 import java.util.Map;
 15 
 16 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 17 import org.apache.lucene.document.Document;
 18 import org.apache.lucene.document.Field;
 19 import org.apache.lucene.document.NumericField;
 20 import org.apache.lucene.index.CorruptIndexException;
 21 import org.apache.lucene.index.IndexReader;
 22 import org.apache.lucene.index.IndexWriter;
 23 import org.apache.lucene.index.IndexWriterConfig;
 24 import org.apache.lucene.index.Term;
 25 import org.apache.lucene.search.IndexSearcher;
 26 import org.apache.lucene.search.ScoreDoc;
 27 import org.apache.lucene.search.TermQuery;
 28 import org.apache.lucene.search.TopDocs;
 29 import org.apache.lucene.store.Directory;
 30 import org.apache.lucene.store.FSDirectory;
 31 import org.apache.lucene.store.LockObtainFailedException;
 32 import org.apache.lucene.util.Version;
 33 
 34 /**
 35  * @author Hongten <br />
 36  * @date 2013-1-31
 37  */
 38 public class LuceneUtil {
 39     
 40     private static String driver = "com.mysql.jdbc.Driver";
 41     private static String dbName = "db_lucene";
 42     private static String passwrod = "root";
 43     private static String userName = "root";
 44     private static String url = "jdbc:mysql://localhost:3308/" + dbName;
 45 
 46     private Directory directory = null;
 47     /**
 48      * 评分
 49      */
 50     private Map<String, Float> scores = new HashMap<String, Float>();
 51 
 52     public LuceneUtil() {
 53         try {
 54             scores.put("sina.com", 1.0f);
 55             scores.put("foxmail.com", 1.1f);
 56             directory = FSDirectory.open(new File("D:/WordPlace/lucene/lucene_0500_jdbc/lucene/index"));
 57         } catch (IOException e) {
 58             e.printStackTrace();
 59         }
 60     }
 61 
 62     /**
 63      * 创建索引
 64      */
 65     public void index() {
 66         IndexWriter writer = null;
 67         try {
 68             writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_35, new StandardAnalyzer(Version.LUCENE_35)));
 69             // 删除之前所建立的全部索引
 70             writer.deleteAll();
 71             // 创建文档
 72             Document document = null;
 73 
 74             String sql = "select * from mymails";
 75             ResultSet rs = null;
 76             try {
 77                 Class.forName(driver);
 78                 Connection conn = DriverManager.getConnection(url, userName, passwrod);
 79                 PreparedStatement ps = conn.prepareStatement(sql);
 80                 rs = ps.executeQuery();
 81 
 82                 while (rs.next()) {
 83                     System.out.println("id:[" + rs.getString("id") + "] name:[" + rs.getString("name") + "] content:[" + rs.getString("content") + "]");
 84 
 85                     document = new Document();
 86                     document.add(new Field("id", rs.getString("id"), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
 87                     document.add(new Field("email", rs.getString("email"), Field.Store.YES, Field.Index.NOT_ANALYZED));
 88                     document.add(new Field("content", rs.getString("content"), Field.Store.YES, Field.Index.ANALYZED));
 89                     document.add(new Field("name", rs.getString("name"), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));
 90                     document.add(new NumericField("attach", Field.Store.YES, true).setIntValue(Integer.valueOf(rs.getString("attach"))));
 91                     document.add(new Field("date", rs.getString("sendtime"), Field.Store.YES, Field.Index.ANALYZED));
 92 
 93                     // 这里进行加权处理
 94                     String et = rs.getString("email").substring(rs.getString("email").lastIndexOf("@") + 1);
 95                     System.out.println(et);
 96                     if (scores.containsKey(et)) {
 97                         document.setBoost(scores.get(et));
 98                     } else {
 99                         document.setBoost(0.6f);
100                     }
101                     writer.addDocument(document);
102 
103                 }
104 
105                 // 关闭记录集
106                 if (rs != null) {
107                     try {
108                         rs.close();
109                     } catch (SQLException e) {
110                         e.printStackTrace();
111                     }
112                 }
113 
114                 // 关闭声明
115                 if (ps != null) {
116                     try {
117                         ps.close();
118                     } catch (SQLException e) {
119                         e.printStackTrace();
120                     }
121                 }
122 
123                 // 关闭链接对象
124                 if (conn != null) {
125                     try {
126                         conn.close();
127                     } catch (SQLException e) {
128                         e.printStackTrace();
129                     }
130                 }
131 
132             } catch (Exception e) {
133                 e.printStackTrace();
134             }
135 
136         } catch (CorruptIndexException e) {
137             e.printStackTrace();
138         } catch (LockObtainFailedException e) {
139             e.printStackTrace();
140         } catch (IOException e) {
141             e.printStackTrace();
142         } finally {
143             if (writer != null) {
144                 try {
145                     writer.close();
146                 } catch (CorruptIndexException e) {
147                     e.printStackTrace();
148                 } catch (IOException e) {
149                     e.printStackTrace();
150                 }
151             }
152         }
153     }
154 
155     /**
156      * 搜索
157      */
158     public void search(String key) {
159         try {
160             IndexReader reader = IndexReader.open(directory);
161             IndexSearcher searcher = new IndexSearcher(reader);
162             TermQuery query = new TermQuery(new Term("content", key));
163             TopDocs tds = searcher.search(query, 12);
164             for (ScoreDoc sd : tds.scoreDocs) {
165                 Document doc = searcher.doc(sd.doc);
166                 System.out.println("文档序号:[" + sd.doc + "] 得分:[" + sd.score + "] 邮件名称:[" + doc.get("email") + "] 邮件人:[" + doc.get("name") + "] 附件数:[" + doc.get("attach") + "] 日期:[" + doc.get("date")
167                         + "] 内容 : [" + doc.get("content") + "]");
168             }
169         } catch (CorruptIndexException e) {
170             e.printStackTrace();
171         } catch (IOException e) {
172             e.printStackTrace();
173         }
174     }
175 }

/lucene_0500_jdbc/src/com/b510/lucene/test/IndexTest.java

 1 /**
 2  * 
 3  */
 4 package com.b510.lucene.test;
 5 
 6 import org.junit.Test;
 7 
 8 import com.b510.lucene.util.LuceneUtil;
 9 
10 /**
11  * @author Hongten <br />
12  * @date 2013-1-31
13  */
14 public class IndexTest {
15 
16     @Test
17     public void testIndex(){
18         LuceneUtil util = new LuceneUtil();
19         util.index();
20     }
21     
22     @Test
23     public void testSearch(){
24         LuceneUtil util = new LuceneUtil();
25         util.search("我");
26     }
27     
28 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程心路

SSH框架之旅-hibernate(3)

表 A 中的一条记录只能和表 B 的一条记录,反之亦然。这种关系的表并不常见,因为既然可以存放在两张表中的数据,也可以用一张表来存放。一对一的表关系用于: 1...

972
来自专栏CaiRui

SQLAlchemy外键的使用

orm可以将数据库存储的数据封装成对象,同时,如果封装的好的话,所有的数据库操作都可以封装到对象中。这样的代码在组织结构上会非常的清晰,并且相对与使用sql语句...

2725
来自专栏技术专栏

SQL 编写技巧总结(持续更新中)

参考 http://blog.csdn.net/bitcarmanlee/article/details/51926530

1863
来自专栏编码小白

ofbiz实体引擎(八) 创建表

/** * @author 郑小康 * * 1.检验实体是否为空 * * 2.检验视图实体是否为空 ...

2813
来自专栏转载gongluck的CSDN博客

逆转字符串

逆转字符串——输入一个字符串,将其逆转并输出 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #inc...

2894
来自专栏乐沙弥的世界

PL/SQL --> 语言基础

PL/SQL是过程化的SQL语言,是ORACLE对SQL语言的扩展,在普通SQL语句的基础上增加了编程语言的特点。使得该语言不仅具有过程编程语

1113
来自专栏杨建荣的学习笔记

通过java程序抽取日志中的sql语句(r4笔记第4天)

今天在翻看以前的笔记时,发现自己在很早之前写过一个java程序,能够解析日志中的sql语句。 当时使用的环境是weblogic,日志目录下总是有几十上百个日志文...

3106
来自专栏Jackson0714

基础很重要~~04.表表达式-上篇

34512
来自专栏Java呓语

第11章、数据类型

关键字 INT 是 INTEGER 的别名,关键字 DEC 和 FIXED 是 DECIMAL的别名。 在 MyISAM/MEMORY/InnoDB和NDB表...

1022
来自专栏c#开发者

Oracle 最常用功能函数经典汇总

Oracle 最常用功能函数经典汇总 SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(...

4287

扫码关注云+社区

领取腾讯云代金券