Lucene检索数据库支持中文检索.docx
- 文档编号:11214307
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:28
- 大小:29.29KB
Lucene检索数据库支持中文检索.docx
《Lucene检索数据库支持中文检索.docx》由会员分享,可在线阅读,更多相关《Lucene检索数据库支持中文检索.docx(28页珍藏版)》请在冰豆网上搜索。
Lucene检索数据库支持中文检索
全文分两部分:
一:
Lucene简介
Lucene版本:
3.0.2
全文检索大体分两个部分:
索引创建(Indexing)和搜索索引(Search)
1.索引过程:
1)有一系列被索引文件(此处所指即数据库数据)
2)被索引文件经过语法分析和语言处理形成一系列词(Term)。
3)经过索引创建形成词典和反向索引表。
4)通过索引存储将索引写入硬盘。
2.搜索过程:
a)用户输入查询语句。
b)对查询语句经过语法分析和语言分析得到一系列词(Term)。
c)通过语法分析得到一个查询树。
d)通过索引存储将索引读入到内存。
e)利用查询树搜索索引,从而得到每个词(Term)的文档链表,对文档链表进行交,差,并得到结果文档。
f)将搜索到的结果文档对查询的相关性进行排序。
g)返回查询结果给用户。
•索引过程如下:
◦创建一个IndexWriter用来写索引文件,它有几个参数,INDEX_DIR就是索引文件所存放的位置,Analyzer便是用来对文档进行词法分析和语言处理的。
◦创建一个Document代表我们要索引的文档。
◦将不同的Field加入到文档中。
我们知道,一篇文档有多种信息,如题目,作者,修改时间,内容等。
不同类型的信息用不同的Field来表示,在本例子中,一共有两类信息进行了索引,一个是文件路径,一个是文件内容。
其中FileReader的SRC_FILE就表示要索引的源文件。
◦IndexWriter调用函数addDocument将索引写到索引文件夹中。
•搜索过程如下:
◦IndexReader将磁盘上的索引信息读入到内存,INDEX_DIR就是索引文件存放的位置。
◦创建IndexSearcher准备进行搜索。
◦创建Analyer用来对查询语句进行词法分析和语言处理。
◦创建QueryParser用来对查询语句进行语法分析。
◦QueryParser调用parser进行语法分析,形成查询语法树,放到Query中。
◦IndexSearcher调用search对查询语法树Query进行搜索,得到结果TopScoreDocCollector。
二:
代码示例(本文重点部分)
1)首先是连接数据库的jdbc配置文件信息以及存放索引文件的路径配置信息
Test.properties代码
1.jdbc.driverClassName = com.mysql.jdbc.Driver
2.jdbc.url = jdbc:
mysql:
//192.168.0.1/dbname?
autoReconnect=true&characterEncoding=utf8
3.jdbc.username = root
4.jdbc.password = password
5.jdbc.maxIdle = 2
6.jdbc.maxActive = 4
7.jdbc.maxWait = 5000
8.jdbc.validationQuery = select 0
9.res.index.indexPath = D\:
\\apache-tomcat-6.0.18\\webapps\\test\\testHome\\search\\res\\index1
10.res.index.mainDirectory = D\:
\\apache-tomcat-6.0.18\\webapps\\test\\testHome\\search\\res
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:
mysql:
//192.168.0.1/dbname?
autoReconnect=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=password
jdbc.maxIdle=2
jdbc.maxActive=4
jdbc.maxWait=5000
jdbc.validationQuery=select0
res.index.indexPath=D\:
\\apache-tomcat-6.0.18\\webapps\\test\\testHome\\search\\res\\index1
res.index.mainDirectory=D\:
\\apache-tomcat-6.0.18\\webapps\\test\\testHome\\search\\res
2)读取资源文件的工具类:
Java代码
1.package mon;
2.
3.import java.io.IOException;
4.import java.io.InputStream;
5.import java.util.HashMap;
6.import java.util.Map;
7.import java.util.Properties;
8.
9./**
10. * PropertiesUtil.java
11. * @version 1.0
12. * @createTime 读取配置文件信息类
13. */
14.public class PropertiesUtil {
15.
16. private static String defaultPropertyFilePath = "/test.properties";
17.
18. private static Map
19.
20. /**
21. * 读取默认文件的配置信息,读key返回value
22. * @param key
23. * @return value
24. */
25. public static final String getPropertyValue(String key) {
26. Properties pps = getPropertyFile(defaultPropertyFilePath);
27. return pps == null ?
null :
pps.getProperty(key);
28. }
29.
30. /**
31. * 传入filePath读取指定property文件,读key返回value
32. * @param propertyFilePath
33. * @param key
34. * @return value
35. */
36. public static String getPropertyValue(String propertyFilePath,String key) {
37. if(propertyFilePath == null) {
38. propertyFilePath = defaultPropertyFilePath;
39. }
40. Properties pps = getPropertyFile(propertyFilePath);
41. return pps == null ?
null :
pps.getProperty(key);
42. }
43.
44. /**
45. * 根据path返回property文件,并保存到HashMap中,提高效率
46. * @param propertyFilePath
47. * @return
48. */
49. public static Properties getPropertyFile(String propertyFilePath) {
50. if(propertyFilePath == null) {
51. return null;
52. }
53. Properties pps = ppsMap.get(propertyFilePath);
54. if(pps == null) {
55. InputStream in = PropertiesUtil.class.getResourceAsStream(propertyFilePath);
56. pps = new Properties();
57. try {
58. pps.load(in);
59. } catch (IOException e) {
60. e.printStackTrace();
61. }
62. ppsMap.put(propertyFilePath, pps);
63. }
64.
65. return pps;
66. }
67.}
packagemon;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Properties;
/**
*PropertiesUtil.java
*@version1.0
*@createTime读取配置文件信息类
*/
publicclassPropertiesUtil{
privatestaticStringdefaultPropertyFilePath="/test.properties";
privatestaticMap
/**
*读取默认文件的配置信息,读key返回value
*@paramkey
*@returnvalue
*/
publicstaticfinalStringgetPropertyValue(Stringkey){
Propertiespps=getPropertyFile(defaultPropertyFilePath);
returnpps==null?
null:
pps.getProperty(key);
}
/**
*传入filePath读取指定property文件,读key返回value
*@parampropertyFilePath
*@paramkey
*@returnvalue
*/
publicstaticStringgetPropertyValue(StringpropertyFilePath,Stringkey){
if(propertyFilePath==null){
propertyFilePath=defaultPropertyFilePath;
}
Propertiespps=getPropertyFile(propertyFilePath);
returnpps==null?
null:
pps.getProperty(key);
}
/**
*根据path返回property文件,并保存到HashMap中,提高效率
*@parampropertyFilePath
*@return
*/
publicstaticPropertiesgetPropertyFile(StringpropertyFilePath){
if(propertyFilePath==null){
returnnull;
}
Propertiespps=ppsMap.get(propertyFilePath);
if(pps==null){
InputStreamin=PropertiesUtil.class.getResourceAsStream(propertyFilePath);
pps=newProperties();
try{
pps.load(in);
}catch(IOExceptione){
e.printStackTrace();
}
ppsMap.put(propertyFilePath,pps);
}
returnpps;
}
}
3)Jdbc连接数据库获取Connection工具类,不做分析,直接上代码
Java代码
1.package mon;
2.
3.import java.sql.Connection;
4.import java.sql.DriverManager;
5.import java.sql.ResultSet;
6.import java.sql.SQLException;
7.import java.sql.Statement;
8.
9./**
10. * JdbcUtil.java
11. * @version 1.0
12. * @createTime JDBC获取Connection工具类
13. */
14.public class JdbcUtil {
15.
16. private static Connection conn = null;
17.
18. private static final String URL;
19.
20. private static final String JDBC_DRIVER;
21.
22. private static final String USER_NAME;
23.
24. private static final String PASSWORD;
25.
26. static {
27. URL = PropertiesUtil.getPropertyValue("jdbc.url");
28. JDBC_DRIVER = PropertiesUtil.getPropertyValue("jdbc.driverClassName");
29. USER_NAME = PropertiesUtil.getPropertyValue("jdbc.username");
30. PASSWORD = PropertiesUtil.getPropertyValue("jdbc.password");
31. }
32.
33. public static Connection getConnection() {
34. try {
35. Class.forName(JDBC_DRIVER);
36. conn = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
37. } catch (ClassNotFoundException e) {
38. e.printStackTrace();
39. } catch (SQLException e) {
40. e.printStackTrace();
41. }
42. return conn;
43. }
44.
45.}
packagemon;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
/**
*JdbcUtil.java
*@version1.0
*@createTimeJDBC获取Connection工具类
*/
publicclassJdbcUtil{
privatestaticConnectionconn=null;
privatestaticfinalStringURL;
privatestaticfinalStringJDBC_DRIVER;
privatestaticfinalStringUSER_NAME;
privatestaticfinalStringPASSWORD;
static{
URL=PropertiesUtil.getPropertyValue("jdbc.url");
JDBC_DRIVER=PropertiesUtil.getPropertyValue("jdbc.driverClassName");
USER_NAME=PropertiesUtil.getPropertyValue("jdbc.username");
PASSWORD=PropertiesUtil.getPropertyValue("jdbc.password");
}
publicstaticConnectiongetConnection(){
try{
Class.forName(JDBC_DRIVER);
conn=DriverManager.getConnection(URL,USER_NAME,PASSWORD);
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}catch(SQLExceptione){
e.printStackTrace();
}
returnconn;
}
}
4)万事具备,只欠东风了,下面是核心部分,方法都有注释,不多说了,一步步来,我想肯定是没有问题的。
代码如下:
Java代码
1.package com.test.lucene.logic;
2.
3.import java.io.File;
4.import java.sql.Connection;
5.import java.sql.ResultSet;
6.import java.sql.Statement;
7.import java.util.ArrayList;
8.import java.util.List;
9.
10.import org.apache.lucene.analysis.Analyzer;
11.import org.apache.lucene.document.Document;
12.import org.apache.lucene.document.Field;
13.import org.apache.lucene.document.Field.TermVector;
14.import org.apache.lucene.index.IndexWriter;
15.import org.apache.lucene.queryParser.QueryParser;
16.import org.apache.lucene.search.IndexSearcher;
17.import org.apache.lucene.search.Query;
18.import org.apache.lucene.search.ScoreDoc;
19.import org.apache.lucene.search.Searcher;
20.import org.apache.lucene.search.TopDocs;
21.import org.apache.lucene.store.Directory;
22.import org.apache.lucene.store.FSDirectory;
23.import org.apache.lucene.util.Version;
24.import org.wltea.analyzer.lucene.IKAnalyzer;
25.import
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Lucene 检索 数据库 支持 中文