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

创建索引库

  1. 指定索引库存放的位置。
  2. 创建IndexWritter对象,该对象需要一个Directory对象,一个IndexWriterConfig 对象。
  3. 读取需要被创建索引库的源文本文件
  4. 创建Document文档对象。
  5. 创建Field对象有四种域对象
Field 数据类型 是否分析 是否索引 是否存储
StringField 字符串 N Y 可选择
LongField Long型 Y Y 可选择
StoredField 多种类型 N N Y
TextField 多种类型 Y Y 可选择
  1. Field加入文档对象,并将文档对象写入索引库中
  2. 关闭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工具可以查看具体索引库信息。


查询索引库

  1. 创建IndexSearcher对象,该对象需要一个IndexReader对象,而IndexReader需要一个Directory对象。
  2. 创建Query对象,这个接口有多个实现类,在这里使用TermQuery对象。创建它需要一个Term对象,构造方法需要传入索引的域名和关键字。
  3. 使用indexSearch对象执行查询操作,得到TopDocs
  4. 通过TopDocs得到文档的索引
  5. 通过indexSearch对象和文档的索引获得文档对象Document,从而获得域的各种信息。
  6. 关闭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,该分词器可以自定义加入词汇和消除词汇