- 浏览: 33694 次
- 性别:
- 来自: 山东
-
最新评论
首先是建立索引的类文件:
package com.jereh.lucene; import java.io.*; import java.util.Date; import net.paoding.analysis.analyzer.PaodingAnalyzer; import org.apache.lucene.document.DateTools; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; /** * 创建索引 Lucene 3.0+ * * @author Administrator * */ public class Indexer { /** * @param args * @throws IOException */ public static void index(String dateDir, String indexDir) throws IOException { IndexWriter indexWriter = null; // 创建Directory对象 Directory dir = FSDirectory.getDirectory(new File(indexDir)); // 创建IndexWriter对象,第一个参数是Directory,第二个是分词器,第三个表示是否是创建,如果为false为在此基础上面修改,第四表示表示分词的最大值,比如说new // MaxFieldLength(2),就表示两个字一分,一般用IndexWriter.MaxFieldLength.LIMITED indexWriter = new IndexWriter(dir,new PaodingAnalyzer()); File[] files = new File(dateDir).listFiles(); for (int i = 0; i < files.length; i++) { Document doc = new Document(); // 创建Field对象,并放入doc对象中 doc.add(new Field("contents", readContents(files[i], "UTF-8"), Field.Store.YES, Field.Index.UN_TOKENIZED)); doc.add(new Field("filename", files[i].getName(), Field.Store.YES, Field.Index.TOKENIZED)); doc.add(new Field("indexDate", DateTools.dateToString(new Date(), DateTools.Resolution.DAY), Field.Store.YES, Field.Index.TOKENIZED)); // 写入IndexWriter indexWriter.addDocument(doc); } // 查看IndexWriter里面有多少个索引 System.out.println("numDocs:" + indexWriter.numRamDocs()); indexWriter.optimize(); indexWriter.close(); } public static String readContents(File file, String charset) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(file), charset)); String line = new String(); String temp = new String(); while ((line = reader.readLine()) != null) { temp += line; } reader.close(); return temp; } }
其次是进行搜索的类:
package com.jereh.lucene; import java.io.File; import java.io.IOException; import net.paoding.analysis.analyzer.PaodingAnalyzer; import org.apache.lucene.document.Document; 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; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; /** * 搜索索引 Lucene 3.0+ * * @author Administrator * */ public class Searcher { public static void search(String indexDir) throws IOException, ParseException { Directory dir = FSDirectory.getDirectory(new File(indexDir)); // 创建 IndexSearcher对象,相比IndexWriter对象,这个参数就要提供一个索引的目录就行了 IndexSearcher indexSearch = new IndexSearcher(dir); // 创建QueryParser对象,第一个参数表示Lucene的版本,第二个表示搜索Field的字段,第三个表示搜索使用分词器 QueryParser queryParser = new QueryParser("filename",new PaodingAnalyzer()); // 生成Query对象 Query query = queryParser.parse("滑移装载机"); // 搜索结果 TopDocs里面有scoreDocs[]数组,里面保存着索引值 //TopDocs hits = indexSearch.search(query, 10); Hits hits = indexSearch.search(query); // hits.totalHits表示一共搜到多少个 System.out.println("找到了" + hits.length() + "个"); // 循环hits.scoreDocs数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值 Document doc = null; for(int i=0;i<hits.length();i++){ doc = hits.doc(i); System.out.print(doc.get("filename")); } indexSearch.close(); } }
最后是运行的类:
package com.jereh.lucene; import java.io.File; import java.io.IOException; import net.paoding.analysis.analyzer.PaodingAnalyzer; import net.paoding.analysis.examples.gettingstarted.BoldFormatter; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; 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; import org.apache.lucene.search.Searcher; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleFragmenter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; public class Test { public static void main(String[] args) throws IOException, ParseException { // try { // //Indexer.index("E:/code/jrcms_liugong/website/products/", // "F:/workspace/spring-mvc/WebRoot/WEB-INF/index/"); // Searcher.search("F:/workspace/spring-mvc/WebRoot/WEB-INF/index/"); // } catch (Exception e) { // e.printStackTrace(); // } // 将庖丁封装成符合Lucene要求的Analyzer规范 String dateDir = "E:/code/jrcms_liugong/website/about/"; Analyzer analyzer = new PaodingAnalyzer(); File[] files = new File(dateDir).listFiles(); for (File f : files) { // 读取本类目录下的text.txt文件 String content = Indexer.readContents(f, "UTF-8"); // 接下来是标准的Lucene建立索引和检索的代码 Directory ramDir = new RAMDirectory(); IndexWriter writer = new IndexWriter(ramDir, analyzer); Document doc = new Document(); Field fname = new Field("filename",f.getName(),Field.Store.YES,Field.Index.UN_TOKENIZED); Field fd = new Field("contents", content, Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS); doc.add(fname); doc.add(fd); writer.addDocument(doc); writer.optimize(); writer.close(); IndexReader reader = IndexReader.open(ramDir); String queryString = "国家级企业技术中心"; QueryParser parser = new QueryParser("contents", analyzer); Query query = parser.parse(queryString); Searcher searcher = new IndexSearcher(ramDir); query = query.rewrite(reader); //System.out.println("Searching for: " + query.toString("contents")); Hits hits = searcher.search(query); BoldFormatter formatter = new BoldFormatter(); Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query)); highlighter.setTextFragmenter(new SimpleFragmenter(50)); for (int i = 0; i < hits.length(); i++) { String text = hits.doc(i).get("filename"); // int maxNumFragmentsRequired = 5; // String fragmentSeparator = "..."; // TermPositionVector tpv = (TermPositionVector) reader.getTermFreqVector(hits.id(i), "contents"); // TokenStream tokenStream = TokenSources.getTokenStream(tpv); // String result = highlighter.getBestFragments(tokenStream, text, // maxNumFragmentsRequired, fragmentSeparator); // System.out.println("\n" + result); System.out.println(text); } reader.close(); } } }
发表评论
-
DOM Core常用部分
2013-02-22 09:27 1069DOM方法创建节点:createElement(),cre ... -
HTML5上传
2012-04-17 22:16 1248package com.XXX.xheditor.servle ... -
Select选中项
2011-11-23 15:43 932方法一: html源码: <select n ... -
FCKeditor: 返回自动加入html代码问题的解决方法
2011-11-22 17:03 998使用FCKeditor编辑文章,有时候出于某种原因,提交失败了 ... -
开源文档播放器
2011-10-23 11:09 833播放器及组件下载地址:http://code.google.c ... -
JAVA去除A标签和IMG标签
2011-10-10 19:10 7080public static void main(String ... -
JAVA去除HTML代码
2011-10-10 17:36 741import java.util.regex.Matcher; ... -
JAVA制作缩略图
2011-10-10 17:19 889package graphicsTest; import ...
相关推荐
而"庖丁解牛"则为Lucene提供了针对中文的分词支持,使得开发者可以更好地处理中文文档,提高了搜索的准确性和效率。它的特点包括对中文词汇的精准识别,对新词的动态学习,以及对多音字、成语和网络用语的有效处理。...
《深入剖析Lucene3.0:庖丁解牛与索引搜索实践》 在IT行业中,搜索引擎技术扮演着至关重要的角色,而Lucene作为一个开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨Lucene3.0版本,结合“庖丁解...
### Paoding庖丁解牛:中文分词库与Nutch集成详解 #### 一、Paoding庖丁解牛概述 Paoding庖丁解牛是一款基于Java语言开发的中文分词库,它能够作为中文搜索引擎的一个关键组件进行部署,特别是在Lucene这样的搜索...
本文将深入探讨Lucene 3.6.1版本,结合“庖丁解牛”分词器以及其在数据库表索引、文件索引及分页搜索的应用,为初学者提供一套完整的入门教程。 一、Lucene 3.6.1 概述 Lucene 3.6.1是Apache软件基金会的开源项目...
压缩文件中的 "jar 包" 可能包含了 Lucene 库本身以及其他必要的依赖,如庖丁解牛分词器和 Tika。程序及安装说明文件则提供了如何配置和运行示例的指导,包括如何设置类路径、启动示例程序的步骤等。 通过学习这个...
标题“Paoding中文分词”指的是一个专门用于处理中文文本的分词工具,名为“庖丁解牛中文分词”。在自然语言处理领域,分词是预处理的重要步骤,它将连续的汉字序列切分成有意义的词汇单元,便于后续的文本分析和...