好久没干这块东西了,近几天须要做这个。所以又一次学了一下。首先很感谢孔浩老师,没孔浩老师的视频我也不会进入lucene的殿堂。

老师当时讲的实时搜索还是NRTManager,如今已经都变了,这个类已经不存在了,在4.0之后消失的。到我如今使用的5.2.1都是以下的方法:

首先罗列会使用的特殊类(经常使用的不再赘述):

TrackingIndexWriter  追踪writer,在api中有介绍,仅仅有通过这个类进行更新ControlledRealTimeReopenThread才干获得更新

ControlledRealTimeReopenThread  实时搜索事实上叫做“近实时搜索”。就是当更新之后在非常短时间内进行了更新然后让人感觉不出来,这样说来就须要一个守护线程去坚守这个过程,当更新的时候就去获取更新然后通知查询更新了,这样“近实时搜索”就实现了,这个类就是这个守护线程。

我写了个測试在以下,里面不懂得能够查看api。也有部分凝视,希望对大家有帮助。

package com.xikoubuy.main;





import java.io.IOException;





import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.document.TextField;

import org.apache.lucene.index.IndexWriter;

import org.apache.lucene.index.IndexWriterConfig;

import org.apache.lucene.index.TrackingIndexWriter;

import org.apache.lucene.queryparser.classic.ParseException;

import org.apache.lucene.queryparser.classic.QueryParser;

import org.apache.lucene.search.ControlledRealTimeReopenThread;

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.SearcherFactory;

import org.apache.lucene.search.SearcherManager;

import org.apache.lucene.store.Directory;

import org.apache.lucene.store.RAMDirectory;

import org.wltea.analyzer.lucene.IKAnalyzer;





public class NRTTest {





private Directory directory;

private Analyzer analyzer;

////追踪writer。这样才干在更新之后通知搜索

private TrackingIndexWriter writer;

//是线程安全的.第二个參数是是否在全部缓存清空后让search看到

private SearcherManager searcherManager;

private IndexSearcher searcher;



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



new NRTTest();

}





public NRTTest() throws IOException {

directory = new RAMDirectory();

analyzer = new IKAnalyzer(true);

IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer);

IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);

writer = new TrackingIndexWriter(indexWriter);

searcherManager = new SearcherManager(indexWriter, true, new SearcherFactory());

ControlledRealTimeReopenThread CRTReopenThead = new ControlledRealTimeReopenThread(writer, searcherManager, 5.0, 0.025);

//守护线程,又叫后台线程,级别比較低,假设没有主线程这个也会消失,这个线程作用就是定期更新让searchManager管理的search能获得更新

CRTReopenThead.setDaemon(true);

CRTReopenThead.setName("更新线程");

CRTReopenThead.start();

this.addDoc();

this.searchDoc();

}



public synchronized void addDoc(){

final int i = 0;

new Thread(){



public  void run() {

while(true){

try {

Thread.sleep(10000);

System.out.println("----增加文档中");

Document doc = new Document();

doc.add(new Field("title", "标题" + i, TextField.TYPE_STORED));

doc.add(new Field("content", "我爱你中国" + i, TextField.TYPE_STORED));

writer.addDocument(doc);



} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

};

}.start();

}



public synchronized void searchDoc(){

new Thread(){

public void run() {

while(true){

try {

Thread.sleep(5000);

System.out.println("----检索中");

searcher = searcherManager.acquire();

QueryParser parser = new QueryParser("content", analyzer);

Query query = parser.parse("中国");

ScoreDoc [] hits = searcher.search(query, 100).scoreDocs;

for(int i = 0; i < hits.length;i++){

Document doc = searcher.doc(hits[i].doc );

System.out.println(doc.get("title") + hits[i].doc);

}

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

finally{

try {

searcherManager.release(searcher);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

searcher = null;

}

};

}.start();

}





}

lucene4之后的近实时搜索实现的更多相关文章

  1. lucene4.5近实时搜索

    近实时搜索就是他能打开一个IndexWriter快速搜索索引变更的内容,而不必关闭writer,或者向writer提交,这个功能是在2.9版本以后引入的,在以前没有这个功能时,必须调用writer的c ...

  2. Lucene.net 实现近实时搜索(NRT)和增量索引

    Lucene做站内搜索的时候经常会遇到实时搜索的应用场景,比如用户搜索的功能.实现实时搜索,最普通的做法是,添加新的document之后,调用 IndexWriter 的 Commit 方法把内存中的 ...

  3. Lucene系列-近实时搜索(1)

    近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...

  4. 【Lucene】近实时搜索

    近实时搜索:可以使用一个打开的IndexWriter快速搜索索引的变更内容,而不必首先关闭writer,或者向该writer提交:这是2.9版本之后推出的新功能. 代码示例(本例参考<Lucen ...

  5. 剖析Elasticsearch集群系列之三:近实时搜索、深层分页问题和搜索相关性权衡之道

    转载:http://www.infoq.com/cn/articles/anatomy-of-an-elasticsearch-cluster-part03 近实时搜索 虽然Elasticsearch ...

  6. solr 近实时搜索

    摘要: Solr的近实时搜索NRT(Near Real Time Searching)意味着文档可以在索引以后马上可以被查询到. Solr不会因为本次提交而阻塞更新操作,不会等待后台合并操作(merg ...

  7. Solr -- 实时搜索

    在solr中,实时搜索有3种方案 ①soft commit,这其实是近实时搜索,不能完全实时. ②RealTimeGet,这是实时,但只支持根据文档ID的查询. ③和第一种类似,只是触发softcom ...

  8. sphinx通过增量索引实现近实时更新

    一.sphinx增量索引实现近实时更新设置 数据库中的已有数据很大,又不断有新数据加入到数据库中,也希望能够检索到.全部重新建立索引很消耗资源,因为我们需要更新的数据相比较而言很少. 例如.原来的数据 ...

  9. 【搜索引擎】Solr全文检索近实时查询优化

    设置多个搜索建议查找算法 <searchComponent name="suggest" class="solr.SuggestComponent"> ...

随机推荐

  1. 【LOJ】#2111. 「JLOI2015」战争调度

    题解 记录一个数组dp[i][S][k]表示第i个点,它上面所有的点的状态(参军或者后勤)可以用状态S来表示,一共有k个平民参军的最大收益,当然数组开不下,可以用vector动态开 我们对于每个平民枚 ...

  2. P2429 制杖题

    P2429 制杖题这个题用线性筛会WA一个点,因为这个题是给定的质数集,最大的质数会比当前的倍数大,就会出现上面的情况.怎办?判重用set啊!set+线性筛就过掉了.16ms #include< ...

  3. 015.Zabbix的日志监控配置

    一 日志监控概述 Zabbix可用于集中监控和分析日志,支持有日志轮询的日志监控分析.当日志中出现相关警告信息(如警告.报错等),可以发送通知给用户.日志监控功能,必须满足以下两个条件: Zabbix ...

  4. codevs 1086 栈 2003年NOIP全国联赛普及组

    题目描述 Description 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). ...

  5. BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)

    题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...

  6. BZOJ.1923.[SDOI2010]外星千足虫(高斯消元 异或方程组 bitset)

    题目链接 m个方程,n个未知量,求解异或方程组. 复杂度比较高,需要借助bitset压位. 感觉自己以前写的(异或)高斯消元是假的..而且黄学长的写法都不需要回代. //1100kb 324ms #i ...

  7. curl请求指定host ip(指定域名解析的内网某ip)

    域名www.test.com解析内部多台ip $httpHeader = array('Host: www.test.com');$url = "10.17.2.245/xxx/xxx/t. ...

  8. CentOS增加用户到sudo用户组

    1.直接增加到wheel用户组 usermod -a -G wheel username 2.编辑/etc/sudoers文件增加 echo "username ALL=(ALL) ALL& ...

  9. 设置java.library.path的值(Mac/Linux/Windows)

    说明:网上基本针对这个值的设置分为两面,Windows派和Linux派,Windows的不说,Linux下只会说设置LD_LIBRARY_PATH即可,但这种方式在Java 8是一个错误的设置,尤其是 ...

  10. LOG EXPLORER ApexSQL Log

    http://www.minisoft.cn/ https://www.apexsql.com/sql_tools_log.aspx