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,该分词器可以自定义加入词汇和消除词汇