• 【Lucene】具体解释Lucene全文检索的信息写入与读取


    Lucene的大致结构图:



    信息写入索引库的过程:



    读取信息的过程:




    以下是一个向索引库写入信息与读取信息的样例:

    public void testCreateIndex() throws Exception{
    	/**
    	 * 1、创建一个student对象,而且把信息存放进去
    	 * 2、调用indexWriter的API把数据存放在索引库中
    	 * 3、关闭indexWriter
    	 */
    	// 创建一个Student对象。而且把信息存放进去
    	Student student = new Student();
    	student.setId(1L);
    	student.setName("张三");
    	// 调用indexWriter的API把数据存放在索引库中
    	   /**
    		* 创建一个IndexWriter
    		*    參数三个 1、索引库, 指向索引库的位置  2、分词器
    		*/
    	// 创建索引库
    	Directory directory = FSDirectory.open(new File("./indexDir"));
    	// 创建分词器
    	Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
    	IndexWriter indexWriter = new IndexWriter(directory, analyzer, MaxFieldLength.LIMITED);
    	// 把一个student对象转化成document
    	Document document = new Document();
    	Field idField = new Field("id",student.getId().toString(),Store.YES,Index.NOT_ANALYZED);
    	Field nameField = new Field("name",student.getName(),Store.YES,Index.ANALYZED);
    	document.add(idField);
    	document.add(nameField);
    	indexWriter.addDocument(document);
    	// 关闭indexWriter
    	indexWriter.close();
    }


    public void testSearchIndex() throws Exception{
    	/**
    	 * 1、创建一个IndexSearch对象
    	 * 2、调用search方法进行检索
    	 * 3、输出内容
    	 */
    	// 创建一个 IndexSearch对象
    	Directory directory = FSDirectory.open(new File("./indexDir"));
    	IndexSearcher indexSearcher = new IndexSearcher(directory);
    	// 调用search方法进行检索
    	Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_30);
    	QueryParser queryParser = new QueryParser(Version.LUCENE_30,"name",analyzer);
    	Query query = queryParser.parse("张");  // 要查找的关键词
    	TopDocs topDocs = indexSearcher.search(query, 2);  // 前两条
    	int count = topDocs.totalHits;  // 依据关键词查询出来的总的记录数
    	ScoreDoc[] scoreDocs = topDocs.scoreDocs;
    	List<Student> studentList = new ArrayList<Student>();
    	for(ScoreDoc scoreDoc:scoreDocs){
    		float score = scoreDoc.score;  // 关键词得分
    		int index = scoreDoc.doc;  // 索引的下标
    		Document document = indexSearcher.doc(index);
    		// 把document转化成Student
    		Student student = new  Student();
    		student.setId(Long.parseLong(document.get("id")));  // document.getField("id").stringValue()
    		student.setTitle(document.get("name"));
    		studentList.add(student);
    	}
    	 
    	for(Student student:studentList){
    		System.out.println(student.getId());
    		System.out.println(student.getName());
    	}
    }

    说明:
    1、索引库的增、删、改是由indexWriter来操作的
    2、同一个时刻内。同一个索引库,仅仅能同意一个indexWriter操作
    3、当IndexWriter创建完毕以后,indexwriter所指向的索引库就被占据了。仅仅有当indexWriter.close时。才干释放锁的资源
    4、当一个新的indexWriter想拥有索引库时,原来的indexWriter必须释放锁
    5、仅仅要索引库中存在write.lock文件,说明上锁了
    6、indexWriter.close有两层含义:1. 关闭IO资源; 2.释放锁

    文件索引库和内存索引库的结合 :
    1、能不能设置非常多个索引库 
           能够设置非常多个索引库
    2、索引库能不能合并起来
           假设是内存索引库
           Directory ramDirectory = new RamDirectory(Directory d);
           这样就能够把一个索引库放入到内存索引库中
           利用IndexWriter.addIndexesNoOptimize方法能够把非常多个索引库进行合并操作
    3、应用程序能不能在内存中和索引库进行交互



    Author:顾故

    Sign:别输给以前的自己




  • 相关阅读:
    05.设计模式_建造者模式
    04.设计模式_抽象工厂模式
    03.设计模式_工厂方法模式
    02.设计模式_单例模式
    01.设计模式_简单工厂模式
    cocos-js一些问题
    blender
    游戏编程模式
    Unity自动打包工具
    unity调用ios原生代码objective-c和回调
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6840677.html
Copyright © 2020-2023  润新知