Lucene 4.4.0新Controlled RealtimeRestore线程示例用法

Lucene 4.4.0新Controlled RealtimeRestore线程示例用法,lucene,Lucene,在Lucene的新4.4.0版本中,近实时管理器(org.apache.Lucene.search.NRTManage)已被替换为 有没有人有一些新ControlleDrealtimeRecoverThread使用的示例代码 编辑:我在下面回答我自己的问题我对这个问题做了一些研究,并建立了一个实用类型。。。没有经过充分的测试(特别是在并发条件下),无论如何它都可以工作,而且我非常确定它是线程安全的 @Slf4j 公共类LuceneIndex{ 私人最终索引编写器(IndexWriter);; 私

在Lucene的新4.4.0版本中,近实时管理器(org.apache.Lucene.search.NRTManage)已被替换为

有没有人有一些新ControlleDrealtimeRecoverThread使用的示例代码


编辑:我在下面回答我自己的问题

我对这个问题做了一些研究,并建立了一个实用类型。。。没有经过充分的测试(特别是在并发条件下),无论如何它都可以工作,而且我非常确定它是线程安全的

@Slf4j
公共类LuceneIndex{
私人最终索引编写器(IndexWriter);;
私人最终跟踪索引编写器\u跟踪索引编写器;
私人最终参考管理器(索引搜索器参考管理器),;
private final ControlledRealTimeRestoreThread_IndexSearcherRestoreThread;
private long _rebootToken;//索引更新/删除方法返回标记
//////////建造商和定稿
/**
*基于负责lucene索引持久性的类型的实例的构造函数
*/
@注入
公共LuceneIndex(最终目录luceneDirectory,
最终分析仪(分析仪){
试一试{
//[1]:创建indexWriter
_indexWriter=新的indexWriter(Lucene目录,
新的IndexWriterConfig(LuceneConstants.VERSION,
分析仪);
//[2a]:创建TrackingIndexWriter以跟踪对先前创建的委托IndexWriter的更改
_trackingIndexWriter=新的trackingIndexWriter(_indexWriter);
//[2b]:创建一个IndexSearcher引用管理器,以便跨多个应用程序安全地共享IndexSearcher实例
//多线程
_indexSearcherReferenceManager=新的SearcherManager(_indexWriter,
是的,
无效);
//[3]:创建ControlledRealTimeRebootThread,该线程将定期重新打开索引
//说明对索引所做的更改,并由TrackingIndexWriter实例跟踪
//无人等待时,索引每60秒刷新一次
//每当有人等待时,每100毫秒一次(参见搜索方法)
//(见http://lucene.apache.org/core/4_3_0/core/org/apache/lucene/search/NRTManagerReopenThread.html)
_IndexSearcherRebootThread=新的ControlledRealtimeRebootThread(\u trackingIndexWriter,
_indexSearcherReferenceManager,
60.00,//当无人等待时
0.1);//当有人在等待时
_IndexSearcherRestoreThread.start();//启动刷新线程
}捕获(IOException ioEx){
抛出新的IllegalStateException(“无法创建Lucene索引:”+ioEx.getMessage());
}
}
@凌驾
受保护的void finalize()抛出可丢弃的{
这个。关闭();
super.finalize();
}
/**
*关闭每个索引
*/
公众假期结束(){
试一试{
//停止索引读取器,重新打开线程
_IndexSearcherThread.interrupt();
_IndexSearcherThread.close();
//关闭indexWriter,提交所有待处理的内容
_indexWriter.commit();
_indexWriter.close();
}捕获(IOException ioEx){
log.error(“关闭lucene索引时出错:{}”,ioEx.getMessage(),
ioEx);
}
}
//////////索引
/**
*索引Lucene文档
*@param doc要编制索引的文档
*/
公开作废索引(最终文件文件){
试一试{
_rebootToken=\u trackingIndexWriter.addDocument(doc);
debug(“在lucene中索引的文档”);
}捕获(IOException ioEx){
log.error(“在Lucene索引操作中出错:{}”,ioEx.getMessage(),
ioEx);
}最后{
试一试{
_indexWriter.commit();
}捕获(IOException ioEx){
log.error(“提交对Lucene索引的更改时出错:{}”,ioEx.getMessage(),
ioEx);
}
}
}
/**
*更新lucene文档的索引信息
*@param doc要编制索引的文档
*/
公共无效重新索引(最终期限记录期限,
最后文件{
试一试{
_RebootToken=\u trackingIndexWriter.updateDocument(recordIdTerm,
doc);
log.debug(“{}文档在lucene中重新索引”,recordIdTerm.text());
}捕获(IOException ioEx){
log.error(“lucene重新索引操作中的错误:{}”,ioEx.getMessage(),
ioEx);
}最后{
试一试{
_indexWriter.commit();
}捕获(IOException ioEx){
log.error(“提交对Lucene索引的更改时出错:{}”,ioEx.getMessage(),
ioEx);
}
}
}
/**
*取消lucene文档的索引
*@param idTerm用于定位要取消索引的文档
*重要提示!术语必须仅过滤文档,且仅过滤文档
*否则,所有匹配的文档都将被取消编码
package kr.nsri.lucene440;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.index.TrackingIndexWriter;
import org.apache.lucene.search.ControlledRealTimeReopenThread;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ReferenceManager;
import org.apache.lucene.search.SearcherManager;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;

public class AddRandom {

    public static void main(String[] args) throws IOException,
            InterruptedException {

        // Basic Environment
        FSDirectory dir = FSDirectory
                .open(new File("/Users/inseog/tmp/lu440/"));
        Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
        IndexWriterConfig indexWriterConfig = new IndexWriterConfig(
                Version.LUCENE_44, analyzer);
        indexWriterConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);
        IndexWriter indexWriter = new IndexWriter(dir, indexWriterConfig);

        // Real time handler
        TrackingIndexWriter trackingIndexWriter = new TrackingIndexWriter(
                indexWriter);
        ReferenceManager<IndexSearcher> searcherManager = new SearcherManager(
                indexWriter, false, null);

        // thread handling
        ControlledRealTimeReopenThread<IndexSearcher> writeControlThread = new ControlledRealTimeReopenThread<IndexSearcher>(
                trackingIndexWriter, searcherManager, 1.0, 0.1);
        writeControlThread.setName("Update Reopen Thread");
        writeControlThread.setPriority(Math.min(Thread.currentThread()
                .getPriority() + 2, Thread.MAX_PRIORITY));
        writeControlThread.setDaemon(true);
        writeControlThread.start();

        // start writer and reader, and wait 10 minutes
        WriteDoc wdoc = new WriteDoc(trackingIndexWriter, searcherManager);
        ReadDoc rdoc = new ReadDoc(searcherManager);

        ExecutorService exman = Executors.newFixedThreadPool(5);
        exman.submit(wdoc);
        exman.submit(rdoc);

        Thread.sleep(1L * 60L * 1000L);

        exman.shutdown();
        exman.awaitTermination(5, TimeUnit.SECONDS);

        System.out.println("Closing...");

        writeControlThread.close();
        searcherManager.close();
        indexWriter.close();
        dir.close();

    }

}

package kr.nsri.lucene440;

import java.util.Calendar;
import java.util.Random;
import java.util.concurrent.Callable;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ReferenceManager;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.util.Version;

public class ReadDoc implements Callable<Long> {

    private ReferenceManager<IndexSearcher> searcherManager;
    private final Random rand = new Random(Calendar.getInstance()
            .getTimeInMillis());
    private Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_44);
    private QueryParser parser = new QueryParser(Version.LUCENE_44, "content",
            analyzer);

    public ReadDoc(ReferenceManager<IndexSearcher> searchManager) {
        this.searcherManager = searchManager;
    }

    @Override
    public Long call() {
        while (true) {
            try {
                if (Thread.interrupted())
                    break;
                //
                // get index searcher from searcherManager
                //
                IndexSearcher wsrch = searcherManager.acquire();
                //
                // read current status
                //
                System.out.println("------------------ total count: "
                        + wsrch.collectionStatistics("content").docCount());
                Query query = parser.parse("abcde");
                TopDocs topDocs = wsrch.search(query, null, 2000);
                ScoreDoc[] scoreDocs = topDocs.scoreDocs;
                for (ScoreDoc sd : scoreDocs) {
                    Document wd = wsrch.doc(sd.doc);
                    System.out.println("\tRead: " + wd.get("content"));
                }
                //
                // release index searcher for reopen handling
                //
                searcherManager.release(wsrch);
                //
                // random wait
                //
                if (Thread.interrupted())
                    break;
                Thread.sleep(rand.nextInt(15000));
            } catch (Exception e) {
                break;
            }
        }

        return 0L;

    }
}

package kr.nsri.lucene440;

import java.io.IOException;
import java.util.Calendar;
import java.util.Random;
import java.util.concurrent.Callable;

import org.apache.lucene.document.Document;
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.TrackingIndexWriter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ReferenceManager;

public class WriteDoc implements Callable<Long> {

    private TrackingIndexWriter trackingIndexWriter;
    private ReferenceManager<IndexSearcher> searcherManager;
    private final Random rand = new Random(Calendar.getInstance()
            .getTimeInMillis());

    public WriteDoc(TrackingIndexWriter trackingIndexWriter,
            ReferenceManager<IndexSearcher> searcherManager) {
        this.trackingIndexWriter = trackingIndexWriter;
        this.searcherManager = searcherManager;
    }

    @Override
    public Long call() {
        Long wcnt = 0L;
        while (true) {
            if (Thread.interrupted())
                break;
            Document doc = new Document();
            Long tweetID = rand.nextLong();
            String userName = anyWord();
            String content = anySentence();
            doc.add(new LongField("tweetID", tweetID, Store.YES));
            doc.add(new StringField("userScreenname", userName, Store.YES));
            doc.add(new TextField("content", content, Store.YES));
            try {
                //
                // add document
                //
                trackingIndexWriter.addDocument(doc);
                System.out.println("\t"+"new doc: "+content);
                //
                // signal searcher may be reopen to include new document
                //
                searcherManager.maybeRefresh();
                //
                // random wait
                //
                ++wcnt;
                if (Thread.interrupted())
                    break;
                Thread.sleep(rand.nextInt(15000));
            } catch (IOException | InterruptedException e) {
                break;
            }
        }

        return wcnt;
    }

    private String anyWord() {
        String r = "";
        String base = "abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int wordLen = 1 + rand.nextInt(9);
        int baseLen = base.length();
        for (int wx = 0; wx < (1 + wordLen); ++wx)
            r += base.charAt(rand.nextInt(baseLen));
        return r;
    }

    private String anySentence() {
        String r = "";
        int wordCount = 1 + rand.nextInt(20);
        for (int wx = 0; wx < wordCount; ++wx)
            r += anyWord() + " ";
        return r + "abcde";
    }

}