首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在org.apache.lucene.store.RAMDirectory中未找到org.apache.lucene.index.IndexNotFoundException: no segments*文件

在org.apache.lucene.store.RAMDirectory中未找到org.apache.lucene.index.IndexNotFoundException: no segments*文件
EN

Stack Overflow用户
提问于 2012-05-05 17:57:30
回答 4查看 20.2K关注 0票数 15

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

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

代码语言:javascript
复制
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);
    } 
EN

回答 4

Stack Overflow用户

发布于 2013-04-25 19:47:49

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

票数 26
EN

Stack Overflow用户

发布于 2012-05-05 18:16:25

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

代码语言:javascript
复制
writer.close();

如果您必须在写入完成之前打开IndexReader,则必须告诉IndexReader重新打开索引才能看到更改。

票数 18
EN

Stack Overflow用户

发布于 2014-05-10 06:01:24

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

代码语言:javascript
复制
    directory = new RAMDirectory();
    iwriter = new IndexWriter(directory, config);
    iwriter.commit();

现在打开搜索器

代码语言:javascript
复制
ireader = DirectoryReader.open(directory);
isearcher = new IndexSearcher(ireader);

还要记住,在添加文档后需要调用commit,否则搜索可能找不到它。提交后需要重新打开搜索器(当然要关闭旧的搜索器)。

代码语言:javascript
复制
iwriter.commit();
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10460737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档