1. Lucene的下载
Lucene是开发全文检索功能的工具包,从官网下载Lucene4.10.3并解压。
官网:http://lucene.apache.org/
版本:lucene7.7.0 (学习上没必要最新的,因为企业中也不会升级太快)
Jdk要求:1.7以上
2.使用的jar包
核心包
其他:
3. 创建索引库
(1) 实现步骤 (程序的编写步骤与之前分析的理论步骤是颠倒过来的)
第一步:创建java工程,并导入jar包
第二步:创建一个indexwriter对象(创建索引)
1.指定索引库的存放位置Directory对象
2.指定一个分析器,对文档内容进行分析
第三步:创建document对象 (构建文档对象)
第四步:创建field对象,将field添加到document
第五步:使用indexwriter对象将document对象写到索引库,此过程进行索引创建。并将索引和document对象写入索引库。
第六步:关闭IndexWriter对象
(2) Field域的属性
是否分析:是否对域的内容进行分词处理。前提是我们要对域的内容进行查询。
是否索引:将Field分析后的词或整个Field值进行索引,只有索引方可搜索到。
比如:商品名称,商品简介分析后进行索引,订单号,身份证号不用分析但也要索引,这些将来都要作为查询条件
是否存储:将Field值存储在文档中,存储在文档中的Field才可以从Document中获取。
比如:商品名称,订单号,凡是将来要从Document中获取的Field都要存储
是否存储的标准:是否将内容展示给用户
测试代码:
将下面的文件,创建成索引
代码:
public class FirstLucene { @Test public void textIndex() throws Exception { // 第一步:创建java工程,并导入jar包 // 第二步:创建一个indexwriter对象(创建索引) // 1.指定索引库的存放位置Directory对象 Directory directory = FSDirectory.open(Paths.get("E:\temp\index")); //文件系统目录 file system directory // 2.指定一个分析器,对文档内容进行分析 Analyzer analyzer = new StandardAnalyzer();//官方推荐分词器 IndexWriterConfig indexWriterConfig = new IndexWriterConfig(analyzer); IndexWriter indexWriter = new IndexWriter(directory, indexWriterConfig); File f = new File("E:\searchSource"); File[] listFiles = f.listFiles(); for (File file : listFiles) { // 第三步:创建document对象 (构建文档对象) Document document = new Document(); // 第四步:创建field对象,将field添加到document //文件名称 String file_name = file.getName(); Field fieldNameField = new TextField("fileName", file_name, Store.YES); //文件大小 long file_size = FileUtils.sizeOf(file); Field fileSizeField = new LongPoint("fileSize", file_size); Field fileSizeFieldStore = new StoredField("fileSize", file_size); //文件路径 String file_path = file.getPath(); Field filePathField = new StoredField("filePath", file_path); //文件内容 String file_content = FileUtils.readFileToString(file); Field fileContentField = new TextField("fileContent", file_content, Store.NO); document.add(fieldNameField); document.add(fileSizeField); document.add(fileSizeFieldStore); document.add(filePathField); document.add(fileContentField); // 第五步:使用indexwriter对象将document对象写到索引库,此过程进行索引创建。并将索引和document对象写入索引库。 indexWriter.addDocument(document); } // 第六步:关闭IndexWriter对象 indexWriter.close(); } }
结果:
4.查询索引
(1) 实现步骤:
第一步:创建一个Directory对象,也就是索引库存放的位置
第二步:创建一个indexReader对象,需要制定Directory对象
第三步:创建一个indexsearcher对象,需要指定IndexReader对象
第四步:创建一个TermQuery对象,制定查询的域和查询的关键词
第五步:执行查询。
第六步:返回查询结果,便利查询结果并输出
第七步:关闭IndexReader对象。
(2) IndexSearcher搜索方法
代码:
@Test public void testSearch() throws Exception { // 第一步:创建一个Directory对象,也就是索引库存放的位置 Directory directory = FSDirectory.open(Paths.get("E:\temp\index")); // 第二步:创建一个indexReader对象,需要指定Directory对象 IndexReader indexReader =DirectoryReader.open(directory); // 第三步:创建一个indexsearcher对象,需要指定IndexReader对象 IndexSearcher indexSearcher = new IndexSearcher(indexReader); // 第四步:创建一个TermQuery对象,制定查询的域和查询的关键词 Query query = new TermQuery(new Term("fileName", "spring")); // 第五步:执行查询。 TopDocs topDocs = indexSearcher.search(query, 2); // 第六步:返回查询结果,遍历查询结果并输出 ScoreDoc[] scoreDocs = topDocs.scoreDocs; for (ScoreDoc scoreDoc : scoreDocs) { int doc = scoreDoc.doc; Document document = indexSearcher.doc(doc); //文件名称 String fileName = document.get("fileName"); System.out.println(fileName); //文件内容 String fileContent = document.get("fileContent"); System.out.println(fileContent); //文件路径 String fileSize = document.get("fileSize"); System.out.println(fileSize); //文件大小 String filePath = document.get("filePath"); System.out.println(filePath); System.out.println("---------"); } // 第七步:关闭IndexReader对象。 indexReader.close(); }
结果: