请您先登录,才能继续操作

[lucene] 使用IndexSearcher做检索时,TermDocs一直为空是怎么回事?

lyj552041 2010-09-02
刚开始研究Lucene,参照资料做了个入门实例,运行一下没有报错,可是就是没有检索的相关数据,后来调试了一下,发现TermDocs一直为空。

下面我把代码贴出来,大家帮我看下,用的是3.0的库
1.IndexProcess.java
public class IndexProcess {
	private String INDEX_STORE_PATH="D:\\index";
	
	public void createIndex(String inputDir){
		try {
			File file = new File(INDEX_STORE_PATH);
			Directory dir = FSDirectory.open(file);
			IndexWriter writer= new IndexWriter(dir,new StandardAnalyzer(Version.LUCENE_CURRENT),true,IndexWriter.MaxFieldLength.LIMITED);
			
			
			File fileDir = new File(inputDir);
			File[] files = fileDir.listFiles();
			int length = files.length;
			
			for(int i=0;i<length;i++){
				String fileName = files[i].getName();
				if(fileName.substring(fileName.lastIndexOf(".")).equals(".txt")){
					Document doc = new Document();
					
					Field field = new Field("filename",files[i].getName(),Field.Store.YES,Field.Index.ANALYZED);
					doc.add(field);
					
					field = new Field("content",loadFileToString(files[i]),Field.Store.NO,Field.Index.ANALYZED);
					doc.add(field);
					
					writer.addDocument(doc);
				}
			}
			writer.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public String loadFileToString(File file){
		try {
			BufferedReader reader = new BufferedReader(new FileReader(file));
			StringBuffer conts = new StringBuffer();
			String line = reader.readLine();
			while(line !=null){
				conts.append(line);
				line = reader.readLine();
			}
			reader.close();
			return conts.toString();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}


2.SearchProcess.java
public class SearchProcess {
	private String INDEX_STORE_PATH  ="D:\\index";
	
	public void indexSearch(String searchType,String searchKey){
		try {
			System.out.println("使用索引方式搜索");
			System.out.println("-------------------------------------------------------------------------------------");
			
			File file = new File(INDEX_STORE_PATH);
			Directory dir = FSDirectory.open(file);
			IndexSearcher searcher = new IndexSearcher(dir);
			
			Term t = new Term(searchType,searchKey);
			Query q = new TermQuery(t);
			
			Date beginTime = new Date();
//下面这个TermDocs一直为空,所以下面的循环也不会走。
			TermDocs termDocs = searcher.getIndexReader().termDocs(t);
			//System.out.println(termDocs.freq());
			while(termDocs.next()){
				System.out.println("测试");
				System.out.print("find "+termDocs.freq()+" matches in");
				System.out.println(searcher.getIndexReader().document(termDocs.doc()).getField("filename").stringValue());
			}
//

		         Date endTime = new Date();
			long timeOfSearch = endTime.getTime() - beginTime.getTime();
			System.out.println("使用索引方式搜索总耗时 "+timeOfSearch+"ms");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


程序运行后:
索引文件:
_e.cfs
segments.gen
segments_g

三个。
viruscamp 2010-09-03
用 luke 打开你索引库看看里面的内容吧
lyj552041 2010-09-03
我换了个searchKey就行。是不是有的中文不能匹配啊。还是分词问题?
galo 2010-09-07
你这个是默认分词器,分解拼音,英语还可以,中文不行。
Global site tag (gtag.js) - Google Analytics