1

我实现了一个小代码,目的是从 Lucene 索引中提取一些关键字。我确实使用搜索组件实现了这一点。我的问题是当我尝试更新 Lucene IndexWriter 时,放在上面的 Solr 索引不会影响。如您所见,我做了提交部分。

BooleanQuery query = new BooleanQuery();
    for (String fieldName : keywordSourceFields) {
      TermQuery termQuery = new TermQuery(new Term(fieldName,"N/A"));
      query.add(termQuery, Occur.MUST_NOT);
    }
    TermQuery termQuery=new TermQuery(new Term(keywordField, "N/A"));
    query.add(termQuery, Occur.MUST);
    try {
      //Query q= new QueryParser(keywordField, new StandardAnalyzer()).parse(query.toString());
      TopDocs results = searcher.search(query,
          maxNumDocs);
      ScoreDoc[] hits = results.scoreDocs;
      IndexWriter writer = getLuceneIndexWriter(searcher.getPath());
      for (int i = 0; i < hits.length; i++) {
        Document document = searcher.doc(hits[i].doc);
        List<String> keywords = keyword.getKeywords(hits[i].doc);
        if(keywords.size()>0) document.removeFields(keywordField);
        for (String word : keywords) {
          document.add(new StringField(keywordField, word, Field.Store.YES));
        }
        String uniqueKey = searcher.getSchema().getUniqueKeyField().getName();
        writer.updateDocument(new Term(uniqueKey, document.get(uniqueKey)),
            document);
      }
      writer.commit();
      writer.forceMerge(1);
      writer.close();
    } catch (IOException | SyntaxError e) {
      throw new RuntimeException();
    }

private IndexWriter getLuceneIndexWriter(String indexPath) throws IOException {
    FSDirectory directory = FSDirectory.open(new File(indexPath).toPath());
    Analyzer analyzer = new StandardAnalyzer();
    IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
    return new IndexWriter(directory, iwc);
  }

请帮助我解决这个问题。

更新: 我做了一些调查,发现文件的检索部分工作正常,而 Solr 没有重新启动。但是文档的搜索部分不起作用。在我重新启动 Solr 后,似乎核心损坏并且无法启动!这是相应的日志:

org.apache.solr.common.SolrException: Error opening new searcher
    at org.apache.solr.core.SolrCore.<init>(SolrCore.java:896)
    at org.apache.solr.core.SolrCore.<init>(SolrCore.java:662)
    at org.apache.solr.core.CoreContainer.create(CoreContainer.java:513)
    at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:278)
    at org.apache.solr.core.CoreContainer$1.call(CoreContainer.java:272)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)
Caused by: org.apache.solr.common.SolrException: Error opening new searcher
    at org.apache.solr.core.SolrCore.openNewSearcher(SolrCore.java:1604)
    at org.apache.solr.core.SolrCore.getSearcher(SolrCore.java:1716)
    at org.apache.solr.core.SolrCore.<init>(SolrCore.java:868)
    ... 9 more
Caused by: org.apache.lucene.index.IndexNotFoundException: no segments* file found in NRTCachingDirectory(MMapDirectory@C:\Users\Ali\workspace\lucene_solr_5_0_0\solr\server\solr\document\data\index lockFactory=org.apache.lucene.store.SimpleFSLockFactory@3bf76891; maxCacheMB=48.0 maxMergeSizeMB=4.0): files: [_2_Lucene50_0.doc, write.lock, _2_Lucene50_0.pos, _2.nvd, _2.fdt, _2_Lucene50_0.tim]
    at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:821)
    at org.apache.solr.update.SolrIndexWriter.<init>(SolrIndexWriter.java:78)
    at org.apache.solr.update.SolrIndexWriter.create(SolrIndexWriter.java:65)
    at org.apache.solr.update.DefaultSolrCoreState.createMainIndexWriter(DefaultSolrCoreState.java:272)
    at org.apache.solr.update.DefaultSolrCoreState.getIndexWriter(DefaultSolrCoreState.java:115)
    at org.apache.solr.core.SolrCore.openNewSearcher(SolrCore.java:1573)
    ... 11 more

4/7/2015, 6:53:26 PM
ERROR
SolrIndexWriter
SolrIndexWriter was not closed prior to finalize(),​ indicates a bug -- POSSIBLE RESOURCE LEAK!!!
4/7/2015, 6:53:26 PM
ERROR
SolrIndexWriter
Error closing IndexWriter
java.lang.NullPointerException
    at org.apache.lucene.index.IndexWriter.doFlush(IndexWriter.java:2959)
    at org.apache.lucene.index.IndexWriter.flush(IndexWriter.java:2927)
    at org.apache.lucene.index.IndexWriter.shutdown(IndexWriter.java:965)
    at org.apache.lucene.index.IndexWriter.close(IndexWriter.java:1010)
    at org.apache.solr.update.SolrIndexWriter.close(SolrIndexWriter.java:130)
    at org.apache.solr.update.SolrIndexWriter.finalize(SolrIndexWriter.java:183)
    at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
    at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:101)
    at java.lang.ref.Finalizer.access$100(Finalizer.java:32)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:190)

我的猜测是索引关键字字段的问题以及与关闭 IndexWriter 相关的问题。

4

0 回答 0