💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # 下载 Lucene是开发全文检索功能的工具包,从官方网站下载 `lucene.apache.org` * analysis: 分析器包 * core: 核心包 * queryparser: 查询分析器 添加一个java工程 添加jar * lucene-analyzers-common-7.4.0.jar * lucene-core-7.4.0.jar * commons-io.jar # 创建索引库 步骤: 1. 创建一个Director对象,指定索引库保存的位置 2. 基于Directory对象创建建一个IndexWriter对象 3. 读取磁盘上的文件,对应每个文件创建一个文档对象 4. 向文档对象中添加域 5. 把文档对象写入索引库 6. 关闭indexWriter对象 ~~~ @Test public void createIndex() throws IOException { //1. 创建一个Director对象,指定索引库保存的位置 //把索引保存到磁盘 Directory directory = FSDirectory.open(new File("/Users/jdxia/Desktop/study/studylucene/lucene-first/index").toPath()); //2. 基于Directory对象创建建一个IndexWriter对象 IndexWriter indexWriter = new IndexWriter(directory, new IndexWriterConfig()); //3. 读取磁盘上的文件,对应每个文件创建一个文档对象 File dir = new File("/Users/jdxia/Desktop/study/studylucene/lucene-first/search"); File[] files = dir.listFiles(); for (File f : files) { //取文件名 String fileName = f.getName(); //文件的路径 String filePath = f.getPath(); String fileContent = FileUtils.readFileToString(f, "utf-8"); //文件的大小 long fileSize = FileUtils.sizeOf(f); //创建Field //参数1: 域的名称, 参数2: 域的内容, 参数3: 是否存储 TextField fieldName = new TextField("name", fileName, Field.Store.YES); TextField fieldPath = new TextField("path", filePath, Field.Store.YES); TextField fieldContent = new TextField("content", fileContent, Field.Store.YES); TextField fieldSize = new TextField("size", fileSize + "", Field.Store.YES); //创建文档对象 Document document = new Document(); //向文档对象中添加域 document.add(fieldName); document.add(fieldPath); document.add(fieldContent); document.add(fieldSize); //把文档对象写入索引库 indexWriter.addDocument(document); } //关闭indexWriter对象 indexWriter.close(); } ~~~ # 查询索引库 步骤: 1. 创建一个Director对象,指定索引库的位置 2. 创建一个IndexReader对象 3. 创建一个IndexSearcher对象,构造方法中的参数indexReader对象 4. 创建一个Query对象,TermQuery 5. 执行查询,得到一个TopDocs对象 6. 取查询结果的总记录数 7. 取文档列表 8. 打印文档中的内容 9. 关闭IndexReader对象 ~~~ @Test public void searchIndex() throws IOException { //1. 创建一个Director对象,指定索引库的位置 Directory directory = FSDirectory.open(new File("/Users/jdxia/Desktop/study/studylucene/lucene-first/index").toPath()); //2. 创建一个IndexReader对象 DirectoryReader indexReader = DirectoryReader.open(directory); //3. 创建一个IndexSearcher对象,构造方法中的参数indexReader对象 IndexSearcher indexSearcher = new IndexSearcher(indexReader); //4. 创建一个Query对象,TermQuery Query query = new TermQuery(new Term("content", "like")); //5. 执行查询,得到一个TopDocs对象 //参数1: 查询对象 参数2: 查询结果返回的最大记录数 TopDocs topDocs = indexSearcher.search(query, 10); //6. 取查询结果的总记录数 System.out.println("查询总记录数: " + topDocs.totalHits); //7. 取文档列表 ScoreDoc[] scoreDocs = topDocs.scoreDocs; //8. 打印文档中的内容 for (ScoreDoc doc : scoreDocs) { //取文档id int docId = doc.doc; //根据id取文档对象 Document document = indexSearcher.doc(docId); System.out.println(document.get("name")); System.out.println(document.get("path")); System.out.println(document.get("size")); System.out.println(document.get("content")); System.out.println("--------------------------------"); } //9. 关闭IndexReader对象 indexReader.close(); } ~~~