Java 如何读取Lucene中的索引进行搜索?

Java 如何读取Lucene中的索引进行搜索?,java,lucene,Java,Lucene,Lucene 4.3新手 如何在Lucene 4.3中实现简单搜索 我在一个简单的Java测试用例中修改了大纲: 该示例以以下内容开始: DirectoryReader ireader = DirectoryReader.open(directory); IndexSearcher isearcher = new IndexSearcher(ireader); 但根据文档,DirectoryReader不可见(受保护)。因此,您似乎无法使用DirectoryReader 因此,我进行了挖掘并

Lucene 4.3新手

如何在Lucene 4.3中实现简单搜索

我在一个简单的Java测试用例中修改了大纲:

该示例以以下内容开始:

DirectoryReader ireader = DirectoryReader.open(directory);
IndexSearcher isearcher = new IndexSearcher(ireader);
但根据文档,DirectoryReader不可见(受保护)。因此,您似乎无法使用DirectoryReader

因此,我进行了挖掘并尝试了各种排列,以避免直接使用DirectoryReader,包括:

File indexdir = new File("D:\\lucenetest\\") ; // location of my index
Directory directory = FSDirectory.open(indexdir);

IndexReader ireader = IndexReader.open(FSDirectory.open(indexdir)); //ERROR NoSuchMethodError
//IndexReader ireader = IndexReader.open(directory); //variation ERROR NoSuchMethodError
IndexSearcher isearcher = new IndexSearcher(ireader);
等(包括试用原子阅读器)。似乎什么都不管用。(我验证了Lucene Core是否正确导入。)索引工作正常

我查看了Lucene示例搜索代码以寻找更多线索

在简单的示例文件中使用时,这也不起作用

我已经能够让简单的索引工作,以前能够让Lucene演示工作(索引和搜索)。但是,我似乎无法进行简单的搜索


有什么线索吗?

我通常用这个代码。。。它是一个用LuceneIndex(v4)封装所有操作的类
它使用对索引的近实时访问,因此几乎所有更新都可供索引读取器使用:

注意:它还使用

@Slf4j
公共类LuceneIndex{
/////////////////////////////////////////////////////////////////////////////////////////
//状态(版本)http://blog.mikemccandless.com/2011/11/near-real-time-readers-with-lucenes.html)
/////////////////////////////////////////////////////////////////////////////////////////
私人最终索引编写器(IndexWriter);;
私人最终跟踪索引编写器\u跟踪索引编写器;
私人最终NRT经理(U searchManager);
LuceneNRTReopenThread Thread=null;
private long _rebootToken;//索引更新/删除方法返回标记
/////////////////////////////////////////////////////////////////////////////////////////
//建造师
/////////////////////////////////////////////////////////////////////////////////////////
/**
*建造商在lucene的持久性责任基础上
*/
公共LuceneIndex(最终目录luceneDirectory,
最终分析仪(分析仪){
试一试{
//创建indexWriter
_indexWriter=新的indexWriter(Lucene目录,
新的IndexWriterConfig(LuceneConstants.VERSION,
分析仪);
_trackingIndexWriter=新的NRTManager.trackingIndexWriter(_indexWriter);
//创建SearchManager以执行搜索
_searchManager=新的NRTManager(_trackingIndexWriter,
新建SearcherFactory(),
正确的);
//打开负责重新打开索引的线程,使其能够看到实时更改
//无人等待时,索引每60秒刷新一次
//每当有人等待时,每100毫秒一次(参见搜索方法)
//(见http://lucene.apache.org/core/4_3_0/core/org/apache/lucene/search/NRTManagerReopenThread.html)
_RebootThread=新LucennerTreOpenThread(\u searchManager,
60.0,//当无人等待时
0.1);//当有人在等待时
_重新打开thread.startReopening();
}捕获(IOException ioEx){
//if(luceneDirectory instanceof JdbcDirectory){
//抛出新的IllegalStateException(“无法创建lucene索引的BBDD表:”+ioEx.getMessage(),ioEx);
//}其他{
抛出新的IllegalStateException(“无法创建Lucene索引:”+ioEx.getMessage());
//          }
}
}
/////////////////////////////////////////////////////////////////////////////////////////
//定稿人
/////////////////////////////////////////////////////////////////////////////////////////
@凌驾
受保护的void finalize()抛出可丢弃的{
这个。关闭();
super.finalize();
}
/**
*关闭每个索引
*/
公众假期结束(){
试一试{
//停止索引读取器,重新打开线程
_重新打开线程。停止重新打开();
_中断();
//关闭搜索管理器
_searchManager.close();
//关闭indexWriter,提交所有待处理的内容
_indexWriter.commit();
_indexWriter.close();
}捕获(IOException ioEx){
log.error(“关闭lucene索引时出错:{}”,ioEx.getMessage(),
ioEx);
}
}
/////////////////////////////////////////////////////////////////////////////////////////
//REOPEN-THREAD:负责重新打开IndexReader以访问
//IndexWriter的最新更改
/////////////////////////////////////////////////////////////////////////////////////////
私有类LuceneNRTReopenThread
扩展NRTManagerOpenThread{
volatile boolean _finished=false;
公共LucenenrTreeOpenThread(最终NRT管理器,
最终双目标MaxStaleSec,最终双目标MinStaleSec){
超级(targetMaxStaleSec、targetMinStaleSec经理);
这个.setName(“NRT重新打开线程”);
这个.setPriority(Math.min(Thread.currentThread().getPriority()+2,
线程(最大优先级);
this.setDaemon(true);
}
公共同步的void startReopening(){
_完成=错误;
这个。start();
}
公共同步的void停止重新打开(){
_完成=正确;
}
@凌驾
公开募捐{
IndexReader reader = DirectoryReader.open(FSDirectory.open(new File(index))); //DirectoryReader not visible error
    IndexSearcher searcher = new IndexSearcher(reader);
// directory where your index is stored
File path = new File(" ... /solr/solr/Collection1/data/index");

Directory index = FSDirectory.open(path);
IndexReader reader = DirectoryReader.open(index);
IndexSearcher searcher = new IndexSearcher(reader);

Term t = new Term("myfield", "myvalue");

// Get the top 10 docs
Query query = new TermQuery(t);
TopDocs tops= searcher.search(query, 10);
ScoreDoc[] scoreDoc = tops.scoreDocs;
System.out.println(scoreDoc.length); 
for (ScoreDoc score : scoreDoc){
    System.out.println("DOC " + score.doc + " SCORE " + score.score);
}

// Get the frequency of the term
int freq = reader.docFreq(t);
System.out.println("FREQ " + freq);
`