当前位置: 首页 > 面试题库 >

如何在Lucene中将RAMDirectory集成到FSDirectory

谭彦
2023-03-14
问题内容

我现在有一个问题,关于Lucene。我试图制作一个Lucene源代码,该代码可以进行索引,并先使用RAMDirectory将它们存储在内存中,然后使用FSDirectory将该索引从内存中刷新到磁盘中。我已经对该代码进行了一些修改,但无济于事。也许有些人可以帮我一点忙。

因此,在将RAMDirectory放入FSDirectory之前,将其集成到此源代码中的最佳方法是什么。任何帮助将不胜感激,尽管这里是源代码。

import org.apache.lucene.analysis.SimpleAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class SimpleFileIndexer {
    public static void main(String[] args) throws Exception {
        File indexDir = new File("C:/Users/Raden/Documents/lucene/LuceneHibernate/adi");
        File dataDir = new File("C:/Users/Raden/Documents/lucene/LuceneHibernate/adi");
        String suffix = "txt";
        SimpleFileIndexer indexer = new SimpleFileIndexer();
        int numIndex = indexer.index(indexDir, dataDir, suffix);
        System.out.println("Total files indexed " + numIndex);
    }

    private int index(File indexDir, File dataDir, String suffix) throws Exception {
        IndexWriter indexWriter = new IndexWriter(
                FSDirectory.open(indexDir),
                new SimpleAnalyzer(),
                true,
                IndexWriter.MaxFieldLength.LIMITED);
        indexWriter.setUseCompoundFile(false);
        indexDirectory(indexWriter, dataDir, suffix);
        int numIndexed = indexWriter.maxDoc();
        indexWriter.optimize();
        indexWriter.close();
        return numIndexed;
    }

    private void indexDirectory(IndexWriter indexWriter, File dataDir, String suffix) throws IOException {
        File[] files = dataDir.listFiles();
        for (int i = 0; i < files.length; i++) {
            File f = files[i];
            if (f.isDirectory()) {
                indexDirectory(indexWriter, f, suffix);
            } else {
                indexFileWithIndexWriter(indexWriter, f, suffix);
            }
        }
    }

    private void indexFileWithIndexWriter(IndexWriter indexWriter, File f, String suffix) throws IOException {
        if (f.isHidden() || f.isDirectory() || !f.canRead() || !f.exists()) {
            return;
        }
        if (suffix != null && !f.getName().endsWith(suffix)) {
            return;
        }
        System.out.println("Indexing file " + f.getCanonicalPath());
        Document doc = new Document();
        doc.add(new Field("contents", new FileReader(f)));
        doc.add(new Field("filename", f.getCanonicalPath(), Field.Store.YES, Field.Index.ANALYZED));
        indexWriter.addDocument(doc);
    }
}

问题答案:

我不太确定您会从中获得任何性能提升,但是可以对a进行所有索引RAMDirectory编制,然后将目录复制到FSDirectory。

像这样:

private int index(File indexDir, File dataDir, String suffix) throws Exception {
    RAMDirectory ramDir = new RAMDirectory();          // 1
    IndexWriter indexWriter = new IndexWriter(
            ramDir,                                    // 2
            new SimpleAnalyzer(),
            true,
            IndexWriter.MaxFieldLength.LIMITED);
    indexWriter.setUseCompoundFile(false);
    indexDirectory(indexWriter, dataDir, suffix);
    int numIndexed = indexWriter.maxDoc();
    indexWriter.optimize();
    indexWriter.close();

    Directory.copy(ramDir, FSDirectory.open(indexDir), false); // 3

    return numIndexed;
}


 类似资料:
  • 问题内容: 我正在尝试将Lucene与EclipseLink结合使用,并想知道那里是否有任何好的集成库?我已经看过太阳耀斑,看起来像石灰,它可以满足我的要求,但是它已经过时了(尽管我使用的是EclipseLink的较旧版本,但我使用的是Lucene 4.10)这可能有用,但是我找不到任何文档,有关如何使用它的示例或教程。 任何建议将不胜感激(我也不相信我们也可以切换到Hibernate) 提前致谢

  • 问题内容: 我广泛使用Selenium进行集成测试。适用于所有常规内容(HTML / AJAX),但是当我尝试测试第三方ActiveX,Java applet和Flash组件时却一无所获。 我为此找到的解决方案是Sikuli。在本地运行良好,但是如何将其集成到Selenium中呢? 顺便说一句 如果相关,对于Selenium,我正在使用Python API。 问题答案: 请参阅Selenium R

  • 问题内容: 我正在运行,尽管要在我的下一个应用程序中集成angularjs。 我认为从服务器端最好的方法是在域和控制器类中使用grails 集成。 但是在这里我被困住了。 如何通过grails与angularjs进行通信?(通过?,如果可以的话,如何将其集成?)什么是好的架构? 非常感谢您的回答!!! PS .:我知道有一个grails angular js插件。但是我确实发现有使用它的任何理由!

  • 我已经创建了这个控制器 报告consultas.jrxml位于folded resources上 当我运行te应用程序并运行endpoint时,我会出现以下错误: 你能帮我吗?

  • 我正试图将Storm(见这里)整合到我的项目中。我熟悉拓扑结构、喷口和螺栓的概念。但现在,我正试图弄清楚一些事情的实际实现。 所以第一个问题是如何将进入这些方法的数据连接到喷口?我试图i)传递一个backtype.storm.topology.irichspout,然后ii)传递一个backtype.storm.spout.spoutoutputcollector(见这里)给那个spout的打开函

  • 我正在我的项目中使用Sikuli来处理一些flash按钮。当在本地运行脚本时,它工作得很好。问题是,当我需要运行build.gradle时,我需要在build.gradle中有Sikuli依赖项。我就是这么写的。运行构建时,会出现以下错误: > 错误:无法解析配置“:Compile”的所有依赖项。 找不到com.googlecode.javacpp:javacpp:0.1.要求::new_qa_a