什么是lucene
Lucene的目的是为软件开发者提供一个简单易用的工具包,方便在目标系统中进行全文搜索,或者构建一个完整的全文搜索引擎
我们为什么要用Lucene?比较数据库
1。Lucene可以检索文件,这对于数据库来说是不可能的
2。对于文本检索,lucene可以使用索引,检索效率高
3。Lucene占用内存小
4.lucene可以对搜索结果进行排序,高亮等。
lucene的流程
全文搜索流程分为索引流程和搜索流程两部分。索引过程:收集数据--->构建文档对象--->创建索引(将文档写入索引库)。搜索过程:创建查询--->执行搜索--->呈现搜索结果。
代码演示
基于lucene7.7
Index流程:
publicclassIndex{
的
//写入索引实例
私有IndexWriter作者;
的
公共索引()抛出异常{
//获取索引所在目录的路径,一般使用FSDirectory,根据环境选择最佳打开方式
目录directory=FSDirectory.open(Paths.get("/Users/temp/lucene/index"));
//保存所有用于创建IndexWriter的配置。将使用默认的分词器
标准分析器standardAnalyzer=newStandardAnalyzer();
CharArraySetstopwordSet=standardAnalyzer.getStopwordSet();
CharArraySetcharArraySet=newCharArraySet(stopwordSet,true);
布尔g32=charArraySet。添加(“g32”);
System.out.println(g32);System.out.println(charArraySet);
IndexWriterConfigiwConfig=newIndexWriterConfig(newStandardAnalyzer(charArraySet));
//实例化IndexWriter
writer=newIndexWriter(目录,iwConfig);
}
的
publicstaticvoidmain(String[]args)抛出异常{
的
//索引数据的路径
StringdataDir="/Users/temp/lucene/data";
索引索引器=空;
intnumIndexed=0;
//索引开始时间
长启动=系统。当前时间毫秒();
尝试{
索引器=新索引();
indexer.deleteAll();
numIndexed=索引器。索引(数据目录);
}赶上(异常e){
e.printStackTrace();
}最后{
尝试{
索引器.close();
}赶上(异常e){
e.printStackTrace();
}
}
//索引结束时间
长端=系统。当前时间毫秒();System.out.println("Index:"+numIndexed+"filestake"+(end-start)+"milliseconds");
的
}
的
publiclongdeleteAll()抛出IOException{
返回writer.deleteAll();
}
的
publicvoidclose()抛出IOException{
作家。关();
}
的
的
私有静态文档getDocument(文件f)抛出异常{
文件doc=newDocument();
//将设置的索引添加到Document中,这样就可以确定被索引的文档
doc.add(newTextField("内容",newFileReader(f)));
//Field.Store.YES:搜索结果时可以恢复文档,为NO时不能恢复文档
doc.add(newTextField("fileName",f.getName(),Field.Store.YES));
//将完整路径存储在索引文件中
doc.add(newTextField("fullPath",f.getCanonicalPath(),Field.Store.YES));
返回文档;
}
的
publicintindex(StringdataDir)抛出异常{
File[]files=newFile(dataDir).listFiles();
对于(文件文件:文件){
//索引指定文件
索引文件(文件);
}
//返回索引了多少文件返回返回writer.getDocStats().numDocs;
}
的
publicvoidindexFile(Filef)抛出异常{
//输出索引文件的路径
System.out.println("索引文件:"+f.getCanonicalPath());
//获取文档,然后设置文档中的各个字段
文档doc=getDocument(f);
//开始写入,即将文档写入索引文件;
writer.addDocument(文档);
}
的
}
搜索过程:
公开课搜索{
的
的
publicstaticvoidsearch(StringindexDir,Stringq)抛出异常{
的
//获取读取索引文件的路径
目录dir=FSDirectory。打开(路径。get(indexDir));
//dir获取的路径下的所有文件
IndexReader阅读器=DirectoryReader。打开(目录);
//构建索引查询器
IndexSearcheris=newIndexSearcher(reader);
//实例化分析器
分析器analyzer=newStandardAnalyzer();
//构建查询解析器
/**
*第一个参数是要查询的字段;第二个参数是分析器
*/
QueryParser解析器=newQueryParser("内容",分析器);
的
//根据传入的p查找查询查询=解析器。解析(q);
//计算索引开始时间
长启动=系统。当前时间毫秒();
//开始查询
/**
*第一个参数是通过传入的参数查找得到的query;第二个参数是要查询的行数
*/
TopDocs命中=是。搜索(查询,10);
//计算索引结束时间
长端=系统。当前时间毫秒();
System.out.println("匹配"+q+",总共耗时"+(end-start)+"毫秒"+"查询到"+hits.totalHits+"记录");
//遍历hits.scoreDocs得到scoreDoc
/**
*ScoreDoc:评分文档,即获取文档scoreDocs:表示topDocs的文档数组
*
*@throws异常
*/
对于(ScoreDocscoreDoc:hits.scoreDocs){
文档doc=is.doc(scoreDoc.doc);
System.out.println(doc.get("fullPath"));
System.out.println(doc.get("文件名"));
}
的
//关闭阅读器
读者。关();
}
的
publicstaticvoidmain(String[]args){
StringindexDir="/Users/temp/lucene/index";//我们要搜索的内容
Stringq="我爱你";
尝试{
搜索(indexDir,q);
}赶上(异常e){
e.printStackTrace();
}
}
}