- 浏览: 85504 次
- 来自: 济南
文章分类
最新评论
-
lib:
速度很快啊!下手很早啊。
在Raspberry Pi上安装Nodejs环境 -
qalong:
如此好文,哪能不顶
Canvas入门实例08:三次方贝塞尔曲线 -
johnnycmj:
膜拜啊....
简单模拟Google的大马跑啊跑的Doodle -
BuN_Ny:
zeng1990 写道BuN_Ny 写道feizhang666 ...
17) 第二章 索引:优化索引(Optimizing) -
zeng1990:
BuN_Ny 写道feizhang666 写道现在已经是luc ...
17) 第二章 索引:优化索引(Optimizing)
还是看代码来的直接:
1. 索引
import java.io.File; import java.io.FileReader; import java.io.IOException; 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; import org.apache.lucene.store.Directory; import org.apache.lucene.store.SimpleFSDirectory; import org.apache.lucene.util.Version; /** * Lucene索引类示例 * 代码摘自 Lucene In Action 2nd Edition */ public class Indexer { public static void main(String[] args) throws Exception { if (args.length != 2) { throw new Exception("Usage: java " + Indexer.class.getName() + " <index dir> <data dir>"); } // 1 Lucene索引文件存放的位置 String indexDir = args[0]; // 2 索引此目录下的 *.txt 文件 String dataDir = args[1]; long start = System.currentTimeMillis(); Indexer indexer = new Indexer(indexDir); int numIndexed = indexer.index(dataDir); indexer.close(); long end = System.currentTimeMillis(); System.out.println("Indexing " + numIndexed + " files took " + (end - start) + " milliseconds"); } private IndexWriter writer; public Indexer(String indexDir) throws IOException { Directory dir = new SimpleFSDirectory(new File(indexDir), null); // 3 创建Lucene的 IndexWriter 类 writer = new IndexWriter( dir, new StandardAnalyzer(Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED); } public void close() throws IOException { // 4 关闭IndexWriter writer.close(); } public int index(String dataDir) throws Exception { File[] files = new File(dataDir).listFiles(); for (int i = 0; i < files.length; i++) { File f = files[i]; if (!f.isDirectory() && !f.isHidden() && f.exists() && f.canRead() && acceptFile(f)) { indexFile(f); } } // 5 返回被索引的文档的数量 return writer.numDocs(); } protected boolean acceptFile(File f) { // 6 仅索引 .txt 文件类型 return f.getName().endsWith(".txt"); } protected Document getDocument(File f) throws Exception { Document doc = new Document(); // 7 索引文件的文本内容 doc.add(new Field("contents", new FileReader(f))); // 8 索引文件路径 doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES, Field.Index.NOT_ANALYZED)); return doc; } private void indexFile(File f) throws Exception { System.out.println("Indexing " + f.getCanonicalPath()); Document doc = getDocument(f); if (doc != null) { // 9 将document添加到索引中 writer.addDocument(doc); } } }
2. 搜索
import java.io.File; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; import org.apache.lucene.store.SimpleFSDirectory; import org.apache.lucene.util.Version; /** * Lucene搜索类示例 * 代码摘自 Lucene In Action 2nd Edition */ public class Searcher { public static void main(String[] args) throws Exception { if (args.length != 2) { throw new Exception("Usage: java " + Searcher.class.getName() + " <index dir> <query>"); } //1 由Indexer类创建的索引文件的位置 String indexDir = args[0]; //2 查询条件 String q = args[1]; search(indexDir, q); } public static void search(String indexDir, String q) throws Exception { Directory dir = new SimpleFSDirectory(new File(indexDir), null); //3 打开索引文件 IndexSearcher is = new IndexSearcher(dir); //4 分析查询条件 QueryParser parser = new QueryParser( Version.LUCENE_30, "contents", new StandardAnalyzer(Version.LUCENE_30)); Query query = parser.parse(q); long start = System.currentTimeMillis(); //5 搜索索引 TopDocs对象仅保存对底层文档的引用,第7步才实际加载 TopDocs hits = is.search(query, 10); long end = System.currentTimeMillis(); //6 输出一些基本查询信息 System.err.println( "Found " + hits.totalHits + " document(s) (in " + (end - start) + " milliseconds) that matched query '" + q + "':"); for(int i=0;i<hits.scoreDocs.length;i++) { ScoreDoc scoreDoc = hits.scoreDocs[i]; //7 检索符合的文档 Document doc = is.doc(scoreDoc.doc); //8 输出符合的文件名 System.out.println(doc.get("filename")); } //9 关闭索引 is.close(); } }
评论
2 楼
BuN_Ny
2012-02-28
shantouyyt 写道
请问下,当索引的时候,用的是这种方式,new FileReader(f)
// 7 索引文件的文本内容
doc.add(new Field("contents", new FileReader(f)));
那当搜索结果的时候,doc.get("contents") 这样得出来的是null。。。该如何做??
是不是 先取得 doc.get("filename") 文件路径,再来读取文本里面的内容??
还有一个问题,高亮显示的时候,如果用的是 doc.add(new Field("contents", new FileReader(f))); ,这样没办法高亮了。。。
// 高亮
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>",
"</font>");
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer);
Fragmenter fragmenter = new SimpleFragmenter(50);
highlighter.setTextFragmenter(fragmenter);
// 返回高亮后的结果,如果当前属性值没有出现关键字则出现null
String hc = highlighter.getBestFragment(analyzer, "content",
document.get("content"));
// 7 索引文件的文本内容
doc.add(new Field("contents", new FileReader(f)));
那当搜索结果的时候,doc.get("contents") 这样得出来的是null。。。该如何做??
是不是 先取得 doc.get("filename") 文件路径,再来读取文本里面的内容??
还有一个问题,高亮显示的时候,如果用的是 doc.add(new Field("contents", new FileReader(f))); ,这样没办法高亮了。。。
// 高亮
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>",
"</font>");
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer);
Fragmenter fragmenter = new SimpleFragmenter(50);
highlighter.setTextFragmenter(fragmenter);
// 返回高亮后的结果,如果当前属性值没有出现关键字则出现null
String hc = highlighter.getBestFragment(analyzer, "content",
document.get("content"));
没有设置Store的话是需要根据filename找到文本的。文本内容过长的话,可以存一些摘要。
后面的高亮问题没懂。
1 楼
shantouyyt
2012-02-28
请问下,当索引的时候,用的是这种方式,new FileReader(f)
// 7 索引文件的文本内容
doc.add(new Field("contents", new FileReader(f)));
那当搜索结果的时候,doc.get("contents") 这样得出来的是null。。。该如何做??
是不是 先取得 doc.get("filename") 文件路径,再来读取文本里面的内容??
还有一个问题,高亮显示的时候,如果用的是 doc.add(new Field("contents", new FileReader(f))); ,这样没办法高亮了。。。
// 高亮
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>",
"</font>");
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer);
Fragmenter fragmenter = new SimpleFragmenter(50);
highlighter.setTextFragmenter(fragmenter);
// 返回高亮后的结果,如果当前属性值没有出现关键字则出现null
String hc = highlighter.getBestFragment(analyzer, "content",
document.get("content"));
// 7 索引文件的文本内容
doc.add(new Field("contents", new FileReader(f)));
那当搜索结果的时候,doc.get("contents") 这样得出来的是null。。。该如何做??
是不是 先取得 doc.get("filename") 文件路径,再来读取文本里面的内容??
还有一个问题,高亮显示的时候,如果用的是 doc.add(new Field("contents", new FileReader(f))); ,这样没办法高亮了。。。
// 高亮
Formatter formatter = new SimpleHTMLFormatter("<font color='red'>",
"</font>");
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter, scorer);
Fragmenter fragmenter = new SimpleFragmenter(50);
highlighter.setTextFragmenter(fragmenter);
// 返回高亮后的结果,如果当前属性值没有出现关键字则出现null
String hc = highlighter.getBestFragment(analyzer, "content",
document.get("content"));
发表评论
-
20) 第二章 索引:缓冲
2012-04-20 22:38 1401Lucene在添加或删除文 ... -
19) 第二章 索引:用IndexReader删除文档
2012-04-19 22:17 1879除了IndexWriter外,IndexReader也可 ... -
18) 第二章 索引:锁策略--Lucene自身提供的锁实现
2011-07-08 17:57 2214首先需要清楚一个大前提:在同一个索引文件上,一次只能 ... -
17) 第二章 索引:优化索引(Optimizing)
2011-06-23 13:59 1862索引文件的多个段可以合并成一个或少量几个。这样将节省 ... -
16) 第二章 索引:设置Field的截断
2011-06-14 16:57 1150针对Field我们还有最后一个特性要讨论:截断(tru ... -
15) 第二章 索引:设计用来排序的域
2011-06-14 09:38 898这一节非常非常简单,场景是这样的:我们对Luce ... -
14) 第二章 索引:用Lucene索引数字
2011-06-13 14:28 2275索引数字的场景主要有两种:一是把它们当作字符串一 ... -
13) 第二章 索引:用Lucene索引日期和时间
2011-06-10 17:46 2831对Lucene而言,每个域都是String类型。 ... -
12) 第二章 索引:规则(Norms)
2011-06-10 10:32 1118在索引阶段,文档(Document)中每个被索引 ... -
11) 第二章 索引:文档优先策略(Boosting)
2011-06-09 14:47 1147请先确认一句话:“并非人人生而平等!”。对于Docum ... -
10) 第二章 索引:Field中含多个值的问题
2011-06-08 17:17 1644假设你的Document中有一个名为" ... -
9) 第二章 索引:Field的设置
2011-06-08 16:25 1310Field也许算是Lucene索引阶段最重要的类 ... -
Hibernate Search常用注解总结
2011-06-08 14:08 65521. @Indexed -> index ... -
8) 第二章 索引:基本索引操作
2011-06-07 15:09 1464先上示例代码,原意看的就看,不愿意看的先略过,回 ... -
7) 第二章 索引:理解Lucene索引过程
2011-06-07 11:32 1241Lucene索引的API非常简单,然而在其 ... -
6) 第二章 索引:Lucene索引的文档模型
2011-06-07 10:57 11341. 文档(Document)和域(Field) ... -
5) 第一章 初识Lucene:理解核心搜索类
2011-05-31 17:22 11021. IndexSearcher Ind ... -
4) 第一章 初识Lucene:理解核心索引类
2011-05-30 17:18 12571. IndexWriter Index ... -
2) 第一章 初识Lucene:索引和搜索
2011-05-30 15:31 11451. 为什么需要搜索 为什么需要高效的、准确的搜索 ... -
1) 第一章 初识Lucene:简介
2011-05-30 14:05 14581. Lucene是什么 Lucene是一个高性能 ...
相关推荐
Lucene 是 Apache 软件基金会的一个开源项目,它提供了一个高性能、可扩展的信息检索库。这个实例将深入讲解如何在 Java 中使用 Lucene 来创建索引并执行各种搜索操作。 ### 一、Lucene 基本概念 1. **索引(Index...
Lucene是一个基于Java的全文索引工具包。 1. 基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 2. 全文检索的实现:Luene全文索引和数据库索引的比较 3. 中文切分词机制简介:基于词库和自动切分词算法的...
赠送jar包:lucene-core-7.7.0.jar; 赠送原API文档:lucene-core-7.7.0-javadoc.jar; 赠送源代码:lucene-core-7.7.0-sources.jar; 赠送Maven依赖信息文件:lucene-core-7.7.0.pom; 包含翻译后的API文档:lucene...
由于林良益先生在2012之后未对IKAnalyzer进行更新,后续lucene分词接口发生变化,导致不可使用,所以此jar包支持lucene6.0以上版本
Lucene是一个由Java编写的开源全文检索引擎工具包,由Doug Cutting创建并贡献给Apache基金会,成为Jakarta项目的一部分。它不是一个独立的全文检索应用,而是提供了一个可扩展的框架,用于集成到其他应用程序中,...
指南-Lucene:ES篇.md
1. 复合段(Compound Segment):为了提高检索效率,Lucene会合并多个小段成一个大段。 2. 倒排索引(Inverted Index):Lucene的核心数据结构,它将词典映射到包含该词的文档集合。 3. 评分系统(Scoring):...
以下是一个简单的Java代码示例,展示了如何创建和使用Lucene索引器: ```java import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache....
博文链接中提到的是一个关于Lucene3的博客文章,可能详细介绍了如何在实际项目中使用Lucene进行全文检索。博主"chinaxxren"在ITEYE上分享了这篇博客,虽然具体内容未在描述中给出,但我们可以推测博主可能讲解了以下...
标题 "第一个lucene的简单实例" 提到的是关于Apache Lucene的初步应用,这是一个全文搜索引擎库,常用于Java开发中。Lucene提供了高效的文本搜索功能,使得开发者能够快速地在大量数据中查找相关信息。 描述中的 ...
尽管Lucene本身不是一个现成的应用程序,但它提供了一套丰富的API,使得开发者能够轻松地将搜索功能集成到他们的软件产品或服务中。 **作者与历史**: - **作者**:Lucene最初由Doug Cutting创建。Cutting是一位...
Lucene的主要目标是为开发者提供一个简单易用的API,让他们能够快速地在应用程序中实现全文检索功能。 **一、Lucene的核心组件** 1. **索引(Indexing)**:Lucene首先将非结构化的文本数据转换为倒排索引...
通过实例,我们可以创建一个简单的索引器,将文本文件或数据库内容导入Lucene索引,然后编写一个搜索引擎来查询这些内容。这通常涉及以下步骤: - 创建索引:定义Document结构,使用Analyzer处理Field,通过...
在这个"一个关于lucene实例"的压缩包中,很可能是为了帮助初学者理解并掌握Lucene的基本用法和核心概念。 Lucene的主要功能包括文档的索引和搜索。在索引过程中,它能够分析文本,将文本分词,然后将这些词语转换为...