热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Lucene(全文检索)索引库维护

Lucene索引库的维护Lucene工具类封装packagecom.xushuai.lucene;importorg.apache.lucene.analysis.Analyze

Lucene索引库的维护


    Lucene工具类封装

package com.xushuai.lucene;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;import java.io.File;
import java.io.IOException;/*** Lucene工具类* Author: xushuai* Date: 2018/5/7* Time: 12:36* Description:*/
public class LuceneUtil {/*** 获取索引库写入流对象* @auther: xushuai* @date: 2018/5/7 12:37* @return: 写入流对象* @throws: IOException*/public static IndexWriter getIndexWriter(String pathname, Analyzer analyzer) throws IOException {//存放索引库的路径Directory directory = FSDirectory.open(new File(pathname));//创建分析器(使用其子类,标准分析器类)IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LATEST, analyzer);//使用索引库路径和分析器构造索引库写入流return new IndexWriter(directory,indexWriterConfig);}/*** 获取索引库读取流* @auther: xushuai* @date: 2018/5/7 12:45* @return: 读取流对象* @throws: IOException*/public static IndexReader getIndexReader(String pathname) throws IOException {//指定索引库位置Directory directory = FSDirectory.open(new File(pathname));//创建索引库读取流return DirectoryReader.open(directory);}/*** 打印结果集到控制台* @auther: xushuai* @date: 2018/5/7 13:23* @throws: IOException*/public static void printResult(IndexSearcher indexSearcher, Query query, int count) throws IOException {//执行查询,第一个参数为:查询条件 第二个参数为:结果返回最大个数TopDocs topDocs = indexSearcher.search(query, count);//打印结果集长度System.out.println("查询结果总条数:" + topDocs.totalHits);//遍历结果集for (ScoreDoc doc:topDocs.scoreDocs) {//获取其查询到的文档对象,ScoreDoc对象的doc属性可以获取document的id值Document document = indexSearcher.doc(doc.doc);//打印文件名System.out.println("文件名: " + document.get("filename"));//打印文件大小System.out.println("文件大小:" + document.get("filesize"));//打印文件路径System.out.println("文件路径:" + document.get("filepath"));//分割线System.out.println("------------------------------------------------------------------------------");}}
}

一、索引库的修改和删除

package com.xushuai.lucene;import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;import java.io.IOException;/*** 索引库维护* Author: xushuai* Date: 2018/5/7* Time: 12:47* Description:对索引库的维护主要分为:增删改查(CRUD),其中新增即为创建索引库,查询内容较多,单独为一个分支。*/
public class LuceneManager {private IndexWriter indexWriter = null;/*** 加载写入流* @auther: xushuai* @date: 2018/5/7 17:21* @throws: IOException*/@Beforepublic void setUp() throws IOException {//注意:IKAnalyzer为第三方分析器,需要单独导包indexWriter = LuceneUtil.getIndexWriter("D:\\lucene-solr\\lucene\\index", new IKAnalyzer());}/*** 释放资源* @auther: xushuai* @date: 2018/5/7 17:21* @throws: IOException*/@Afterpublic void tearDown() throws IOException {indexWriter.close();}/*** Lucene索引修改过程:先删除,再添加* @auther: xushuai* @date: 2018/5/7 12:56* @throws: IOException*/@Testpublic void luceneUpdateRepository() throws IOException {//创建Document对象Document document = new Document();//添加域document.add(new TextField("fname","修改后的文件名", Field.Store.YES));document.add(new TextField("fcontent","修改后的文件内容",Field.Store.YES));//修改,其中第一个参数:为一个Term,会根据该Term去匹配要修改的文档对象indexWriter.updateDocument(new Term("filename","java"),document);}/*** 删除索引* @auther: xushuai* @date: 2018/5/7 13:00* @throws: IOException*/@Testpublic void luceneDeleteRepository() throws IOException{//第一种删除:删除索引库全部内容indexWriter.deleteAll();//第二种删除:删除指定索引。过程:先查询,后删除//新建一个查询条件,例如:删除 "filename" 域的值中含有 "java" 的Query query = new TermQuery(new Term("filename","java"));//根据条件进行删除(参数为:Query可变数组,可以为多个条件,即组合条件删除)indexWriter.deleteDocuments(query);}}






二、查询索引(Query子类)

package com.xushuai.lucene;import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;/*** Lucene索引查询* Author: xushuai* Date: 2018/5/7* Time: 13:19* Description:*/
public class LuceneQuery {private IndexSearcher indexSearcher = null;/*** 准备工作* @auther: xushuai* @date: 2018/5/7 17:27* @throws: IOException*/@Beforepublic void setUp() throws IOException {IndexReader indexReader = LuceneUtil.getIndexReader("D:\\lucene-solr\\lucene\\index");indexSearcher = new IndexSearcher(indexReader);}/*** 释放资源* @auther: xushuai* @date: 2018/5/7 17:27* @throws: IOException*/@Afterpublic void tearDown() throws IOException {indexSearcher.getIndexReader().close();}/*** 查询索引目录中的所有文档* @auther: xushuai* @date: 2018/5/7 13:22* @return: * @throws: */@Testpublic void luceneMatchAllDocsQuery() throws IOException {//创建查询条件对象,MatchAllDocsQuery:查询全部文档对象Query query = new MatchAllDocsQuery();//打印查询结果集(最后一个参数为:打印查询出来的结果集中的前10条)LuceneUtil.printResult(indexSearcher,query,10);}/*** 精准查询* @auther: xushuai* @date: 2018/5/7 13:32* @return:* @throws:*/@Testpublic void luceneTermQuery() throws IOException {//创建查询条件对象,TermQuery:精准查询,按Term查询。例如: 查询 filename 域的值为 java的文档对象Query query = new TermQuery(new Term("filename","java"));//打印查询结果集(最后一个参数为:打印查询出来的结果集中的前10条)LuceneUtil.printResult(indexSearcher,query,10);}/*** * @auther: xushuai* @date: 2018/5/7 13:34* @return: * @throws: */@Testpublic void luceneNumericRangeQuery() throws IOException {//创建查询条件对象/** newLongRange参数:* 1、域名称* 2、最小值* 3、最大值* 4、是否包含最小值:boolean* 5、是否包含最大值:boolean*/Query query = NumericRangeQuery.newLongRange("filesize",50L,200L,true,true);//打印查询结果集(最后一个参数为:打印查询出来的结果集中的前10条)LuceneUtil.printResult(indexSearcher,query,10);}/*** 条件组合查询* @auther: xushuai* @date: 2018/5/7 13:38* @throws: IOException*/@Testpublic void luceneBooleanQuery() throws IOException{//创建查询对象BooleanQuery booleanQuery = new BooleanQuery();//创建查询条件Query query1 = new TermQuery(new Term("filename","java"));Query query2 = new TermQuery(new Term("filename","apache"));//设置其两个条件的关系/** BooleanClause.Occur.MUST:必须,即该条件必须成立* BooleanClause.Occur.MUST_NOT:必须不,即该条件必须不成立* BooleanClause.Occur.SHOULD:应该,即该条件可以成立也可以不成立,与OR类似\** 下面这个组合条件翻译为:搜索文件名称中含有java或apache的文档对象*/booleanQuery.add(query1, BooleanClause.Occur.SHOULD);booleanQuery.add(query2, BooleanClause.Occur.SHOULD);//打印查询结果集(最后一个参数为:打印查询出来的结果集中的前10条)LuceneUtil.printResult(indexSearcher,booleanQuery,10);}}







推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 五、RabbitMQ Java Client基本使用详解
    JavaClient的5.x版本系列需要JDK8,用于编译和运行。在Android上,仅支持Android7.0或更高版本。4.x版本系列支持7.0之前 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
author-avatar
Rocky柱子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有