Lucene入门学习
»其他Lucene是apache下的一个开源项目,完全用java编写的高性能,全功能的文本搜索引擎库,适用于需要全文搜索的应用。
目录
导包
导入四个基本包
commons-io-2.4.jar
lucene-analyzers-common-4.10.3.jar
lucene-core-4.10.3.jar
lucene-queryparser-4.10.3.jar
创建索引库
- 指定索引库存放的位置。
- 创建
IndexWritter
对象,该对象需要一个Directory
对象,一个IndexWriterConfig
对象。 - 读取需要被创建索引库的源文本文件
- 创建
Document
文档对象。 - 创建
Field
对象有四种域对象
Field | 数据类型 | 是否分析 | 是否索引 | 是否存储 |
---|---|---|---|---|
StringField | 字符串 | N | Y | 可选择 |
LongField | Long型 | Y | Y | 可选择 |
StoredField | 多种类型 | N | N | Y |
TextField | 多种类型 | Y | Y | 可选择 |
- 将
Field
加入文档对象,并将文档对象写入索引库中 - 关闭
IndexWritter
测试代码
//創建索引
@Test
public void testCreatIndex() throws IOException {
//指定索引库的存放位置
Directory directory = FSDirectory.open(new File("E:\\ecplices _workspace\\simplework\\Lucene\\index"));
//指定文本分析器
Analyzer analyzer = new StandardAnalyzer();
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_4_10_3, analyzer);
// 1.创建索引写入对象
IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig);
// 2. 遍历文件
File files = new File("E:\\ecplices _workspace\\simplework\\Lucene\\content");
File[] listFiles = files.listFiles();
for (File file : listFiles) {
//3.创建Field域,并加入到document中
Document document = new Document();
String fileName = file.getName();
Field fileNameField = new TextField("fileName", fileName, Store.YES);
document.add(fileNameField);
String filePath = file.getPath();
Field filePathField = new StoredField("filePath", filePath);
document.add(filePathField);
long fileSize = FileUtils.sizeOf(file);
Field fileSizeField = new StoredField("fileSize", fileSize);
document.add(fileSizeField);
String fileContent = FileUtils.readFileToString(file);
Field fileContentField = new TextField("fileContent", fileContent, Store.YES);
document.add(fileContentField);
//4. 将document写入索引库
indexWriter.addDocument(document);
}
//5.关闭IndexWritter
indexWriter.close();
}
结果
索引库下出现文件,使用luke
工具可以查看具体索引库信息。
查询索引库
- 创建
IndexSearcher
对象,该对象需要一个IndexReader
对象,而IndexReader
需要一个Directory
对象。 - 创建
Query
对象,这个接口有多个实现类,在这里使用TermQuery
对象。创建它需要一个Term
对象,构造方法需要传入索引的域名和关键字。 - 使用
indexSearch
对象执行查询操作,得到TopDocs
- 通过
TopDocs
得到文档的索引 - 通过
indexSearch
对象和文档的索引获得文档对象Document
,从而获得域的各种信息。 - 关闭
indexReader
测试代码
//查询
@Test
public void testSearchIndex() throws IOException {
//1. 創建Directory对象
Directory directory = FSDirectory.open(new File("E:\\ecplices _workspace\\simplework\\Lucene\\index"));
//2.创建IndexReader对象
IndexReader indexReader = DirectoryReader.open(directory);
//3.创建IndexSercher对象
IndexSearcher indexSearcher = new IndexSearcher(indexReader);
//4.创建TermQuery对象
TermQuery termQuery = new TermQuery(new Term("fileName", "式"));
//5.执行查询操作
TopDocs topDocs = indexSearcher.search(termQuery, 1);
//6.得到查询的文档索引
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (ScoreDoc scoreDoc : scoreDocs) {
//通过索引得到文档对象
Document doc = indexSearcher.doc(scoreDoc.doc);
IndexableField fileNamefield = doc.getField("fileName");
String fileName = fileNamefield.stringValue();
System.out.println(fileName);
IndexableField filePathField = doc.getField("filePath");
String filePath = filePathField.stringValue();
System.out.println(filePath);
IndexableField fileSizeField = doc.getField("fileSize");
String fileSize = fileSizeField.stringValue();
System.out.println(fileSize);
IndexableField fileContentField = doc.getField("fileContent");
String fileContent = fileContentField.stringValue();
System.out.println(fileContent);
System.out.println("------------------------");
}
//7.关闭IndexReader
indexReader.close();
}
结果
获得文件名、路径、大小、文件内容等信息。
中文分词器
中文分词器 IKAnalyzer
,该分词器可以自定义加入词汇和消除词汇