Java Solr更新indexwriter在重新启动之前不会影响搜索
我实现了一个Solr插件,用于更新Solr事件的一些字段(提交、优化等)。我的问题是更新的文档不会影响Solr搜索,直到我手动尝试重新启动Solr。请看一下我的代码,告诉我是什么原因导致了这个问题 问候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
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已重命名)