lucene索引流程图
创建索引库:
1.创建一个Director对象,指定索引位置
2.创建一个indexwriter对象
3.创建document对象
4.创建field对象,把field对象添加到document对象中
5.使用indexwriter对象将document对象写进索引库,此过程进行索引创建,并将索引和document对象写进序偶因库中
6.关闭indexWriter对象
Directory directory = FSDirectory.open(new File("E:\\temp\\index").toPath());
IndexWriter writer = new IndexWriter(directory,new IndexWriterConfig());
/* 1).指定索引库的存放位置Directory对象
* 2).指定一个分析器,对文档内容进行分析
* 第三步:创建document对象*/
File dir = new File("E:\\实验文件");
File[] files = dir.listFiles();//得到文件夹中的所有文件
for (File f:
files) {
String name = f.getName(); //获得文件名
String path = f.getPath(); //获取文件的路径
String fileContent = FileUtils.readFileToString(f,"UTF-8"); //获取文件的内容
long fileSize = FileUtils.sizeOf(f);
//创建Field
//参数1:域的名称,参数2:域的内容,参数3:是否存储
Field fieldName = new TextField("name",name, Field.Store.YES);
Field fieldPath = new TextField("path",path,Field.Store.YES);
Field fieldContent = new TextField("content",fileContent,Field.Store.YES);
Field fieldSize = new TextField("size" , fileSize + "" , Field.Store.YES);
Document document = new Document();
document.add(fieldName);
document.add(fieldPath);
document.add(fieldContent);
document.add(fieldSize);
writer.addDocument(document);
}
/*
* 第三步:创建field对象,把field对象添加到document对象中
* 第四步:使用indexwriter对象将document对象写进索引库,此过程进行索引创建,并将索引和document对象写进序偶因库中
* 第五步:关闭indexW对象
* */
writer.close();
查询索引库:
搜索索引过程:根据查询语法在倒排索引词典表中分别找出对应搜索词的索引,从而找到索引所链接的文档链表。。比如搜索语法为"“fileName:lucene"” 表示搜索出fileName 域中包含Lucene的文档。搜索过程就是在索引上查找域为fileName,并且关键字为lucene的term,并根据term找到文档id列表。
1.创建一个Director对象,指定索引位置
2.创建一个IndexReader对象
3.创建一个IndexSearcher对象,构造方法中的参数IndexReader对象
4.创建一个Query对象,TermQuery
5.执行查询,得到一个TOpDocs对象
6.取查询结果的总记录数
7.取文档列表
8.打印文档中的内容
9.关闭IndexReader对象
// 1.创建一个Director对象,指定索引位置
Directory directory = FSDirectory.open(new File("E:\\temp\\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("content","文"));
// 5.执行查询,得到一个TOpDocs对象
//参数1:查询对象,参数2:查询结果返回的最大数
TopDocs docs = indexSearcher.search(query,10);
// 6.取查询结果的总记录数
System.out.println("查询的总记录数:" + docs.totalHits);
// 7.取文档列表
ScoreDoc[] scoreDocs = docs.scoreDocs;
// 8.打印文档中的内容
for (ScoreDoc doc:
scoreDocs) {
//取文档id
int docId = doc.doc;
Document document = indexSearcher.doc(docId);
System.out.println(document.get("name"));
System.out.println(document.get("path"));
System.out.println(document.get("content"));
System.out.println(document.get("size"));
System.out.println("寂寞的分割线..................");
}
// 9.关闭IndexReader对象
indexReader.close();
分析器:
1.创建Analyzer对象,(IKAnalyzer)StandardAnalyzer对象
2.使用分析器对象的tokernStream对象获得一个TokenStream对象
3.像TokenStream对象中设置一个引用,相当于数一个指针
4.调用TokenStream中的reset方法,不调用就抛异常
5.使用while遍历TokenStream对象
6.关闭TokenStream对象
//1.创建Analyzer对象,StandardAnalyzer对象
Analyzer analyzer = new IKAnalyzer();
//2.使用分析器对象的tokernStream对象获得一个TokenStream对象
TokenStream tokenStream = analyzer.tokenStream("","创建一个Director对象,指定索引库存放的位置");
//3.像TokenStream对象中设置一个引用,相当于数一个指针
CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
//4.调用TokenStream中的reset方法,不调用就抛异常
tokenStream.reset();
//5.使用while遍历TokenStream对象
while(tokenStream.incrementToken()){
System.out.println(charTermAttribute.toString());
}
//关闭TokenStream对象
tokenStream.close();
lucene管理
package com.company;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.LongPoint;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.*;
import org.apache.lucene.search.*;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;
import java.io.File;
public class LuceneManage {
/*
* 索引维护
* 添加 入门级创建索引
* 修改
* 删除
* 查询 入门级索引查询
* */
public IndexWriter getIndexWriter() throws Exception{
Directory directory = FSDirectory.open(new File("E:\\temp\\index").toPath());
IndexWriterConfig config = new IndexWriterConfig(new IKAnalyzer());
return new IndexWriter(directory,config);
}
//删除全部
@Test
public void testDeleteAll() throws Exception{
IndexWriter indexWriter = getIndexWriter();
indexWriter.deleteAll();
indexWriter.close();
}
//按条件删除
@Test
public void testDelete() throws Exception{
IndexWriter indexWriter = getIndexWriter();
Query query = new TermQuery(new Term("name","spring"));
indexWriter.deleteDocuments(query);
indexWriter.close();
}
//按条件修改
@Test
public void testUpdate() throws Exception{
IndexWriter indexWriter = getIndexWriter();
Document doc = new Document();
doc.add(new TextField("name","测试文件名", Field.Store.YES));
doc.add(new TextField("content","测试文件内容", Field.Store.YES));
indexWriter.updateDocument(new Term("filename","文字"), doc);
}
public IndexSearcher getIndexSearcher() throws Exception{
Directory directory = FSDirectory.open(new File("E:\\temp\\index").toPath());
IndexReader reader = DirectoryReader.open(directory);
IndexSearcher searcher = new IndexSearcher(reader);
return searcher;
}
public void printResult(IndexSearcher indexSearcher,Query query)throws Exception{
// 第五步:执行查询。
TopDocs topDocs = indexSearcher.search(query, 10);
// 第六步:返回查询结果。遍历查询结果并输出。
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
// 文件名称
String fileName = document.get("name");
System.out.println(fileName);
// 文件内容
String fileContent = document.get("content");
System.out.println(fileContent);
// 文件大小
String fileSize = document.get("size");
System.out.println(fileSize);
// 文件路径
String filePath = document.get("path");
System.out.println(filePath);
System.out.println("------------");
}
}
//查询所有
@Test
public void testMatchAllDocsQuery() throws Exception{
IndexSearcher searcher = getIndexSearcher();
Query query = new MatchAllDocsQuery();
printResult(searcher,query);
//关闭资源
searcher.getIndexReader().close();
}
@Test
public void testNumberRangeQuery() throws Exception{
IndexSearcher searcher = getIndexSearcher();
Query query = LongPoint.newRangeQuery("size",5,100000000);
printResult(searcher,query);
//关闭资源
searcher.getIndexReader().close();
}
//组合查询
@Test
public void testBooleanQuery()throws Exception{
IndexSearcher indexSearcher = getIndexSearcher();
TermQuery query1 = new TermQuery(new Term("name","java"));
TermQuery query2 = new TermQuery(new Term("content","java"));
BooleanClause clause = new BooleanClause(query1, BooleanClause.Occur.MUST);
BooleanClause clause2 = new BooleanClause(query2, BooleanClause.Occur.MUST);
BooleanQuery builder = new BooleanQuery.Builder().add(clause).add(clause2).build();
printResult(indexSearcher,builder);
//关闭资源
indexSearcher.getIndexReader().close();
}
}