lucene学习之近实时搜索
下面是近实时搜索的一个例子
public class IndexFenci {
private static String[] ids = {“1”,”2”,”3”};
private static String[] citys = {“北京”,”南京”,”上海”};
private static String[] descs = {“北京是一个美丽的城市。”,
“南京是一个有文化的城市。”,
“上海是一个繁华的城市。”};
private static IndexWriter writer = null;
private static SearcherManager sm =null;
private static IndexSearcher is =null;
public static void main(String[] args){
try {
Directory d = FSDirectory.open(Paths.get(“D:/lucene/index”));
SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();
IndexWriterConfig iwc = new IndexWriterConfig(analyzer);
writer = new IndexWriter(d, iwc);
TrackingIndexWriter track = new TrackingIndexWriter(writer);
track.deleteAll();
for(int i=0;i
crt.setDaemon(true);
crt.setName(“后台搜索服务”);
crt.start();
QueryParser parser = new QueryParser(“desc”,new SmartChineseAnalyzer());
Query query = parser.parse(“南京城市”);
Document doc = new Document();
doc.add(new StringField(“city”, “杭州”, Field.Store.YES));
doc.add(new StringField(“id”, “4”, Field.Store.YES));
doc.add(new TextField(“desc”,”杭州是一个美丽的城市”,Field.Store.YES));
track.addDocument(doc);
sm.maybeRefresh();
is = sm.acquire();
TopDocs top = is.search(query, 10);
for (ScoreDoc scoreDoc:top.scoreDocs) {
Document document= is.doc(scoreDoc.doc);
System.out.print(“编号:”+scoreDoc.doc);
System.out.print(“ 分数: “+scoreDoc.score);
System.out.print(“ id: “+document.get(“id”));
System.out.print(“ city: “+document.get(“city”));
System.out.print(“ desc: “+document.get(“desc”));
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
try {
sm.release(is);
//if(writer !=null){
//writer.close();
//}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
这样输出的是:
索引:3文件
编号:1 分数: 0.27066463 id: 2 city: 南京 desc: 南京是一个有文化的城市。
编号:0 分数: 0.06074384 id: 1 city: 北京 desc: 北京是一个美丽的城市。
编号:2 分数: 0.06074384 id: 3 city: 上海 desc: 上海是一个繁华的城市。
编号:3 分数: 0.06074384 id: 4 city: 杭州 desc: 杭州是一个美丽的城市
但是杭州这条索引信息还没有存到本地。用下面的程序去搜索:
public class SearcherFenci {
public static IndexSearcher is =null;
public static IndexReader indexReader = null;
public static void main(String[] args) throws IOException {
SearcherFenci searcherFenci = new SearcherFenci();
searcherFenci.displayAllTokenInfo(“南京城市”);
}
/**
* 得到分词的结果
*/
public void displayAllTokenInfo(String str){
try {
Directory d = FSDirectory.open(Paths.get(“D:/lucene/index”));
indexReader = DirectoryReader.open(d);
System.out.println(“maxdoc: “+indexReader.maxDoc());
System.out.println(“numdoc: “+indexReader.numDocs());
System.out.println(“numdeletedoc: “+indexReader.numDeletedDocs());
SmartChineseAnalyzer analyzer = new SmartChineseAnalyzer();
IndexSearcher is = new IndexSearcher(indexReader);
QueryParser queryParser = new QueryParser(“desc”, analyzer);
Query query = queryParser.parse(str);
TopDocs top = is.search(query, 10);
for(ScoreDoc scoreDoc : top.scoreDocs){
Document doc = is.doc(scoreDoc.doc);
System.out.print(“编号:”+scoreDoc.doc);
System.out.print(“ 分数: “+scoreDoc.score);
System.out.print(“ id: “+doc.get(“id”));
System.out.print(“ city: “+doc.get(“city”));
System.out.print(“ desc: “+doc.get(“desc”));
System.out.println();
}
indexReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出的结果是:
maxdoc: 3
numdoc: 3
numdeletedoc: 0
编号:1 分数: 0.5908754 id: 2 city: 南京 desc: 南京是一个有文化的城市。
编号:0 分数: 0.06037879 id: 1 city: 北京 desc: 北京是一个美丽的城市。
编号:2 分数: 0.06037879 id: 3 city: 上海 desc: 上海是一个繁华的城市。
杭州没在本地索引中,因为还没提交。这样就是近实时索引的内容了。可以搜索到还没提交的修改信息。
还没有评论,来说两句吧...