【Lucene】 02 创建索引库代码 + 查询索引

1、创建索引库

1.1 创建步骤

第一步:创建一个java工程,并导入jar包。

第二步:创建一个indexwriter对象。

指定索引库的存放位置Directory对象

指定一个分析器,对文档内容进行分析。

第二步:创建document对象。

第三步:创建field对象,将field添加到document对象中。

第四步:使用indexwriter对象将document对象写入索引库,此过程进行索引创建。并将索引和document对象写入索引库。

第五步:关闭IndexWriter对象。

1.2 相关代码

@Test
	public  void testIndexCreate() throws Exception{
//		0.创建文档根目录
		List<Document> docList=new ArrayList<Document>();
		
//		1读取制定文件
//		1.1 指定文件所在的目录
		File fileDir = new File("G://lucene//searchsource");
//		1.2遍历文件夹下的文件
		for (File file : fileDir.listFiles()) {
//			1.2.1读取文件的 名称、内容、大小
			String fileName = file.getName();
			String fileContext = FileUtils.readFileToString(file);
			Long fileSize = FileUtils.sizeOf(file);
			//文档对象,文件系统中的一个文件就是一个Docuemnt对象
			Document document = new Document();
//			分词
			//第一个参数:域名
			//第二个参数:域值
			//第三个参数:是否存储,是为yes,不存储为no
			TextField nameField = new TextField("fileName", fileName, Store.YES);
			TextField contextField = new TextField("fileContext", fileContext, Store.YES);
			LongField sizeField = new LongField("fileSize", fileSize, Store.YES);
//			将所有的域存入文档中
			document.add(nameField);
			document.add(contextField);
			document.add(sizeField);
//			将文档放入文档系统中
			docList.add(document);
		}
//		2、创建分词器 StandardAnalyzer标准分词器,标准分词器对英文分词效果很好,对中文是单字分词
		Analyzer analyzer = new IKAnalyzer();
//		制定索引和文档存储所在的目录
		Directory directory = FSDirectory.open(new File("G://lucene"));
//		创建写对象的初始化对象
		IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);
//		创建 索引和文档写对象
		IndexWriter indexWriter = new IndexWriter(directory, config);
//		3、将文档加入到索引和文档的写对象中
		for (Document doc : docList) {
			indexWriter.addDocument(doc);
		}
//		4、提交
		indexWriter.commit();
//		5、关闭流
		indexWriter.close();
	}

2、查询索引

2.1 实现步骤

第一步:创建一个Directory对象,也就是索引库存放的位置。

第二步:创建一个indexReader对象,需要指定Directory对象。

第三步:创建一个indexsearcher对象,需要指定IndexReader对象

第四步:创建一个TermQuery或者 QueryParser 对象,指定查询的域和查询的关键词。

第五步:执行查询。

第六步:返回查询结果。遍历查询结果并输出。

第七步:关闭IndexReader对象

2.2 IndexSearch 搜索方法

方法

说明

indexSearcher.search(query, n)

根据Query搜索,返回评分最高的n条记录

indexSearcher.search(query, filter, n)

根据Query搜索,添加过滤策略,返回评分最高的n条记录

indexSearcher.search(query, n, sort)

根据Query搜索,添加排序策略,返回评分最高的n条记录

indexSearcher.search(booleanQuery, filter, n, sort)

根据Query搜索,添加过滤策略,添加排序策略,返回评分最高的n条记录

2.3  相关代码

@Test
	public void testIndexSearch()throws Exception{
//		搜索
//		制定所在的目录
		Directory directory =FSDirectory.open(new File("G://lucene"));
//		创建读取的分词器(必须和写入的分词器一致)
		Analyzer analyzer = new IKAnalyzer();
//		创建读取的对象
		IndexReader indexReader = IndexReader.open(directory);
//		创建索引搜索对象
		IndexSearcher  indexSearcher = new IndexSearcher(indexReader);
		//创建查询对象,第一个参数:默认搜索域, 第二个参数:分词器
		//默认搜索域作用:如果搜索语法中指定域名从指定域中搜索,如果搜索时只写了查询关键字,则从默认搜索域中进行搜索
		QueryParser queryParser = new QueryParser("fileContext", analyzer);
		//查询语法=域名:搜索的关键字
		Query query = queryParser.parse("fileName:apache");
//		sousuo
		TopDocs search = indexSearcher.search(query, 5);
		
//		根据遍历结果获得查询的条数
		System.out.println("======共计"+search.totalHits+"数据");
//		从搜索结果中获取结果集
		ScoreDoc[]  score = search.scoreDocs;
		for (ScoreDoc scoreDoc : score) {
//			根据结果获取id
			int doc = scoreDoc.doc;
//			根据id获得document对象
			Document document = indexReader.document(doc);
			//get域名可以取出值 打印
			System.out.println("fileName:" + document.get("fileName"));
			System.out.println("fileSize:" + document.get("fileSize"));
			System.out.println("============================================================");
		}
		

	}

猜你喜欢

转载自blog.csdn.net/lxiansheng001/article/details/81141889