很郁闷的搞了好几天,各大搜索引擎都用遍了,还差点对互联网绝望。到最终发现是自己错了。
我用IndexWriter 追加索引(IndexWriter.addDocument),删除索引(IndexWriter.deleteDocuments)都可以实现,但是用IndexWriter.updateDocument 来做索引的更新就一直实现不了。
代码如下:
Document doc = new Document();
doc.add(new Field("title", "搜狐星相-十二生肖", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("content", "中华人民共和国自己的生命才是最重要的",Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("url", "http://www.sina.com.cn", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.add(new Field("updatetime", "2011-06-17",Field.Store.YES, Field.Index.NOT_ANALYZED));
// 更新索引使用默认分词器
writer.updateDocument(new Term("title", "搜狐星相-十二生肖"), doc);
//优化
writer.optimize();
writer.close();
在做测试的时候我是用txt文本做实验的。我把文件名存放在字段title,文件内容存放在content,这里的url和updatetime是做其他用途的,这里可以不用管它。
上面代码跑完之后,的确是把title为“搜狐星相-十二生肖”的索引删除了,但是并没有把 "中华人民共和国自己的生命才是最重要的","2011-06-17",等内容更新到索引里面去,我用关键字“生命”检索的时候,没有检索到内容。到网上找了很多的资料,都说按照上面的代码写就可以了,但是我就是跑不出来,一度以为网络太无力了。
搞搞搞搞搞了好久,发现把Field.Index.NOT_ANALYZED 改为Field.Index.ANALYZED居然可以了。
即:
Document doc = new Document();
doc.add(new Field("title", "搜狐星相-十二生肖", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("content", "中华人民共和国自己的生命才是最重要的",Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("url", "http://www.sina.com.cn", Field.Store.YES, Field.Index.ANALYZED));
doc.add(new Field("updatetime", "2011-06-17",Field.Store.YES, Field.Index.ANALYZED));
// 更新索引使用默认分词器
writer.updateDocument(new Term("title", "搜狐星相-十二生肖"), doc);
//优化
writer.optimize();
writer.close();
就ok了。
也就是说在建立索引字段的时候,一定要记住,切记:分析一下。