Lucene查询

2009-09-14 10:58

构造field--》被add到document--》被add到IndexWriter

指定查找路径(即从哪得到数据源)

把数据源的数据读出来构造field对象

指定索引存放路径

构建IndexWriter对象需要索引存放路径

查询

从索引存放路径查找

个人理解过程:就是把数据源做成索引文件,然后在索引文件里找关键词

参考一位网友的百度空间,代码如下:

package com.cstp.lucene;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;

public class TestFileIndexer {
public static void main(String[] args) throws Exception {
   /* 指明要索引的文件夹的位置 */

   File fileDir = new File("c://dataDir");

   /* 这里放索引文件的位置 */
   File indexDir = new File("c://index");

   Analyzer luceneAnalyzer = new StandardAnalyzer();
   IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer,
     true, IndexWriter.MaxFieldLength.UNLIMITED);
   File[] textFiles = fileDir.listFiles();
   long startTime = new Date().getTime();

  // 增加document到索引去
   for (int i = 0; i < textFiles.length; i++) {
    if (textFiles[i].isFile()
      && textFiles[i].getName().endsWith(".txt")) {
     System.out.println("File " + textFiles[i].getCanonicalPath()
       + "正在被索引....");
     //读取文件
     String temp = FileReaderAll(textFiles[i].getCanonicalPath(),
       "GBK");
     // System.out.println(temp);
     Document document = new Document();
     Field FieldPath = new Field("path", textFiles[i].getPath(),
       Field.Store.YES, Field.Index.NO);
     Field FieldBody = new Field("body", temp, Field.Store.YES,
       Field.Index.ANALYZED);
     document.add(FieldPath);
     document.add(FieldBody);
     indexWriter.addDocument(document);
    }
   }
// optimize()方法是对索引进行优化
   indexWriter.optimize();
   indexWriter.close();

   // 测试一下索引的时间
   long endTime = new Date().getTime();
   System.out.println("这花费了" + (endTime - startTime) + " 毫秒来把文档增加到索引里面去!"
     + fileDir.getPath());
  // 进行查找
   Analyzer analyzer = new StandardAnalyzer();
  IndexSearcher searcher = new IndexSearcher("c://index");
   ScoreDoc[] hits = null;
   String queryString = "中国";
   Query query = null;
   try {

//从"body"这个field里找
    query = new QueryParser("body", analyzer).parse(queryString);
   } catch (ParseException e) {
   }
   if (searcher != null) {
    hits = searcher.search(query, searcher.maxDoc()).scoreDocs;

    if (hits.length > 0) {
     System.out.println("找到:" + hits.length + " 个结果!");
    }
    Document doc;
    for (int i = 0; i < hits.length; i++) {
     doc = searcher.doc(hits[i].doc);
     System.out.println(doc.get("body"));
    }
   }

}

//读取文件,以字符串返回
public static String FileReaderAll(String FileName, String charset)
    throws IOException {
   BufferedReader reader = new BufferedReader(new InputStreamReader(
     new FileInputStream(FileName), charset));
   String line = new String();
   String temp = new String();

   while ((line = reader.readLine()) != null) {
    temp += line;
   }
   reader.close();
   return temp;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值