`
Tonyguxu
  • 浏览: 277735 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Lucene】store包FSDirectory

阅读更多

源码中涉及以下知识点:

1.java.security.MessageDigest

2.org.apache.lucene.store.LockFactory

org.apache.lucene.store.FSLockFactory

见FSDirectory构造

3.32bit与64bit操作系统

4.sync中RandomAccessFile、FileDescriptor

5.getLockId中位运算

 

相比父类Directory

新增方法1:static open()

因为SUN的JRE长期在WIN平台上存在问题,所以使用NIOFSDirectory性能会较差,这样需要根据不同平台来选择合理的

FSDirectory,静态方法open提供了一种简化的方法来创建平台合适的FSDirectory实例,免除了开发者自己进行平台判断。

 

public static FSDirectory open(File path) throws IOException {
    return open(path, null);
  }

public static FSDirectory open(File path, LockFactory lockFactory) throws IOException {
    if (Constants.WINDOWS) {
      return new SimpleFSDirectory(path, lockFactory);
    } else {
      return new NIOFSDirectory(path, lockFactory);
    }
  }
 

覆盖方法1:sync()

在父类abstract Directory声明如下:

 

/** Ensure that any writes to this file are moved to
   *  stable storage.  Lucene uses this to properly commit
   *  changes to the index, to prevent a machine/OS crash
   *  from corrupting the index. */
  public void sync(String name) throws IOException {}

 子类abstract FSDirectory进行了override

 

@Override
  public void sync(String name) throws IOException {
    ensureOpen();
    File fullFile = new File(directory, name);
    boolean success = false;
    int retryCount = 0;
    IOException exc = null;
    while(!success && retryCount < 5) {
      retryCount++;
      RandomAccessFile file = null;
      try {
        try {
          file = new RandomAccessFile(fullFile, "rw");
          file.getFD().sync();
          success = true;
        } finally {
          if (file != null)
            file.close();
        }
      } catch (IOException ioe) {
        if (exc == null)
          exc = ioe;
        try {
          // Pause 5 msec
          Thread.sleep(5);
        } catch (InterruptedException ie) {
          throw new ThreadInterruptedException(ie);
        }
      }
    }
    if (!success)
      // Throw original exception
      throw exc;
  }
 

覆盖方法2:getLockID()

在父类abstract Directory声明如下:

 

/**
   * Return a string identifier that uniquely differentiates
   * this Directory instance from other Directory instances.
   * This ID should be the same if two Directory instances
   * (even in different JVMs and/or on different machines)
   * are considered "the same index".  This is how locking
   * "scopes" to the right index.
   */
  public String getLockID() {
      return this.toString();
  }

  @Override
  public String toString() {
    return super.toString() + " lockFactory=" + getLockFactory();
  }

  子类abstract FSDirectory进行了override

 

@Override
  public String getLockID() {
    ensureOpen();
    String dirName;                               // name to be hashed
    try {
      dirName = directory.getCanonicalPath();
    } catch (IOException e) {
      throw new RuntimeException(e.toString(), e);
    }

    byte digest[];
    synchronized (DIGESTER) {
      digest = DIGESTER.digest(dirName.getBytes());
    }
    StringBuilder buf = new StringBuilder();
    buf.append("lucene-");
    for (int i = 0; i < digest.length; i++) {
      int b = digest[i];
      buf.append(HEX_DIGITS[(b >> 4) & 0xf]);
      buf.append(HEX_DIGITS[b & 0xf]);
    }

    return buf.toString();
  }
分享到:
评论

相关推荐

    lucene 最新版本所有jar包

    5. **Lucene-Store**: 包含用于存储和读取索引的不同策略,如RAMDirectory、FSDirectory等。 6. **Lucene-Util**: 提供了一系列实用工具类,如BitSet、FieldInfos、IndexInput和IndexOutput等。 7. **Lucene-Codec...

    lucene,lucene教程,lucene讲解

    org.apache.lucene.store.Directory public abstract class Analyzer org.apache.lucene.analysis.Analyzer public final class Document org.apache.lucene.document.Document public final class Field org....

    Lucene建立索引及查询包含“java”关键字 示例代码

    import org.apache.lucene.store.FSDirectory; import java.nio.file.Paths; public class IndexingExample { public static void main(String[] args) throws Exception { Directory directory = FSDirectory....

    lucene最新版本3.3的基本功能用法(IK分词是3.2.8)

    2. 集成IK分词器:在Lucene中集成IK,首先需要将IKAnalyzer的jar包添加到项目的类路径中。然后,在创建Analyzer时,使用IKAnalyzer类替换默认的Analyzer,这样在索引和搜索过程中就会使用IK进行分词。 三、使用步骤...

    lucene实现 源代码,里面还含有索引创建,搜索等功能

    Directory directory = FSDirectory.open(Paths.get("index_dir")); IndexWriterConfig config = new IndexWriterConfig(analyzer); IndexWriter writer = new IndexWriter(directory, config); Document doc = new...

    lucene练习代码

    import org.apache.lucene.store.FSDirectory; public class Indexer { public static void main(String[] args) throws Exception { Directory directory = FSDirectory.open(Paths.get("index_dir")); // 指定...

    lucene2.9.1所有最新开发包及源码及文档

    开源全文搜索工具包Lucene2.9.1的使用。 1. 搭建Lucene的开发环境:在classpath中添加lucene-core-2.9.1.jar包 2. 全文搜索的两个工作: 建立索引文件,搜索索引. 3. Lucene的索引文件逻辑结构 1) 索引(Index)由...

    Lucene.Net-2.9.2 c#源码

    1. 初始化:首先,你需要创建一个Directory对象来指向存储索引的物理位置,如RAMDirectory或FSDirectory。 2. 创建索引:使用IndexWriter添加文档到索引。每个文档实例化为Document对象,然后添加多个字段。每个...

    lucene使用教程

    ### Lucene 使用教程 ...通过本文介绍的基础操作,读者可以了解到如何创建和搜索索引,以及如何在项目中正确地配置Lucene的依赖包。对于更高级的功能和优化策略,建议进一步阅读Lucene的官方文档和其他相关资源。

    C#调用Lucene方法-实现快速搜索

    可以通过NuGet包管理器安装`Lucene.Net`和`Lucene.Net.Analysis.Standard`等必要的包。 2. **创建索引**:索引是Lucene搜索的核心。我们需要定义一个Analyzer(分析器)来处理文本,如使用StandardAnalyzer进行英文...

    lucene实例lucene实例

    doc.add(new TextField("content", "这是文档内容", Field.Store.YES)); writer.addDocument(doc); writer.commit(); writer.close(); ``` 2. 搜索(Searching):创建一个索引Reader,然后基于Reader构建Searcher...

    lucene2.9开发指南

    《Lucene2.9开发指南》是一份专为初级开发者准备的资料,旨在详细介绍如何使用开源全文搜索工具包Lucene2.9.1。Lucene作为一个强大的文本搜索库,其核心功能包括建立索引和执行搜索。以下是关于Lucene2.9开发的一些...

    Lucene初探,一个初级的LuceneDemo

    doc.add(new TextField("content", "这是一个关于Lucene的初级示例", Field.Store.YES)); ``` 4. **索引文档**:使用`addDocument()`方法将文档添加到索引。 ```java indexWriter.addDocument(doc); ``` 5. **...

    SpringBoot+Lucene搜索结果高亮显示Demo

    doc.add(new TextField("content", "搜索内容", Field.Store.YES)); indexWriter.addDocument(doc); indexWriter.close(); // 搜索 IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(indexDir...

    Lucene 索引的简单使用

    3. **创建文档**:定义Document对象,添加Field,如`doc.add(new TextField("content", "文本内容", Store.YES))`。 4. **添加文档到索引**:使用`indexWriter.addDocument(doc)`将文档写入索引。 5. **关闭...

    Lucene索引的基本操作

    **Lucene索引的基本操作** Lucene是一款由Apache软件基金会开发的全文检索库,它提供了高效、可扩展的全文检索功能。在Java开发环境中,Lucene是广泛使用的文本搜索工具,能够帮助开发者构建复杂的搜索引擎。本文将...

    lucene.net 2.9.2 实现索引生成,修改,查询,删除实例

    var directory = FSDirectory.Open(new DirectoryInfo("index_directory")); using (var indexWriter = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.UNLIMITED)) { // 添加文档到索引...

    lucene实现全文搜索

    3. **Directory**:存储索引的地方,Lucene提供两种类型的Directory,FSDirectory用于磁盘存储,RAMDirectory用于内存存储,前者是更常见的选择,但在某些情况下,内存索引可以提高性能。 4. **Analyzer**:负责对...

    Lucene3.5实例

    首先,我们导入必要的包,包括`java.io`用于文件读写,`org.apache.lucene`是Lucene的核心包,包含了创建索引、查询等所需的所有类。特别地,我们引入了`IKAnalyzer`,这是一个基于Lucene的中文分词器,它能够有效地...

Global site tag (gtag.js) - Google Analytics