首页 > 代码库 > lucene4.10.3入门
lucene4.10.3入门
最近在研究搜索殷勤的全文索引,刚刚有了点眉目,发现还是很实用的,这里放出入门秘籍,大家一起分享!
一,Lucene 简介
Lucene 是一个基于 Java 的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene 目前是 Apache Jakarta 家族中的一个开源项目。也是目前最为流行的基于 Java 开源全文检索工具包。
目前已经有很多应用程序的搜索功能是基于 Lucene 的,比如 Eclipse 的帮助系统的搜索功能。Lucene 能够为文本类型的数据建立索引,所以你只要能把你要索引的数据格式转化的文本的,Lucene 就能对你的文档进行索引和搜索。比如你要对一些 HTML 文档,PDF 文档进行索引的话你就首先需要把 HTML 文档和 PDF 文档转化成文本格式的,然后将转化后的内容交给 Lucene 进行索引,然后把创建好的索引文件保存到磁盘或者内存中,最后根据用户输入的查询条件在索引文件上进行查询。不指定要索引的文档的格式也使 Lucene 能够几乎适用于所有的搜索应用程序。
我们先看看官方的架构图:
二,官网demo
1、首先到官网下载lucene-4.10.3.zip
官方网址:http://lucene.apache.org/
2、解压zip包,其中有一个demo有一个是lucene-xml-query-demo.war可以放到tomcat 安装目录的webapps中
3、将tomcat服务器开启输入localhost:8080/lucene-xml-query-demo将会出现界面但是点击查询会报java.lang.ClassNotFoundException:org.apache.lucene.xmlparser.webdemo.FormBasedXmlQueryDemo这个错误。这个原因是新版本中FormBasedXmlQueryDemo的路径
变了,这时你就需要到该项目的web.xml中将 <servlet-class> org.apache.lucene.xmlparser.webdemo.FormBasedXmlQueryDemo </servlet-class>
更改为 <servlet-class>org.apache.lucene.demo.xmlparser.FormBasedXmlQueryDemo</servlet-class>
然后把lucene-4.1.0解压包下 analysis\common\lucene-analyzers-common-4.10.2.jar和 sandbox\lucene-sandbox-4.10.2.jar
这两个文件拷贝到WEB-INF\lib文件夹下面,这时在点击查询就不会出现问题了输入java查询结果如下
三、简单实现
lucene基本工作原理简单可以理解为创建索引,而根据索引查询
下面是简单的例子
TxtFileInderxer作用是将D:/luceneData中所有的.txt文件建立索引并将所有的索引存放在D:/luceneIndex中
package org.com.test; import java.io.File; import java.io.FileReader; import java.io.Reader; import java.util.Date; 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.Store; import org.apache.lucene.document.TextField; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; public class TxtFileIndexer { public static void main(String[] args) throws Exception { // indexDir is the directory that hosts Lucene's index files File indexDir = new File("D:\\luceneIndex"); // dataDir is the directory that hosts the text files that to be indexed File dataDir = new File("D:\\luceneData"); // Analyzer luceneAnalyzer = new // StandardAnalyzer(Version.LUCENE_4_10_2); // 对文档进行分词 Analyzer luceneAnalyzer = new StandardAnalyzer(); File[] dataFiles = dataDir.listFiles(); IndexWriterConfig indexWriterConfig = new IndexWriterConfig( Version.LUCENE_4_10_3, luceneAnalyzer); // 创建索引 IndexWriter indexWriter = new IndexWriter(FSDirectory.open(indexDir), indexWriterConfig); // IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer, // true); long startTime = new Date().getTime(); for (int i = 0; i < dataFiles.length; i++) { if (dataFiles[i].isFile() && dataFiles[i].getName().endsWith(".txt")) { System.out.println("Indexing file " + dataFiles[i].getCanonicalPath()); // 封装document对象 Document document = new Document(); Reader txtReader = new FileReader(dataFiles[i]); document.add(new TextField("path", dataFiles[i] .getCanonicalPath(), Store.YES)); // document.add(Field.Text("contents", txtReader)); document.add(new TextField("contents", txtReader)); indexWriter.addDocument(document); } } indexWriter.commit(); // indexWriter.optimize(); indexWriter.close(); long endTime = new Date().getTime(); System.out.println("It takes " + (endTime - startTime) + " milliseconds to create index for the files in directory " + dataDir.getPath()); } }
TxtFileSearcher作用是从D:/luceneIndex中读取索引并查询.txt文件中含有lucene的文件
package org.com.test; import java.io.File; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; public class TxtFileSearcher { public static void main(String[] args) throws Exception { String queryStr = "java"; // This is the directory that hosts the Lucene index File indexDir = new File("D:\\luceneIndex"); Directory directory = FSDirectory.open(indexDir); // FSDirectory fsDirectory = FSDirectory.open(indexDir); IndexReader indexReader = IndexReader.open(directory); // FSDirectory directory = FSDirectory.getDirectory(indexDir,false); // IndexReader indexReader = IndexReader.open(fsDirectory); IndexSearcher indexSearcher = new IndexSearcher(indexReader); // IndexSearcher searcher = new IndexSearcher(indexReader); if (!indexDir.exists()) { System.out.println("The Lucene index is not exist"); return; } Term term = new Term("contents", queryStr.toLowerCase()); TermQuery luceneQuery = new TermQuery(term); // Hits hits = searcher.search(luceneQuery); TopDocs topDocs = indexSearcher.search(luceneQuery, 1000); ScoreDoc[] scoreDocs = topDocs.scoreDocs; if (scoreDocs == null || scoreDocs.length == 0) { System.out.println("The Lucene index is not exist"); } for (int i = 0; i < scoreDocs.length; i++) { Document document = indexSearcher.doc(scoreDocs[i].doc); System.out.println("File: " + document.get("path")); } indexReader.close(); } }
执行结果如下:
以"D:\\luceneData"为数据源建立索引:
按“java”为关键字搜索结果:
总结:
在我们的逐渐成熟,走向大牛的技术生涯中,一直有一个现象,我们愁眉不展研究了N个日日夜夜的结果,某牛分分钟就找到的一个jar包实现了我们的功能,而且比较完善,每每遇到这个现象,我就会想起《荀子·劝学》中的名句:
吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。登高而招,臂非加长也,而见者远;顺风而呼,声非加疾也,而闻者彰。假舆马者,非利足也,而致千里;假舟楫者,非能水也,而绝江河。君子生非异也,善假于物也。
千年前的古人,已经教育我们,作为君子,应该学习站在巨人的肩膀上,人类发明文字,就是为了后人可以继承,有了继承,我们以几千年的文明塑造了无与伦比的发展速度,且这个速度一直被刷新!程序,何尝不是这样!!!
lucene4.10.3入门