索引库的操作
源码如下:
public class IndexManager {
private IndexWriter indexWriter;
@Before
public void init() throws Exception {
indexWriter = new IndexWriter(FSDirectory.open(new File("D:\\y study\\index").toPath()),
new IndexWriterConfig(new IKAnalyzer()));
}
/**
* 添加文件
*
* @throws IOException
*/
@Test
public void addDocument() throws IOException {
//创建一个IndexWriter对象,需要使用IK分析器
// IndexWriter indexWriter = new IndexWriter(FSDirectory.open(new File("D:\\y study\\index").toPath()),
// new IndexWriterConfig(new IKAnalyzer()));
//创建一个Document对象
Document document = new Document();
//向document对象中添加域
document.add(new TextField("name", "新添加的文件", Field.Store.YES));
document.add(new TextField("content", "新添加的内容", Field.Store.NO));
document.add(new StoredField("path", "D:\\y study\\index"));
//把文档写入索引库
indexWriter.addDocument(document);
//close索引库
indexWriter.close();
}
/**
* 删除索引库中全部文档
*/
@Test
public void deleteAllDocument() throws Exception {
indexWriter.deleteAll();
indexWriter.close();
}
/**
* 删除指定域的文件
* @throws Exception
*/
@Test
public void deleteDocumentByQuery() throws Exception {
indexWriter.deleteDocuments(new Term("name","apache"));
indexWriter.close();
}
/**
* 修改文档:先删除在添加
*/
@Test
public void updateDocument() throws Exception {
//创建一个新的文档对象
Document document = new Document();
//向文档对象中添加域
document.add(new TextField("name1","更新后文档1",Field.Store.YES));
document.add(new TextField("name2","更新后文档2",Field.Store.YES));
document.add(new TextField("name3","更新后文档3",Field.Store.YES));
//更新操作
indexWriter.updateDocument(new Term("name","spring"),document);
//close
indexWriter.close();
}
}
范围查询Query
package com.itheima.lucene;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.LongPoint;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
/**
* @author boyi on 2019/11/29
*/
public class SerachIndex {
private IndexReader indexReader;
private IndexSearcher indexSearcher;
@Before
public void init() throws Exception {
indexReader = DirectoryReader.open(FSDirectory.open(new File("D:\\y study\\index").toPath()));
indexSearcher = new IndexSearcher(indexReader);
}
@Test
public void testRangeQuery() throws Exception {
//创建一个Query对象
Query query = LongPoint.newRangeQuery("size",0l,1000l);
//执行查询
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("总记录数:"+ topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int docId = scoreDoc.doc;
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("-------------------------------------------------------------分割线");
}
indexReader.close();
}
}
QueryParser查询
/**
* 使用QueryParser对象查询
* @throws Exception
*/
@Test
public void testQueryParser() throws Exception {
//QueryParser对象,两个参数,参数1:默认搜索域,参数2:分析器对象
QueryParser queryParser = new QueryParser("name",new IKAnalyzer());
Query query = queryParser.parse("lucene是一个java开发的全文检索");
//执行查询
//执行查询
TopDocs topDocs = indexSearcher.search(query, 10);
System.out.println("总记录数:"+ topDocs.totalHits);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
int docId = scoreDoc.doc;
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("-------------------------------------------------------------分割线");
}
indexReader.close();
}