lucene2.4学习笔记1-(初学Lucene,简单例子)

说明一下,这一篇文章的用到的lucene,是用2.4版本的,主要在查询的时候2.0版本的lucene与以前的版本有了一些区别
下面是一个简单的例子
1.第一步建立索引
public class IndexDatebase {

	public static void main(String[] args) throws IOException {
		//创建保存索引的目录
		String indexDir = "d://indexDir";
		//创建Directory对象,具体的实现有FSDirectory,RAMDirectory,MMapDirectory,NIOFSDirector
		//FSDirectory表示索引是放到文件里面的,RAMDirectory是放到内存里面
		//new RAMDirectory()
		Directory index = FSDirectory.getDirectory(new File(indexDir));
		//创建索引IndexWriter对象,要四个参数,第一个是Directory对象,可以传File和String类型的path
		//new StandardAnalyzer()这个表示分析器,拆字用的,其它的分析器还有new ChineseAnalyzer(),new IK_CAnalyzer(),new CJKAnalyzer()
		//第三个参数代表是新建Index还是在原来上面的追加,true是新建
		//表示分词的最大值,比如说new MaxFieldLength(2),就表示两个字一分,一般用IndexWriter.MaxFieldLength.LIMITED
		IndexWriter writer = new IndexWriter(indexDir,new StandardAnalyzer(),true,IndexWriter.MaxFieldLength.LIMITED);
		//IndexWriter writer = new IndexWriter(indexDir,new StandardAnalyzer(),true,new MaxFieldLength(20));
		addDoc(writer,"法医鉴定称湖北石南海首死亡厨师系自杀");
		addDoc(writer,"国务院建议珠海横琴岛划南海地交澳门管理");
		addDoc(writer,"印尼在南海扣75名中国渔民 中方要求尽快释放南海南海南海南海南海南海南海");
		addDoc(writer,"南海南海南海南海南海南海南海南海南海印尼在南海扣75南海南海名中国渔民 中方要求尽快释放");
		addDoc(writer,"湖北洪湖一初南海中生被同学刺亡 亲属怒砸学校 ");
		//优化
		writer.optimize();
		//关闭流
		writer.close();
		
	}
	/**
	 * 把Document对象加到Index里面
	 * @param w
	 * @param value
	 * @throws IOException
	 */
	private static void addDoc(IndexWriter w, String value) throws IOException {
		//新建的Document对象
	    Document doc = new Document();
	    //Field(String name, String value, Store store, Index index)表示保存,并建立索引,如果字段多的话,不要都建立索引
	    doc.add(new Field("title", value, Field.Store.YES,Field.Index.ANALYZED));
	    //加进去
	    w.addDocument(doc);
	}
}

2.从索引中找出相应的对象
public class QueryLucene {

	public static void main(String[] args) throws ParseException, CorruptIndexException, IOException {
		//创建Query,QueryParser对象,根据Field建立的索引的KEY来搜,并设置要搜的内容
		Query query = new QueryParser("title",new StandardAnalyzer()).parse("南海");
		//可以理解成读Index对象,Directory,File,String都行
		IndexSearcher indexSearch = new IndexSearcher(FSDirectory.getDirectory(new File("d://indexDir")));
		//表示查出前四个
		TopDocCollector collector = new TopDocCollector(4);
		//查找
		indexSearch.search(query,collector);
		//ScoreDoc这个对象还不清楚,但是有多少结果,就有多少个这个对象
		ScoreDoc[] hits = collector.topDocs().scoreDocs;
		for(int i=0;i<hits.length;++i) {
			//找到这个Document原来的索引值
		    int docId = hits[i].doc;
		    System.out.println(docId);
		    //根据这个值找到对象的Document
		    Document d = indexSearch.doc(docId);
		    System.out.println((i + 1) + ". " + d.get("title"));		    
		}

	}

}


1.x,2.0和2.4是有一些区别的
比如说:
1
//1.x
IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true);  
//2.0,2.4
IndexWriter writer = new IndexWriter(indexPath, getAnalyzer(), true, IndexWriter.MaxFieldLength.UNLIMITED);

2.
Field.Index.TOKENIZED 替换为 Field.Index.ANALYZED 
没啥特殊的,改了一个名字而已

3.
IndexWriter.flush(); 
替换为 
IndexWriter.commit(); 


4.org.apache.lucene.search.Hits;
这个类将在3.0中被删除
新的使用方法在上面的例子中

5.Field的创建
在2.0+中
Field没了Keyword、UnIndexed、UnStored、Text这几个静态成员,只能用
Field(String, String, Store, Index)。
Keyword对应Field.Store.YES, Field.Index.UN_TOKENIZED,
UnIndexed 对应Field.Store.YES, Field.Index.NO,
UnStored对应Field.Store.NO, Field.Index.TOKENIZED,
Text对应Field.Store.YES, Field.Index.TOKENIZED
//2.0版本以上
Field(String name, byte[] value, Field.Store store) 
          // Create a stored field with binary value. 
Field(String name, Reader reader) 
          // Create a tokenized and indexed field that is not stored. 
Field(String name, Reader reader, Field.TermVector termVector) 
          // Create a tokenized and indexed field that is not stored, optionally with storing term vectors. 
Field(String name, String value, Field.Store store, Field.Index index) 
          // Create a field by specifying its name, value and how it will be saved in the index. 
Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector) 
          // Create a field by specifying its name, value and how it will be saved in the index. 



Field.Store 表示“是否存储”,即该Field内的信息是否要被原封不动的保存在索引中。

Field.Index 表示“是否索引”,即在这个Field中的数据是否在将来检索时需要被用户检索到,一个“不索引”的Field通常仅是提供辅助信息储存的功能。

Field.TermVector 表示“是否切词”,即在这个Field中的数据是否需要被切词。


通常,参数用Reader,表示在文本流数据源中获取数据,数据量一般会比较大。像链接地址URL、文件系统路径信息、时间日期、人名、居民身份证、电话号码等等通常将被索引并且完整的存储在索引中,但一般不需要切分词,通常用上面的第四个构造函数,第三四个参数分别为Field.Store.YES, Field.Index.YES。而长文本通常可用第3个构造函数。

你可能感兴趣的:(apache,C++,c,dos,Lucene)