Java Solr更新indexwriter在重新启动之前不会影响搜索

Java Solr更新indexwriter在重新启动之前不会影响搜索,java,solr,lucene,indexwriter,Java,Solr,Lucene,Indexwriter,我实现了一个Solr插件,用于更新Solr事件的一些字段(提交、优化等)。我的问题是更新的文档不会影响Solr搜索,直到我手动尝试重新启动Solr。请看一下我的代码,告诉我是什么原因导致了这个问题 问候 boolean success = false; NamedList response = new SimpleOrderedMap(); keyword.init(searcher, params); BooleanQuery query = new Boole

我实现了一个Solr插件,用于更新Solr事件的一些字段(提交、优化等)。我的问题是更新的文档不会影响Solr搜索,直到我手动尝试重新启动Solr。请看一下我的代码,告诉我是什么原因导致了这个问题

问候

    boolean success = false;
    NamedList response = new SimpleOrderedMap();
    keyword.init(searcher, params);
    BooleanQuery query = new BooleanQuery();
    for (String fieldName : keywordSourceFields) {
      TermQuery termQuery = new TermQuery(new Term(fieldName, "noval"));
      query.add(termQuery, Occur.MUST_NOT);
    }
    TermQuery termQuery = new TermQuery(new Term(keywordField, "noval"));
    query.add(termQuery, Occur.MUST);
    RefCounted<IndexWriter> iw = null;
    IndexWriter writer = null;
    try {
      TopDocs results = searcher.search(query, maxNumDocs);
      ScoreDoc[] hits = results.scoreDocs;
      iw = solrCoreState.getIndexWriter(core);
      writer = iw.get();
      FieldType type = new FieldType(StringField.TYPE_STORED);
      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 Field(keywordField, word, type));
        }
        String uniqueKey = searcher.getSchema().getUniqueKeyField().getName();
        writer.updateDocument(new Term(uniqueKey, document.get(uniqueKey)),
            document);
      }
      response.add("Number of Selected Docs", results.totalHits);
      writer.commit();
    } catch (IOException | SyntaxError e) {
      throw new RuntimeException();
    } finally {
      if (iw != null) {
        iw.decref();
      }
    }
boolean success=false;
NamedList响应=新建SimpleOrderedMap();
关键字.init(搜索者,参数);
BooleanQuery=新建BooleanQuery();
for(字符串字段名:关键字源字段){
TermQuery TermQuery=新TermQuery(新术语(字段名,“noval”));
query.add(termQuery,Occurse.NOT);
}
TermQuery TermQuery=新TermQuery(新术语(关键字字段,“noval”));
query.add(termQuery,occurrent.MUST);
ref=null;
IndexWriter writer=null;
试一试{
TopDocs results=searcher.search(查询,maxNumDocs);
ScoreDoc[]点击次数=结果。scoreDocs;
iw=solrCoreState.getIndexWriter(核心);
writer=iw.get();
FieldType类型=新的FieldType(StringField.type_已存储);
for(int i=0;i0)document.removeFields(关键字字段);
for(字符串字:关键字){
添加(新字段(关键字字段、单词、类型));
}
字符串uniqueKey=searcher.getSchema().getUniqueKeyField().getName();
writer.updateDocument(新术语(uniqueKey,document.get(uniqueKey)),
文件);
}
响应.添加(“所选文档数”,结果.总点击数);
writer.commit();
}捕获(IOException |语法错误e){
抛出新的RuntimeException();
}最后{
如果(iw!=null){
iw.decref();
}
}

您需要重新打开搜索程序。@user1071777我知道重新打开搜索程序的成本太高。有没有办法在不重新打开搜索程序的情况下解决此问题?顺便说一句,我怎样才能重新打开搜索引擎?我对Solr不太熟悉,但在Lucene中你应该使用。它允许您定义重新打开搜索程序的频率。另请参见和(NRTManagerOpenThread已重命名)