- 浏览: 557576 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (478)
- lucene (45)
- oracle (19)
- nutch (2)
- blog (2)
- 垂直搜索 (19)
- java综合 (89)
- spring (15)
- Hibernate (9)
- Struts (9)
- Hadoop (16)
- Mysql (12)
- nosql (10)
- Linux (3)
- MyEclipse (4)
- Ant (1)
- 设计模式 (19)
- JBPM (1)
- JSP (1)
- HtmlParser (5)
- SVN (2)
- 插件 (2)
- 收藏 (7)
- Others (1)
- Heritrix (18)
- Solr (4)
- 主题爬虫 (31)
- 内存数据库 (24)
- 分布式与海量数据 (32)
- httpclient (14)
- Tomcat (1)
- 面试宝典 (6)
- Python (14)
- 数据挖掘 (1)
- 算法 (6)
- 其他 (4)
- JVM (12)
- Redis (18)
最新评论
-
hanjiyun:
本人水平还有待提高,进步空间很大,看这些文章给我有很大的指导作 ...
JVM的内存管理 Ⅲ -
liuxinglanyue:
四年后的自己:这种方法 不靠谱。 使用javaagent的方式 ...
计算Java对象占用内存空间的大小(对于32位虚拟机而言) -
jaysoncn:
附件在哪里啊test.NoCertificationHttps ...
使用HttpClient过程中常见的一些问题 -
231fuchenxi:
你好,有redis,memlink,mysql的测试代码吗?可 ...
MemLink 性能测试 -
guyue1015:
[color=orange][/color][size=lar ...
JAVA同步机制
import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; 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; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.FSDirectory; import org.apache.lucene.util.Version; /** * 建立索引文件 * * @author chinaxxren * */ public class CreateIndexerDir { // 搜索源文件 private static String INDEX_DIR = "C:\\Documents and Settings\\admin\\桌面\\cs"; // 建立生成索引文件夹 private static String DATA_DIR = "C:\\Documents and Settings\\admin\\桌面\\test"; public static void main(String[] args) throws Exception { long start = new Date().getTime(); int numIndexed = index(new File(INDEX_DIR), new File(DATA_DIR)); long end = new Date().getTime(); System.out.println("Indexing " + numIndexed + " files took " + (end - start) + " milliseconds"); } /** * * @param srcDir * 查询的源文件 * @param saveDir * 创建保存索引的文件目录 * @return 返回匹配的记录总数 */ public static int index(File srcDir, File saveDir) { Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT); // 创建一个语法分析器 IndexWriter writer = null; // 文件目录 Directory directory = null; int numIndexed = 0; try { // 索引文件可放的位置:索引可以存放在两个地方1.硬盘,2.内存; // 放在硬盘上可以用FSDirectory(),放在内存的用RAMDirectory()不过一关机就没了 directory = FSDirectory.open(saveDir); // 把索引文件存储到磁盘目录 // 创建一个IndexWriter(存放索引文件的目录,分析器,Field的最大长度) System.out.println(IndexWriter.MaxFieldLength.UNLIMITED); // 可见构造它需要一个索引文件目录,一个分析器(一般用标准的这个),一个参数是标识是否清空索引目录 writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED); // 索引合并因子 // 一、SetMergeFactor(合并因子) // SetMergeFactor是控制segment合并频率的,其决定了一个索引块中包括多少个文档,当硬盘上的索引块达到多少时, // 将它们合并成一个较大的索引块。当MergeFactor值较大时,生成索引的速度较快。MergeFactor的默认值是10,建议在建立索引前将其设置的大一些。 writer.setMergeFactor(100); // 二、SetMaxBufferedDocs(最大缓存文档数) // SetMaxBufferedDocs是控制写入一个新的segment前内存中保存的document的数目, // 设置较大的数目可以加快建索引速度,默认为10。 writer.setMaxMergeDocs(1000); // 三、SetMaxMergeDocs(最大合并文档数) // SetMaxMergeDocs是控制一个segment中可以保存的最大document数目,值较小有利于追加索引的速度,默认Integer.MAX_VALUE,无需修改。 // 在创建大量数据的索引时,我们会发现索引过程的瓶颈在于大量的磁盘操作,如果内存足够大的话, // 我们应当尽量使用内存,而非硬盘。可以通过SetMaxBufferedDocs来调整,增大Lucene使用内存的次数。 indexDirectory(writer, srcDir); numIndexed = writer.numDocs(); // SetUseCompoundFile这个方法可以使Lucene在创建索引库时,会合并多个 Segments 文件到一个 .cfs // 中。 // 此方式有助于减少索引文件数量,对于将来搜索的效率有较大影响。 // 压缩存储(True则为复合索引格式) writer.setUseCompoundFile(true); // 对索引进行优化 writer.optimize(); // 若需要从索引中删除某一个或者某一类文档,IndexReader提供了两种方法: // reader.DeleteDocument(int docNum) // reader.DeleteDocuments(Term term) // // 前者是根据文档的编号来删除该文档,docNum是该文档进入索引时Lucene的编号,是按照顺序编的;后者是删除满足某一个条件的多个文档。 // // 在执行了DeleteDocument或者DeleteDocuments方法后,系统会生成一个*.del的文件,该文件中记录了删除的文档,但并未从物理上删除这些文档。此时,这些文档是受保护的,当使用Document // doc = reader.Document(i)来访问这些受保护的文档时,Lucene会报“Attempt to access a // deleted document”异常。如果一次需要删除多个文档时,可以用两种方法来解决: // // 1. 删除一个文档后,用IndexWriter的Optimize方法来优化索引,这样我们就可以继续删除另一个文档。 // // 2. // 先扫描整个索引文件,记录下需要删除的文档在索引中的编号。然后,一次性调用DeleteDocument删除这些文档,再调用IndexWriter的Optimize方法来优化索引。 } catch (IOException e) { e.printStackTrace(); } finally { if (writer != null) { try { writer.close(); // 关闭IndexWriter时,才把内存中的数据写到文件 } catch (IOException e) { e.printStackTrace(); } } if (directory != null) { try { directory.close(); // 关闭索引存放目录 } catch (IOException e) { e.printStackTrace(); } } } return numIndexed; } /** * 递归文件 * * @param writer * @param dir * @throws IOException */ private static void indexDirectory(IndexWriter writer, File srcDir) throws IOException { File[] files = srcDir.listFiles(); for (File src : files) { if (src.isDirectory()) { // 如果是文件继续递归 indexDirectory(writer, src); // recurse // 如果是txt结尾的文件则处理 } else if (src.getName().endsWith(".txt")) { indexFile(writer, src); } } } /** * 建立索引表 * * @param writer * @param f * @throws IOException */ private static void indexFile(IndexWriter writer, File src) throws IOException { // 如果文件时隐藏或者文件不存在或则文件不能读,则返回 if (src.isHidden() || !src.exists() || !src.canRead()) { return; } // 显示读取的文件的路径 String path = src.getCanonicalPath(); System.out.println("" + path); // 显示读取的文件内容 String text = loadFileToString(src); // Document相当于数据库中的一行记录。 Document doc = new Document(); // Field(String name, byte[] value, Field.Store store) // Field(String name, Reader reader) // Field(String name, Reader reader, Field.TermVector termVector) // Field(String name, String value, Field.Store store, Field.Index // index) // Field(String name, String value, Field.Store store, Field.Index // index, Field.TermVector termVector) // // 在Field中有三个内部类:Field.Index,Field.Store,Field.termVector,而构造函数也用到了它们。 // 参数说明: // Field.Store: // Field.Store.NO:表示该Field不需要存储。 // Field.Store.Yes:表示该Field需要存储。 // Field.Store.COMPRESS:表示使用压缩方式来存储。 // Field.Index: // Field.Index.NO:表示该Field不需要索引。 // Field.Index.TOKENIZED:表示该Field先被分词再索引。 // Field.Index.UN_TOKENIZED:表示不对该Field进行分词,但要对其索引。 // Field.Index.NO_NORMS:表示该Field进行索引,但是要对它用Analyzer,同时禁止它参加评分,主要是为了减少内在的消耗。 // 增加文档 Field相当于增加数据库字段一样 //检索,获取都需要的内容,直接放index中,不过这样会增大index,保存文件的txt内容 doc.add(new Field("contents", text, Field.Store.YES, Field.Index.ANALYZED)); //大段文本内容,会用来检索,但是检索后不需要从index中取内容,可以根据url去load真实的内容 doc.add(new Field("contents", new FileReader(src))); doc.add(new Field("filename", path, Field.Store.YES, Field.Index.ANALYZED)); writer.addDocument(doc); } /** * 将文件读出来转化为字符串 * * @param file * 源文件,不能是文件夹 * @return */ private static String loadFileToString(File file) { BufferedReader br = null; try { // 字符缓冲流,是个装饰流,提高文件读取速度 br = new BufferedReader(new FileReader(file)); StringBuffer sb = new StringBuffer(); String line = br.readLine(); while (null != line) { sb.append(line); line = br.readLine(); System.out.println(line); } return sb.toString(); } catch (FileNotFoundException e) { System.out.println("文件不存在!"); return null; } catch (IOException e) { e.printStackTrace(); return null; } finally { try { br.close(); } catch (IOException e) { System.out.println("关闭流出现异常"); e.printStackTrace(); } } } }
发表评论
-
关于Lucene的讨论
2011-01-01 10:20 1052分类为[lucene]的文章 ... -
有关Lucene的问题(收藏)推荐
2010-12-30 21:02 1094有关Lucene的问题(1):为 ... -
Lucene 学习总结(收藏)推荐
2010-12-30 20:54 1544Lucene学习总结之一:全文检索的基本原理 ... -
基于Lucene的Compass 资源(收藏)
2010-12-29 18:29 11271.2、Compass相关网上资源 1、官方网站1: http ... -
Lucene 3.0.2索引文件官方文档(二)
2010-12-28 22:36 996Deletable File A writer dy ... -
Lucene 3.0.2索引文件官方文档(一)
2010-12-28 22:34 1446Apache Lucene - Index File ... -
Lucene 3.0 索引文件学习总结(收藏)
2010-12-28 22:28 927lucene学习1——词域信息 ... -
Lucene 字符编码问题
2010-12-27 20:29 982现在如果一个txt文件中包含了ANSI编码的文本文件和Uni ... -
Lucene 字符编码问题
2010-12-27 20:20 1019现在如果一个txt文件中包含了ANSI编码的文本文件和Unic ... -
Annotated Lucene(源码剖析中文版)
2010-12-25 22:52 1245Apache Lucene是一个高性能(high-pe ... -
Lucene 学习推荐博客
2010-12-25 22:42 1026深未来deepfuturelx http://deepfut ... -
Lucene3.0 初窥 总结(收藏)
2010-12-25 22:16 1793【Lucene3.0 初窥】全文检索的基本原理 ... -
转:基于lucene实现自己的推荐引擎
2010-12-17 17:05 1046采用基于数据挖掘的 ... -
加速 lucene 的搜索速度 ImproveSearchingSpeed(二)
2010-12-17 17:01 1025本文 为简单翻译,原文在:http://wiki.apac ... -
加速 lucene 索引建立速度 ImproveIndexingSpeed
2010-12-17 16:58 1058本文 只是简单的翻译,原文 在 http://wiki.a ... -
lucene 3.0 中的demo项目部署
2010-12-15 22:02 964转自:bjqincy 1 在myEclipise 建立 ... -
Lucene 3.0.2 源码 - final class Document
2010-12-14 22:33 874package org.apache.lucene.do ... -
Lucene 3.0.2 源码 - final class Field
2010-12-14 22:29 938package org.apache.lucene.do ... -
Lucene 3.0.2 源码 - abstract class AbstractField
2010-12-14 22:28 1030package org.apache.lucene.do ... -
Lucene 3.0.2 源码 - interface Fieldable
2010-12-14 22:28 1160package org.apache.lucene.do ...
相关推荐
### Lucene对XML文档建立索引的技术解析与实践 #### 一、引言 随着互联网技术的迅猛发展,非结构化数据(如XML文档)在企业和组织中的应用日益广泛。如何高效地处理这些非结构化的数据,特别是进行快速检索成为了一...
《Lucene全文检索:简单索引与搜索实例详解》 Lucene是Apache软件基金会的开源项目,是一款强大的全文检索库,被广泛应用于Java开发中,为开发者提供了构建高性能搜索引擎的能力。在本文中,我们将深入探讨如何基于...
- **首次创建索引**:首先,我们需要遍历整个数据源,创建每个文档的实例,然后将这些文档添加到Lucene的索引writer中。完成这一步后,就会生成一个完整的初始索引。 - **监控数据变更**:为了实现增量索引,我们...
Lucene3包含了对文本的分词、标准化处理(如去除停用词、词干提取)以及建立倒排索引的能力,这些都是全文搜索的关键步骤。倒排索引允许快速定位包含特定关键词的文档,大大提高了搜索效率。 博文链接中提到的是一...
在这个过程中,Lucene会分析文档内容,建立倒排索引,以便快速查找包含特定关键词的文件。 描述中提到的博客链接可能提供了具体的实现步骤或示例代码,但具体内容未给出,所以我们将基于Lucene的一般用法进行讲解。...
3. **Lucene建立索引步骤** - **初始化**: 创建`IndexWriter`对象,配置索引目录和索引参数。 - **文档分析**: 使用`Analyzer`对文档内容进行分词,去除停用词和标点符号,生成词项流。 - **添加文档**: 调用`...
**建立索引的步骤** 1. **添加依赖**:在MyEclipse10中,首先需要导入Lucene相关的jar包,这些通常包括lucene-core、lucene-analyzers、lucene-queryparser等,确保所有必要的组件都已引入。 2. **创建索引目录**...
- **分词器(Tokenizer)**:分词器将输入的文本分解为一系列的词语,这是建立索引的第一步。 - **分析器(Analyzer)**:分析器结合了分词器、过滤器等,负责对文本进行预处理,如去除停用词、词形还原等。 ### 2...
1. **索引(Index)**:Lucene 的核心功能是建立索引,它将非结构化的文本数据转换成可供快速搜索的数据结构。索引过程包括分词(Tokenization)、词干提取(Stemming)、停用词过滤(Stopword Removal)等步骤。 2...
3. **索引(Index)**:Lucene通过建立索引来提高搜索速度。索引是一个结构化的数据存储,包含了文档的关键信息,便于快速查找。 4. **分析器(Analyzer)**:在建立索引前,Lucene会使用分析器对文本进行处理,如...
Lucene通过建立倒排索引,能够在大量文本数据中快速找到与查询匹配的文档。在Java环境中,Lucene能够无缝集成,为开发者提供了一个简单易用的API。 另一方面,Apache POI是一个用于处理Microsoft Office格式文件的...
在“lucene小实例文件检索”中,开发者可能会先创建一个索引,遍历指定目录下的所有文件,将文件内容作为Document的字段,然后使用Analyzer处理并添加到索引中。之后,用户输入查询,通过QueryParser解析成Query,...
#### 建立索引 1. **包导入**:首先,需要导入Lucene相关的包,包括`java.io`用于文件操作,`org.apache.lucene.analysis`用于文本分析,`org.apache.lucene.document`用于创建文档对象,以及`org.apache.lucene....
文档中包含Lucene4.0.0版本jar包,中文分词器jar包,Lucene实例代码 1:建立索引 2:各种搜索方式方法 3:删除索引 4:检查索引文件 5:恢复删除的索引 6:强制删除 7:更新索引 8:合并索引 9:高亮回显 供大家参考...
4. **建立索引**:将预处理后的文本输入Lucene,构建索引。索引包含词项(terms)及其在文档中的位置信息,便于快速查找。 5. **查询处理**:用户输入查询后,Lucene会分析查询字符串并生成查询对象。查询对象与...
这样你就告诉 lucene 我要在 c 盘的 index 目录下建立索引文件,我要使用车东老师的二分词算法做分析器、我要在这个目录下删除以前的索引或任何文件创立我的索引文件。 索引的建立有三种方式,让我一一道来: 1 ...
数据库和Lucene建立索引都是为了查找方便,但是数据库仅仅针对部分字段进行建立,且需要把数据转化为格式化信息,并予以保存。而全文检索是将全部信息按照一定方式进行索引。 Lucene的架构设计主要包括两块:一是...
在这个例子中,`fileDir` 指定包含待索引文本文件的目录,`indexDir` 是存储 Lucene 索引文件的位置。`StandardAnalyzer` 是 Lucene 提供的一个标准分词器,用于处理英文文本。`IndexWriter` 是负责创建和更新索引的...