Lucene7入门demo
加入依赖
<!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-core --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> <version>7.3.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-queryparser --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-queryparser</artifactId> <version>7.3.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.lucene/lucene-analyzers-common --> <dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> <version>7.3.1</version> </dependency>
创建索引代码实例:
@Test public void testCreateIndex() throws IOException { //指定索引库的存放位置Directory对象 Directory directory = FSDirectory.open(Paths.get("F:\\file\\test")); //指定一个标准分析器,对文档内容进行分析 Analyzer analyzer =new StandardAnalyzer(); //创建indexwriterCofig对象 //参数:分析器对象 IndexWriterConfig config =new IndexWriterConfig(analyzer); //创建一个indexwriter对象 IndexWriter writer = new IndexWriter(directory,config); //原始文档的路径 File file = new File("F:\\file\\searchsource"); File[] files=file.listFiles(); for (File file1:files){ //创建document对象 Document document=new Document(); //创建field对象,将field添加到document对象中 //文件名称 String fileName =file1.getName(); //创建文件名域 //第一个参数:域的名称 //第二个参数:域的内容 //第三个参数:是否存储 Field fileNameField = new TextField("fileName",fileName, Field.Store.YES); //文件路径 String filePath = file1.getPath(); //文件路径域(不分析、不索引、只存储) Field filePathField=new StoredField("filePath",filePath); //文件内容 String fileContent=FileUtils.readFileToString(file1); Field fileContentField=new TextField("fileContent",fileContent, Field.Store.YES); document.add(fileContentField); document.add(fileNameField); document.add(filePathField); //使用indexwriter对象将document对象写入索引库,此过程进行索引创建。并将索引和document对象写入索引库。 writer.addDocument(document); } //关闭IndexWriter对象。 writer.close(); }
2. 查询索引
@Test public void testMatchAllDocsQuery() throws IOException { //创建一个Directory对象,指定索引库存放的路径 Directory directory=FSDirectory.open(Paths.get("F:\\file\\test")); //创建IndexReader对象,需要指定Directory对象 IndexReader reader = DirectoryReader.open(directory); //创建Indexsearcher对象,需要指定IndexReader对象 IndexSearcher searcher=new IndexSearcher(reader); //创建查询条件 //使用MatchAllDocsQuery查询索引目录中的所有文档 Query query =new MatchAllDocsQuery(); //执行查询 //第一个参数是查询对象,第二个参数是查询结果返回的最大值 TopDocs topDocs =searcher.search(query,10); System.out.println("查询结果总数"+topDocs.totalHits); //遍历查询结果 //topDocs.scoreDocs存储了document对象的id //ScoreDoc[] scoreDocs = topDocs.scoreDocs; for (ScoreDoc scoreDoc:topDocs.scoreDocs){ //scoreDoc.doc属性就是document对象的id //int doc = scoreDoc.doc; //根据document的id找到document对象 Document document =searcher.doc(scoreDoc.doc); //文件名称 System.out.println(document.get("fileName")); //文件内容 System.out.println(document.get("fileContent")); //文件路径 System.out.println(document.get("filePath")); System.out.println("----------------------------------"); } //关闭indexreader对象 reader.close(); }
3:精确查询
@Test public void testSearchIndex() throws IOException{ //创建一个Directory对象,指定索引库存放的路径 Directory directory=FSDirectory.open(Paths.get("F:\\file\\test")); //创建IndexReader对象,需要指定Directory对象 IndexReader reader = DirectoryReader.open(directory); //创建Indexsearcher对象,需要指定IndexReader对象 IndexSearcher searcher=new IndexSearcher(reader); //创建一个TermQuery(精准查询)对象,指定查询的域与查询的关键词 //创建查询 Query query=new TermQuery(new Term("fileContent","bigdata")); //执行查询 //第一个参数是查询对象,第二个参数是查询结果返回的最大值 TopDocs topDocs =searcher.search(query,10); //查询结果的总条数 System.out.println("查询结果的总条数:"+ topDocs.totalHits); //遍历查询结果 //topDocs.scoreDocs存储了document对象的id //ScoreDoc[] scoreDocs = topDocs.scoreDocs; for (ScoreDoc scoreDoc:topDocs.scoreDocs){ //scoreDoc.doc属性就是document对象的id //int doc = scoreDoc.doc; //根据document的id找到document对象 Document document =searcher.doc(scoreDoc.doc); //文件名称 System.out.println(document.get("fileName")); //文件内容 System.out.println(document.get("fileContent")); //文件路径 System.out.println(document.get("filePath")); } //关闭indexreader对象 reader.close(); }
碰到问题:doc文档乱码无法解决
浙公网安备 33010602011771号