今天将“Lucene学习”里面的程序贴到eclipse工程里实现了一下
加深了我对检索的理解
在全文检索中,可以和数据库进行一个简单的对比
全文检索没有表的概念,也就没有固定的fields,但是有记录,每一个记录就是一个Document对象
每一个document都可以有自己不同的fields,如下:

    Document doc = new Document(); 

   doc.add(Field.Keyword("filename",file.getAbsolutePath())); 
     
   //以下两句只能取一句,前者是索引不存储,后者是索引且存储
   //doc.add(Field.Text("content",new FileReader(file))); 
   doc.add(Field.Text("content",this.chgFileToString(file)));
   
   indexWriter.addDocument(doc);

在查询的时候,需要三个重要的参数
首先是库路径,即在哪个库里面进行检索(相当于database的路径):

Searcher searcher = new IndexSearcher(dbpath);

然后就是你以哪个字段,查询什么关键词,因为根据字段就可以得到字段对应的内容
在得到的内容中检索你的关键词,这个累死sql语句,只不过没有表的概念
Query query
    = QueryParser.parse(searchkey,searchfield,new StandardAnalyzer()); 

然后开始查询,查询的结果就是document的集合:
   Hits hits = searcher.search(query); 

对得到的集合进行处理:

   if(hits != null)
  {
       list = new ArrayList();
       int temp_hitslength = hits.length();
       Document doc = null;
       for(int i = 0;i < temp_hitslength; i++){
           doc = hits.doc(i);
           //list.add(doc.get("filename"));
           list.add(doc.get("content"));
       }
   } 

  附常用Field:

常用的
Field 方法如下:


方法

切词

索引

存储

用途

Field.Text(String name, String value)

Yes

Yes

Yes

切分词索引并存储,比如:标题,内容字段

Field.Text(String name, Reader value)

Yes

Yes

No

切分词索引不存储,比如:META信息,

不用于返回显示,但需要进行检索内容

Field.Keyword(String name, String value)

No

Yes

Yes

不切分索引并存储,比如:日期字段

Field.UnIndexed(String name, String value)

No

No

Yes

不索引,只存储,比如:文件路径

Field.UnStored(String name, String value)

Yes

Yes

No

只全文索引,不存储


切分词 就是指对文本进行切词,用于进行索引,上面可以看到切分的都会进行索引;索引即用于通过搜索词进行查询;存储表示是否存储内容本身。上面的 Field.Keyword方法就不切分但是可以索引,所以可以用这个字段进行查询,而Field.UnIndexed就不能进行查询了。但是由于 Field.Keyword不切分,所以当使用new Term(searchkey,searchfield)进行查询时,给出的searchkey必须与vaue参数值完全一致才会查询出来,而 Field.Text和Field.UnStored则就不一样


Lucene中国是一个非常好的网站,对Lucene内部结构进行了详细的分析,可以参考。