package com.itheima.lucene;
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryparser.classic.MultiFieldQueryParser;
import org.apache.lucene.queryparser.classic.ParseException;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.apache.lucene.search.NumericRangeQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;
/**
* 索引维护
* 添加 入门程序
* 删除
* 修改
* 查询 入门程序 精准查询
* @author mjl
*
*/
public class LuceneManager {
public IndexWriter getIndexWriter() throws IOException{
Directory directory = FSDirectory.open(new File("E:\\lucene\\temp"));
Analyzer analyzer = new IKAnalyzer();
IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
return new IndexWriter(directory, config);
}
//全删除
@Test
public void testAllDelete() throws IOException{
IndexWriter indexWriter = getIndexWriter();
indexWriter.deleteAll();
indexWriter.close();
}
@Test
//根据条件删
public void testDelete() throws IOException{
IndexWriter indexWriter = getIndexWriter();
Query query = new TermQuery(new Term("fileName","apache"));
indexWriter.deleteDocuments(query);
indexWriter.close();
}
//修改
@Test
public void testUpdate() throws IOException{
IndexWriter indexWriter = getIndexWriter();
Document document = new Document();
document.add(new TextField("fileN","测试文件名",Store.YES));
document.add(new TextField("fileC", "测试文件内容", Store.YES));
indexWriter.updateDocument(new Term("fileName","lucene"), document, new IKAnalyzer());
indexWriter.close();
}
public IndexSearcher getIndexSearcher() throws IOException{
Directory directory = FSDirectory.open(new File("E:\\lucene\\temp"));
IndexReader indexReader = DirectoryReader.open(directory);
return new IndexSearcher(indexReader);
}
//执行查询的结果
public void printResult(IndexSearcher indexSearcher,Query query) throws IOException{
TopDocs topDocs = indexSearcher.search(query, 20);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int doc = scoreDoc.doc;
Document document = indexSearcher.doc(doc);
String fileName = document.get("fileName");
System.out.println(fileName);
String filePath = document.get("filePath");
System.out.println(filePath);
String fileSize = document.get("fileSize");
System.out.println(fileSize);
System.out.println("----");
}
}
//查询所有
@Test
public void testMatchAllDocsQuery() throws IOException{
IndexSearcher indexSearcher = getIndexSearcher();
Query query = new MatchAllDocsQuery();
printResult(indexSearcher, query);
indexSearcher.getIndexReader().close();
}
//根据数值范围查询
@Test
public void testNumericRangeQuery() throws IOException{
IndexSearcher indexSearcher = getIndexSearcher();
Query query = NumericRangeQuery.newLongRange("fileSize", 47L, 200L, true, true);
printResult(indexSearcher, query);
indexSearcher.getIndexReader().close();
}
//组合查询
@Test
public void testBooleanQuery() throws IOException{
IndexSearcher indexSearcher = getIndexSearcher();
BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("fileName","apache"));
Query query2 = new TermQuery(new Term("fileName","lucene"));
booleanQuery.add(query1, Occur.MUST);
booleanQuery.add(query2, Occur.MUST);
printResult(indexSearcher, booleanQuery);
indexSearcher.getIndexReader().close();
}
//条件解析的对象查询
@Test
public void testQueryParse() throws Exception{
IndexSearcher indexSearcher = getIndexSearcher();
//参数1:默认查询的域
//参数2:采用的分析器
QueryParser queryParser = new QueryParser("fileName",new IKAnalyzer());
//*:* 域:值
Query query = queryParser.parse("java is apache");
printResult(indexSearcher, query);
indexSearcher.getIndexReader().close();
}
//条件解析的对象查询 过个 默认域
@Test
public void testMultiFieldQueryParse() throws Exception{
IndexSearcher indexSearcher = getIndexSearcher();
String[] fields = {"fileName","fileContent"};
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(fields, new IKAnalyzer());
Query query = queryParser.parse("apache is lucene");
printResult(indexSearcher, query);
indexSearcher.getIndexReader().close();
}
}