org.apache.lucene.index.IndexNotFoundException:org.apache.lucene.store.RAMDirectory中找不到segments*文件

Ahm*_*ani 15 java lucene netbeans

我是Java和Lucene的新手.我的代码从文件中获取一行并将其存储在Lucene Index中.但是当我创建一个IndexReader搜索索引并从索引读取时,它会抛出一个异常.

我的java代码如下.在创建IndexReader它时抛出一个IndexNotFoundException

static String itemsfreq[];
static StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_35);
static IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_35, analyzer);

public static void index_data(Directory indexed_document,int doc_num,IndexWriter w) throws IOException
    {
    for(int i = 0;i < itemsfreq.length;i++)
        {
        Document doc = new Document();
        doc.add(new Field(Integer.toString(doc_num)+","+itemsfreq[i],itemsfreq[i++], Field.Store.YES, Field.Index.ANALYZED));
        w.addDocument(doc);
        }
    }
//Gets string from a file and insert it in INDEX named indexed_document
public static void main(String[] args) throws IOException
    {
    BufferedReader reader = new BufferedReader(new FileReader("fullText100.txt"));
    String line;
    int i = 0;
    Directory indexed_document = new RAMDirectory();
    IndexWriter writer = new IndexWriter(indexed_document, config);
    while((line=reader.readLine()) != null)
        {
        if(i == 1)
            {
            break;
            }
        itemsfreq = line.split(" ");
        index_data(indexed_document,i,writer);
        i++;
        }

    IndexReader r = IndexReader.open(indexed_document);
    } 
Run Code Online (Sandbox Code Playgroud)

小智 24

在使用阅读器打开索引之前,请调用一次 writer.commit()

  • 实际上,这是正确的解决方案,因为Lucene docs建议重新使用IndexWriter和IndexReader的单个实例; 这样我就不会被迫关闭编写器并在需要时再创建它. (3认同)

csu*_*nig 17

要将更改写入索引,您必须关闭索引编写器,然后打开IndexReader.

writer.close();
Run Code Online (Sandbox Code Playgroud)

如果必须在写入完成之前打开IndexReader,则必须告诉IndexReader重新打开索引以查看更改.


sof*_*dia 5

您需要做的是在打开IndexSearcher之前显式调用commit.

    directory = new RAMDirectory();
    iwriter = new IndexWriter(directory, config);
    iwriter.commit();
Run Code Online (Sandbox Code Playgroud)

现在打开搜索者

ireader = DirectoryReader.open(directory);
isearcher = new IndexSearcher(ireader);
Run Code Online (Sandbox Code Playgroud)

还记得你需要在添加文档后调用commit,否则搜索可能找不到它.提交者需要在提交后重新开放(当然是关闭老搜索者).

iwriter.commit();
Run Code Online (Sandbox Code Playgroud)