生成索引的过程:
Analyzer analyzer = new StandardAnalyzer();//分词器,决定内容的分词方式
Directory directory = FSDirectory.open(Paths.get("D:\\index"));//创建存储目录Directory
IndexWriterConfig config = new IndexWriterConfig(analyzer);//写索引的配置
IndexWriter iwriter = new IndexWriter(directory, config);//写索引类
Document doc = new Document();//类似于数据库一条数据,一个Document对象
String text = "This is the text to be indexed.";
doc.add(new Field("fieldname", text, TextField.TYPE_STORED));
//Field类似于数据库一个字段,往Document上添加
iwriter.addDocument(doc);//添加索引(其实是update)
iwriter.close();//释放资源
Directory
directory
=
FSDirectory
.
open
(
Paths
.
get
(
"D:\\index"
))
Directory是
org.apache.lucene.store包下的类
public static FSDirectory open(Path path) throws IOException {
//第二个参数使用了默认文件锁工厂 NativeFSLockFactory,是一个单例工厂
有一个方法makeFSLock根据文件目录,文件名获得文件的唯一锁NatvieFSLock
return
open
(
path
,
FSLockFactory
.
getDefault
());
}
public static FSDirectory open(Path path, LockFactory lockFactory) throws IOException {
if (Constants.JRE_IS_64BIT && MMapDirectory.UNMAP_SUPPORTED) {
return new MMapDirectory(path, lockFactory);
} else if (Constants.WINDOWS) {
return new SimpleFSDirectory(path, lockFactory);
} else {
return new NIOFSDirectory(path, lockFactory);
}
}
NativeFSLock
(
NativeFSLockFactory的内部类
)
持有一个
线程安全的Set保存所有锁的集合
private static final Set LOCK_HELD
=
Collections.synchronizedSet(new HashSet());
有一个线程安全的obtain方法获取锁,close方法释放锁.
BaseDirectory的种类
MMapDirectory,
SimpleFSDirectory,
NIOFSDirectory,RAMDirectory
MMapDirectory
把Lucence的索引当作了swap file来处理,用到了虚拟内存的映射关系读取 64位且支持虚
拟内存的系统,
默认用的这个
详细介绍 http://www.cnblogs.com/huangfox/p/3616298.html(推荐使用)
SimpleFSDirectory
BaseDirectory的简单实现 poor concurrent performance (不支持MMapDirectory的Windows系统使用)
NIOFSDirector
y
用FileChannel进行读写操作,支持多线程,不适用Windows(Sun的FileChannel.read有bug),IO线程阻塞时,
从一个线程直接或间接的
访问这个类被中断时,会立刻关闭底层文件描述符,
继续访问会抛出ClosedChaanelException
RAMDirectory 内存存储