??xml version="1.0" encoding="utf-8" standalone="yes"?> Lucene提供了方便您创徏自徏查询的APIQ也通过QueryParser提供了强大的查询语言?/span> 本文讲述Lucene的查询语句解析器支持的语法,Lucene的查询语句解析器是用JavaCC工具生成的词法解析器Q它查询字串解析ؓLucene Query对象?/span> (TermQ?/span> 一条搜索语句被拆分Z些项QtermQ和操作W(operatorQ。项有两U类型:单独和短语?/span> 单独就是一个单独的单词Q例?test" Q?"hello"?/span> 短语是一l被双引号包围的单词Q例?hello dolly"?/span> 多个可以用布尔操作W连接v来Ş成复杂的查询语句Q接下来您就会看刎ͼ?/span> 注意QAnalyzer建立索引时用的解析器和解析单独和短语时的解析器相同,因此选择一个不会受查询语句q扰的Analyzer非常重要?/span> 域(FieldQ?/span> Lucene支持域。您可以指定在某一个域中搜索,或者就使用默认域。域名及默认域是具体索引器实现决定的?/span> 您可以这h索域Q域?":"+搜烦的项名?/span> 举个例子Q假设某一个Lucene索引包含两个域,title和textQtext是默认域。如果您x找标题ؓ"The Right Way"且含?don't go this way"的文章,您可以输入: title:"The Right Way" AND text:go 或?/span> title:"Do it right" AND right 因ؓtext是默认域Q所以这个域名可以不行?/span> 注意Q域名只对紧接于其后的项生效Q所?/span> title:Do it right 只有"Do"属于title域?it"?right"仍将在默认域中搜索(q里是text域)?/span> 修饰符Q?/span>Term ModifiersQ?/span> Lucene支持修饰符以支持更宽范围的搜烦选项?/span> Lucene支持单个与多个字W的通配搜烦?/span> 使用W号"?"表示单个L字符的通配?/span> 使用W号"*"表示多个L字符的通配?/span> 单个L字符匚w的是所有可能单个字W。例如,搜烦"text或?test"Q可以这P te?t 多个L字符匚w的是0个及更多个可能字W。例如,搜烦test, tests 或?testerQ可以这P test* 您也可以在字W窜中间使用多个L字符通配W?/span> te*t 注意Q您不能在搜索的开始?或?W号?/span> Lucene支持ZLevenshtein Distance与Edit Distance法的模p搜索。要使用模糊搜烦只需要在单独的最后加上符?~"。例如搜索拼写类g"roam"的项q样写: roam~ q次搜烦找到Ş如foam和roams的单词?/span> 注意Q用模p查询将自动得到增量因子Qboost factorQؓ0.2的搜索结? 邻近搜烦(Proximity Searches) Luceneq支持查扄隔一定距ȝ单词。邻q搜索是在短语最后加上符?~"。例如在文档中搜索相?0个单词的"apache"?jakarta"Q这样写Q?/span> "jakarta apache"~10 Lucene provides the relevance level of matching documents based on the terms found. To boost a term use the caret, "^", symbol with a boost factor (a number) at the end of the term you are searching. The higher the boost factor, the more relevant the term will be. Lucene可以讄在搜索时匚w的怼度。在的最后加上符?^"紧接一个数字(增量|Q表C搜索时的相似度。增量D高,搜烦到的相兛_好?/span> Boosting allows you to control the relevance of a document by boosting its term. For example, if you are searching for jakarta apache and you want the term "jakarta" to be more relevant boost it using the ^ symbol along with the boost factor next to the term. You would type: 通过增量一个项可以控制搜烦文档时的相关度。例如如果您要搜索jakarta apacheQ同时您惌"jakarta"的相兛_更加好,那么在其后加?^"W号和增量|也就是您输入Q?/span> jakarta^4 apache This will make documents with the term jakarta appear more relevant. You can also boost Phrase Terms as in the example: q将使得生成的doucment可能与jakarta相关度高。您也可以增量短语,象以下这个例子一P "jakarta apache"^4 "jakarta lucene" By default, the boost factor is 1. Although, the boost factor must be positive, it can be less than 1 (i.e. .2) 默认情况下,增量值是1。增量g可以于1Q例?.2Q,但必L有效的?/span> 布尔操作W可项通过逻辑操作q接h。Lucene支持AND, "+", OR, NOT ?"-"q些操作W。(注意Q布操作符必须全部大写Q?/span> OR操作W是默认的连接操作符。这意味着如果两个之间没有布操作符Q就是用OR操作W。OR操作W连接两个项Q意味着查找含有L的文档。这与集合ƈq算相同。符号||可以代替W号OR?/span> 搜烦含有"jakarta apache" 或?"jakarta"的文档,可以使用q样的查询: "jakarta apache" jakarta 或?/span> "jakarta apache" OR jakarta AND操作W匹配的是两同时出现的文档。这个与集合交操作相{。符?amp;&可以代替W号AND?/span> 搜烦同时含有"jakarta apache" ?"jakarta lucene"的文档,使用查询Q?/span> "jakarta apache" AND "jakarta lucene" "+"操作W或者称为存在操作符Q要求符?+"后的必d文档相应的域中存在?/span> 搜烦必须含有"jakarta"Q可能含?lucene"的文档,使用查询Q?/span> +jakarta apache NOT操作W排除那些含有NOTW号后面的文档。这和集合的差运相同。符P可以代替W号NOT?/span> 搜烦含有"jakarta apache"Q但是不含有"jakarta lucene"的文档,使用查询Q?/span> "jakarta apache" NOT "jakarta lucene" 注意QNOT操作W不能单独与用构成查询。例如,以下的查询查不到Ml果Q?/span> NOT "jakarta apache" "-"操作W或者禁止操作符排除含有"-"后面的相似项的文档?/span> 搜烦含有"jakarta apache"Q但不是"jakarta lucene"Q用查询: "jakarta apache" -"jakarta lucene" 分组Q?/span>GroupingQ?/span> Lucene支持使用圆括hl合字句形成子查询。这对于x制查询布逻辑的h十分有用?/span> 搜烦含有"jakarta"或?apache"Q同时含?website"的文档,使用查询Q?/span> (jakartaOR apache) AND website q样消除了歧义Q保证website必须存在Qjakarta和apache中之一也存在?/span> 转义Ҏ字符Q?/span>Escaping Special CharactersQ?/span> Lucene支持转义Ҏ字符Q因为特D字W是查询语法用到的。现在,Ҏ字符包括 + - && || ! ( ) { } [ ] ^ " ~ * ? : " 转义Ҏ字符只需在字W前加上W号",例如搜烦(1+1):2Q用查?/span> "(1"+1")":2
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
public class Index {
public static void main(String[] args) {
try {
Index index = new Index();
String path = "d:\\index";//索引文g的存放\?/span>
String storeIdPath = "d:\\storeId.txt";//存储ID的\?/span>
String storeId ="";
storeId = index.getStoreId(storeIdPath);
ResultSet rs = index.getResult(storeId);
index.indexBuilding(path, storeIdPath, rs);
storeId = index.getStoreId(storeIdPath);
System.out.println(storeId);//打印ơ存储v来的ID
} catch (Exception e) {
e.printStackTrace();
}
}
public ResultSet getResult(String storeId) throws Exception{
Class.forName("com.mysql.jdbc.Driver").newInstance();
String url = "jdbc:mysql://localhost:3306/ding";
String userName = "root";
String password = "ding";
Connection conn = DriverManager.getConnection(url,userName,password);
Statement stmt = conn
.createStatement();
ResultSet rs = stmt
.executeQuery("select * from newitem where id > '"+storeId+"'order by id");
return rs;
}
public boolean indexBuilding(String path,String storeIdPath, ResultSet rs) {// 把RS换成LIST原理一?/span>
try {
Analyzer luceneAnalyzer = new StandardAnalyzer();
// 取得存储h的IDQ以判定是增量烦引还是重新烦?/span>
boolean isEmpty = true;
try {
File file = new File(storeIdPath);
if (!file.exists()) {
file.createNewFile();
}
FileReader fr = new FileReader(storeIdPath);
BufferedReader br = new BufferedReader(fr);
if(br.readLine()!= null) {
isEmpty = false;
}
br.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
IndexWriter writer = new IndexWriter(path, luceneAnalyzer, isEmpty);//参数isEmpty是false表示增量索引
String storeId = "";
boolean indexFlag = false;
String id;
String title;
while (rs.next()) {
// for(Iterator it = list.iterator();it.hasNext();){
id = rs.getString("id");
title = rs.getString("title");
writer.addDocument(Document(id, title));
storeId = id;//拿到的idlstoreIdQ这U拿法不合理Q这里ؓ了方?/span>
indexFlag = true;
}
writer.optimize();
writer.close();
if(indexFlag){
// 最后一个的ID存到盘文g?/span>
this.writeStoreId(storeIdPath, storeId);
}
return true;
} catch (Exception e) {
e.printStackTrace();
System.out.println("出错?/span>" + e.getClass() + "\n 错误信息? "
+ e.getMessage());
return false;
}
}
public static Document Document(String id, String title) {
Document doc = new Document();
doc.add(new Field("ID", id, Field.Store.YES, Field.Index.TOKENIZED));
doc.add(new Field("TITLE", title, Field.Store.YES,
Field.Index.TOKENIZED));
return doc;
}
// 取得存储在磁盘中的ID
public static String getStoreId(String path) {
String storeId = "";
try {
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
FileReader fr = new FileReader(path);
BufferedReader br = new BufferedReader(fr);
storeId = br.readLine();
if (storeId == null || storeId == "")
storeId = "0";
br.close();
fr.close();
} catch (Exception e) {
e.printStackTrace();
}
return storeId;
}
// ID写入到磁盘文件中
public static boolean writeStoreId(String path,String storeId) {
boolean b = false;
try {
File file = new File(path);
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(path);
PrintWriter out = new PrintWriter(fw);
out.write(storeId);
out.close();
fw.close();
b=true;
} catch (IOException e) {
e.printStackTrace();
}
return b;
}
}
q里代码写的比较单,很多需要改q的地方Q自己改q就行了Q这里只是说明了增量索引的原理,望指正?br />
]]>
public static void main(String[] args) throws Exception {
/* 指明要烦引文件夹的位|?q里是d盘的s文g夹下 */
File fileDir = new File("d:\\s");
/* q里攄引文件的位置 */
File indexDir = new File("d:\\index");
Analyzer luceneAnalyzer = new StandardAnalyzer();
IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer,
true);
File[] textFiles = fileDir.listFiles();
long startTime = new Date().getTime();
//增加document到烦引去
System.out.println("File正在被烦?img src="http://www.aygfsteel.com/Images/dot.gif" alt="" />.");
/*
* 注意要变的就是这里,路径和读取文件的Ҏ
* */
String path ="d:\\s\\2.doc";
String temp = ReadFile.readWord(path);
// String path ="d:\\s\\index.htm";
// String temp = ReadFile.readHtml(path);
Document document = new Document();
Field FieldPath = new Field("path",path,
Field.Store.YES, Field.Index.NO);
Field FieldBody = new Field("body", temp, Field.Store.YES,
Field.Index.TOKENIZED,
Field.TermVector.WITH_POSITIONS_OFFSETS);
document.add(FieldPath);
document.add(FieldBody);
indexWriter.addDocument(document);
//optimize()Ҏ是对索引q行优化
indexWriter.optimize();
indexWriter.close();
//试一下烦引的旉
long endTime = new Date().getTime();
System.out
.println("q花费了"
+ (endTime - startTime)
+ " 毫秒来把文档增加到烦引里面去!"
+ fileDir.getPath());
}
}
上面已经注释了要换的地方Q我们要做的是换文件的路径和读取文件的Ҏ?/span>
下面来具体看下读取文件的Ҏ
1.首先来看WORD文档Q?/span>
我这里用的是poiQ相关jar包自己去下蝲Q然后加到工E中Q以下所要用的jar包也是,不再重复_?br />
来看相关代码Q?br />
StringBuffer content = new StringBuffer("");// 文档内容
try {
HWPFDocument doc = new HWPFDocument(new FileInputStream(path));
Range range = doc.getRange();
int paragraphCount = range.numParagraphs();// D落
for (int i = 0; i < paragraphCount; i++) {// 遍历D落d数据
Paragraph pp = range.getParagraph(i);
content.append(pp.text());
}
} catch (Exception e) {
}
return content.toString().trim();
}
2.PDF文g用的是PDFboxQ?br />
StringBuffer content = new StringBuffer("");// 文档内容
FileInputStream fis = new FileInputStream(path);
PDFParser p = new PDFParser(fis);
p.parse();
PDFTextStripper ts = new PDFTextStripper();
content.append(ts.getText(p.getPDDocument()));
fis.close();
return content.toString().trim();
}
3.html文gQ?br />
StringBuffer content = new StringBuffer("");
File file = new File(urlString);
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
// d面
BufferedReader reader = new BufferedReader(new InputStreamReader(
fis,"utf-8"));//q里的字W编码要注意Q要对上html头文件的一_否则会出q
String line = null;
while ((line = reader.readLine()) != null) {
content.append(line + "\n");
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
String contentString = content.toString();
return contentString;
}
4.txt文gQ?/span>
StringBuffer content = new StringBuffer("");// 文档内容
try {
FileReader reader = new FileReader(path);
BufferedReader br = new BufferedReader(reader);
String s1 = null;
while ((s1 = br.readLine()) != null) {
content.append(s1 + "\r");
}
br.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return content.toString().trim();
}
接下来数搜烦代码Q?/span>
public static void main(String[] args) throws IOException, ParseException {
Hits hits = null;
//搜烦内容自己?/span>
String queryString = "Ҏ国务院的军_";
Query query = null;
IndexSearcher searcher = new IndexSearcher("d:\\index"); //q里注意索引存放的\?nbsp;
Analyzer analyzer = new StandardAnalyzer();
try {
QueryParser qp = new QueryParser("body", analyzer);
/**
* 建烦引的时候我们指定了body建立为内容,我们搜烦的时候也是针对body的,所?br />
* QueryParser qp = new QueryParser("body", analyzer);
* q句和徏立烦引时?br />
Field FieldBody = new Field("body", temp, Field.Store.YES,
Field.Index.TOKENIZED,
Field.TermVector.WITH_POSITIONS_OFFSETS);
*的这句的"body"是对应的?br />
*/
query = qp.parse(queryString);
} catch (ParseException e) {
System.out.println("异常");
}
if (searcher != null) {
hits = searcher.search(query);
if (hits.length() > 0) {
System.out.println("扑ֈ:" + hits.length() + " 个结?");
for (int i = 0; i < hits.length(); i++) {//输出搜烦信息
Document document = hits.doc(i);
System.out.println("contentsQ?/span>"+document.get("body"));
//同样原理q里的document.get("body")是取得建立在烦引文仉面的额body的所有内?br />
//你若惌出文件\径就用document.get("path")可以了
}
} else{
System.out.println("0个结?");
}
}
}
]]>
]]>
Apache Lucene是一个开放源E序的搜d引擎Q利用它可以LCؓJava软g加入全文搜寻功能?/span>Lucene的最主要工作是替文g的每一个字作烦引,索引让搜ȝ效率比传l的逐字比较大大提高Q?/span>Lucen提供一l解读,qoQ分析文Ӟ~排和用烦引的APIQ它的强大之处除了高效和单外Q是最重要的是使用者可以随时应自已需要自订其功能?/span> Lucene?/span>apache软g基金会项目组的一个子目Q是一个开放源代码的全文检索引擎工具包Q即它不是一个完整的全文索引擎,而是一个全文检索引擎的架构Q提供了完整的查询引擎和索引引擎Q部分文本分析引擎?/span>Lucene的目的是Y件开发h员提供一个简单易用的工具包,以方便的在目标系l中实现全文索的功能Q或者是以此为基建立起完整的全文索引擎?/span>
2. Lucene能做什?/span>
Lucene使你可以Z的应用程序添加烦引和搜烦能力?/span>Lucene可以索引q能使得可以转换成文本格式的M数据能够被搜索?/span>Luceneq不兛_数据的来源、格式甚臛_的语aQ只要你能将它{换ؓ文本。这意味着你可l烦引ƈ搜烦存放于文件中的数据:在远E服务器上的web面Q存于本地文件系l的文档Q简单的文本文gQ微?/span>Word文档Q?/span>HTML?/span>PDF文g或Q何其它能够提取出文本信息的格式?/span>
同样Q利?/span>Lucene你可以烦引存放于数据库中的数据,提供l用户很多数据库没有提供的全文搜索的能力。一旦你集成?/span>LuceneQ你的应用程序的用户p够像q样来搜索:+George +Rice –eat –pudding, Apple –pie +Tiger, animal:monkey AND food:banana{等。利?/span>LuceneQ你可以索引和搜?/span>email邮gQ邮件列表档案,x聊天记录Q你?/span>Wiki面……{等更多?/span>
3. Lucene的优?/span>
Q?/span>1Q烦引文件格式独立于应用q_?/span>Lucene定义了一套以8位字节ؓ基础的烦引文件格式,使得兼容pȝ或者不同^台的应用能够׃n建立的烦引文件?/span>
Q?/span>2Q在传统全文索引擎的倒排索引的基上,实现了分块烦引,能够针对新的文g建立文件烦引,提升索引速度。然后通过与原有烦引的合ƈQ达C化的目的?/span>Lucene提供了烦引的扩展机制Q因此烦引可以动态扩展?/span>
Q?/span>4Q设计了独立于语a和文件格式的文本分析接口Q烦引器通过接受Token完成烦引文件的创立Q用h展新的语a和文件格式,只需要实现文本分析的接口?/span>
Q?/span>5Q已l默认实C一套强大的查询引擎Q用h需自己~写代码即ɾpȝ可获得强大的查询能力Q?/span>Lucene的查询实C默认实现了布操作、模p查询、分l查询等{?/span>
Q?/span>6Q?span style="color: black">搜烦q程优化?/span>Lucene面向全文索的优化在于首次索引索后Qƈ不把所有的记录Q?/span>DocumentQ具体内容读取出来,而v只将所有结果中匚w度最高的?/span>100条结果(TopDocsQ的ID攑ֈl果集缓存中q返回?/span>
Q?/span>7Q?/span>Lucene的另外一个特Ҏ在收集结果的q程中将匚w度低的结果自动过滤掉了。这也是和数据库应用需要将搜烦的结果全部返回不同之?/span>
4. 查询相关
Analyzer是分析器Q它的作用是把一个字W串按某U规则划分成一个个词语Qƈ去除其中的无效词语,q里说的无效词语是指英文中的“of”?/span> “the”Q中文中?#8220;?#8221;?#8220;?#8221;{词语,q些词语在文章中大量出现Q但是本w不包含什么关键信息,L有利于羃烦引文件、提高效率、提高命中率?/span>
分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实玎ͼ因ؓ英文本n是以单词ؓ单位的,已经用空格分开Q而中文则必须以某U方法将q成一片的句子划分成一个个词语?/span>
(1) 用通配W进行搜?/span>
单个L字符匚w的是所有可能单个字W。例如,搜烦"text或?/span>"test"Q可以这Pte?t
多个L字符匚w的是0个及更多个可能字W。例如,搜烦test, tests 或?/span> testerQ可以这Ptest*
您也可以在字W窜中间使用多个L字符通配W?/span>te*t
注意Q您不能在搜索的开始?/span>*或?/span>?W号?/span>
(2) 模糊查询
Lucene支持ZLevenshtein Distance?/span>Edit Distance法的模p搜索。要使用模糊搜烦只需要在单独的最后加上符?/span>"~"。例如搜索拼写类g"roam"的项q样写:roam~
q次搜烦找到Ş?/span>foam?/span>roams的单词?/span>
注意Q用模p查询将自动得到增量因子Q?/span>boost factorQؓ0.2的搜索结?/span>.
(3) 布尔操作W?/span>
布尔操作W可项通过逻辑操作q接h?/span>Lucene支持AND, "+", OR, NOT ?/span> "-"q些操作W。(注意Q布操作符必须全部大写Q?/span>
(4) 转义Ҏ字符
Lucene支持转义Ҏ字符Q因为特D字W是查询语法用到的。现在,Ҏ字符包括
+ - && || ! ( ) { } [ ] ^ " ~ * ? : "
转义Ҏ字符只需在字W前加上W号",例如搜烦(1+1):2Q用查?/span>
"(1"+1")":2
5. 一些用经?/span>
(1) 关键词区分大写
OR AND TO{关键词是区分大写的,lucene只认大写的,写的当做普通单词?/span>
(2) d互斥?/span>
同一时刻只能有一个对索引的写操作Q在写的同时可以q行搜烦?/span>
(3) 文g?/span>
在写索引的过E中退出将?/span>tmp目录留下一?/span>lock文gQ以后的写操作无法q行Q可以将其手工删除?/span>
(4) 旉格式
lucene只支持一U时间格?/span>yyMMddHHmmssQ所以你传一?/span>yy-MM-dd HH:mm:ss的时间给lucene它是不会当作旉来处理的?/span>
(5) 索引更新
lucene不支持烦引更斎ͼ必须是先删除再新建烦引,如果数据量很大且更新快则相当ȝQ本w徏立烦引是个O长的q程Q同时相当耗内存且很伤diskQ不能实时的满查询?/span>
(6) 中间取烦?/span>
lucene不支持从中间取烦引。例如:用户取第十页Q?/span>lucene需要把前面所有的内容都要索出Q然后所有的排序Q过滤掉前面的然后返回?/span>
(7) 英文查询
若查询英文,比如有一句话Q?/span>jiangxi strong 如果你输?/span>jiang或?/span>stron{不完整的一个词Q将不能查询出结果,当你输入jiangxi或?/span>strong才能查询出结果?/span>
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.store.RAMDirectory;
/*
* Create Date:2007-10-26 下午02:52:53
*
* Author:dingkm
*
* Version: V1.0
*
* DescriptionQ对q行修改的功能进行描q?br />
*
*
*/
public class Index {
/**
* @Description Ҏ实现功能描述
* @param args
* void
* @throws 抛出异常说明
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
new Index().index();
System.out.println("create index success!!!");
} catch (CorruptIndexException e) {
e.printStackTrace();
} catch (LockObtainFailedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void index() throws CorruptIndexException, LockObtainFailedException, IOException{
long start = System.currentTimeMillis();
// 建立索引的\?br />
String path = "c:\\index2";
Document doc1 = new Document();
doc1.add( new Field("name", "中华人民共和?,Field.Store.YES,Field.Index.TOKENIZED));
doc1.add( new Field("content", "标题或正文包?,Field.Store.YES,Field.Index.TOKENIZED));
doc1.add( new Field("time", "20080715",Field.Store.YES,Field.Index.TOKENIZED));
Document doc2 = new Document();
doc2.add(new Field("name", "大中国中?,Field.Store.YES,Field.Index.TOKENIZED));
IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), true);
writer.setMaxMergeDocs(10);
writer.setMaxFieldLength(3);
writer.addDocument(doc1);
writer.setMaxFieldLength(3);
writer.addDocument(doc2);
writer.close();
System.out.println("=========================");
System.out.print(System.currentTimeMillis() - start);
System.out.println("total milliseconds");
System.out.println("=========================");
}
}
执行q个c,可以看到l果Q?br />
=========================
375total milliseconds
=========================
create index success!!!
可以看到索引创徏成功?br />
import java.io.IOException;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Hits;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
/*
* Create Date:2007-10-26 下午02:56:12
*
* Author:dingkm
*
* Version: V1.0
*
* DescriptionQ对q行修改的功能进行描q?
*
*
*/
public class Search {
/**
* @Description Ҏ实现功能描述
* @param args
* void
* @throws 抛出异常说明
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String path = "c:\\index2";
try {
new Search().search(path);
} catch (CorruptIndexException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void search(String path) throws CorruptIndexException, IOException, ParseException{
IndexSearcher searcher = new IndexSearcher(path);
Hits hits = null;
Query query = null;
QueryParser qp = new QueryParser("name",new StandardAnalyzer());
query = qp.parse("?);
hits = searcher.search(query);
java.text.NumberFormat format = java.text.NumberFormat.getNumberInstance();
System.out.println("查找到共" + hits.length() + "个结?);
for (int i = 0; i < hits.length(); i++) {
//开始输出查询结?nbsp;
Document doc = hits.doc(i);
System.out.println(doc.get("name"));
System.out.println("content="+doc.get("content"));
System.out.println("time="+doc.get("time"));
System.out.println("准确度ؓQ? + format.format(hits.score(i) * 100.0) + "%");
// System.out.println(doc.get("CONTENT"));
}
}
}
执行它,会得C下结果:
查找到共2个结?br />
中华人民共和?br />
content=标题或正文包?br />
time=20080715
准确度ؓQ?9.727%
大中国中?br />
content=null
time=null
准确度ؓQ?9.727%
q样完成了我们的程?br />
q是我第一ơ发表文?br />
说的比较单,可能很多地方说的不清?br />
希望大家多多支持
有什么不明白的欢q留a?/span>