概念
Lucene是Apache下的一个开放源代码的全文检索引擎工具包
使用
第一步:创建索引
首先,创建一个java工程,并导入jar包。
步骤:
- 创建一个Director对象,指定索引库保存的位置。
- 基于Directory对象创建一个IndexWriter对象,并使用中文分析器IKAnalyzer
- 读取磁盘上的文件,对应每个文件创建一个文档对象并添加域。
- 把文档对象写入索引库
- 关闭indexwriter对象
public void createIndex() throws Exception{
//1、创建一个Director对象,指定索引库保存的位置。
Directory directory = FSDirectory.open(new File("D:\\JAVA\\IdeaProject\\basic-code\\Lucene\\Index").toPath());
//2、基于Directory对象创建一个IndexWriter对象,并使用中文分析器IKAnalyzer
IndexWriter indexWriter = new IndexWriter(directory,new IndexWriterConfig(new IKAnalyzer()));
//3、读取磁盘上的文件,对应每个文件创建一个文档对象。
File dir = new File("D:\\JAVA\\IdeaProject\\basic-code\\Lucene\\searchsource");
File[] files = dir.listFiles();
for (File f:files){
//取文件名
String fileName = f.getName();
//文件的路径
String filePath = f.getPath();
//文件的内容
String fileContent = FileUtils.readFileToString(f, "utf-8");
//文件的大小
long fileSize = FileUtils.sizeOf(f);
//创建Field
//参数1:域的名称,参数2:域的内容,参数3:是否存储
Field fieldName = new TextField("name",fileName,Field.Store.YES);
Field fieldPath = new StoredField("path", filePath);
Field fieldContent = new TextField("content", fileContent, Field.Store.YES);
Field fieldSizeStore = new StoredField("size", fileSize);
//创建文档对象
Document document = new Document();
//向文档对象中添加域
document.add(fieldName);
document.add(fieldPath);
document.add(fieldContent);
document.add(fieldSizeStore);
//4、把文档对象写入索引库
indexWriter.addDocument(document);
}
//5、关闭indexwriter对象
indexWriter.close();
}
Field域的属性:
第二步:使用索引
public void searchIndex() throws Exception {
//1、创建一个Director对象,指定索引库的位置
Directory directory = FSDirectory.open(new File("D:\\JAVA\\IdeaProject\\basic-code\\Lucene\\Index").toPath());
//2、创建一个IndexReader对象
IndexReader indexReader = DirectoryReader.open(directory);
//3、创建一个IndexSearcher对象,构造方法中的参数indexReader对象。
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//4、创建一个Query对象,TermQuery
Query query = new TermQuery(new Term("name", "spring"));
//5、执行查询,得到一个TopDocs对象
//参数1:查询对象 参数2:查询结果返回的最大记录数
TopDocs topDocs = indexSearcher.search(query, 10);
//6、取查询结果的总记录数
System.out.println("查询总记录数:" + topDocs.totalHits);
//7、取文档列表
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
//8、打印文档中的内容
for (ScoreDoc doc :
scoreDocs) {
//取文档id
int docId = doc.doc;
//根据id取文档对象
Document document = indexSearcher.doc(docId);
System.out.println(document.get("name"));
System.out.println(document.get("path"));
System.out.println(document.get("size"));
//System.out.println(document.get("content"));
System.out.println("-----------------寂寞的分割线");
}
//9、关闭IndexReader对象
indexReader.close();
}
索引库的删除
@Before
public void init() throws Exception {
//创建一个IndexWriter对象,需要使用IKAnalyzer作为分析器
indexWriter =
new IndexWriter(FSDirectory.open(new File("C:\\temp\\index").toPath()),
new IndexWriterConfig(new IKAnalyzer()));
}
// 删除全部
@Test
public void deleteAllDocument() throws Exception {
//删除全部文档
indexWriter.deleteAll();
//关闭索引库
indexWriter.close();
}
// 按条件删除
@Test
public void deleteDocumentByQuery() throws Exception {
indexWriter.deleteDocuments(new Term("name", "apache"));
indexWriter.close();
}
索引库的更新
先删除,后添加
索引库的查询
第一种:TermQuery
使用方法如上:
Query query = new TermQuery(new Term("name", "spring"));
第二种:数值范围查询
Query query = LongPoint.newRangeQuery("size", 0l, 10000l);
第三种:queryparser
需要加入queryParser依赖的jar包:lucene-queryparser-7.4.0.jar
先把查询语句分词,然后再查询
QueryParser queryParser = new QueryParser("content", new IKAnalyzer());
Query query = queryParser.parse("Lucene是java开发的");