[其他] 我搜索的记录有重复

lijie250 2009-11-10
这个问题是我在生成的索引有重复,还是我的查询的时候没用过滤啊?
bit6211 2009-11-10
可能是创建索引时。
lijie250 2009-11-10
bit6211 写道
可能是创建索引时。

这些是我部分代码,中文分词是用的IKAnalyzer,
		Analyzer analyzer = new IKAnalyzer();
        FSDirectory directory=null;
        IndexWriter writer=null;
		HttpServletRequest request = Utils.getCurrentRequest();
        try
        {
        	directory = FSDirectory.getDirectory(request.getSession().getServletContext().getRealPath(NEWS_INDEX_PATH));  
        	writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.LIMITED);
        	int lastNewsID=readNewsLastID();
        	List<News> listNews=newsDAO.getIndexNews(lastNewsID);
        	if(listNews==null){
        		log.error("no new news");
        		return false;
        	}
        	int currentMaxID=0;
        	for(int i=0;i<listNews.size();i++){
        		Document doc = new Document();
        		doc.add(new Field("NewsID",listNews.get(i).getNID().toString(),Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
        		doc.add(new Field("ClassName",listNews.get(i).getClassName(),Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
        		doc.add(new Field("Title",listNews.get(i).getTitle(),Field.Store.YES,Field.Index.ANALYZED));
        		doc.add(new Field("Content",Utils.htmlToStr(listNews.get(i).getContent()),Field.Store.YES,Field.Index.ANALYZED));
        		doc.add(new Field("PermanentLink",listNews.get(i).getPermanentLink(),Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
        		doc.add(new Field("CreateTime",listNews.get(i).getCreateTime(),Field.Store.YES,Field.Index.ANALYZED));
        		doc.add(new Field("Hits",""+listNews.get(i).getHits(),Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
        		doc.add(new Field("CommentCount",""+listNews.get(i).getCommentCount(),Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
        		doc.add(new Field("UserID",""+listNews.get(i).getUserID(),Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
        		doc.add(new Field("UserName",listNews.get(i).getUserName(),Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
        		doc.add(new Field("IsPass",""+listNews.get(i).getIsPass(),Field.Store.YES,Field.Index.ANALYZED_NO_NORMS));
        		writer.addDocument(doc);
        		currentMaxID=listNews.get(i).getNID();
        	}
        	//writer.optimize();
        	writeNewsLastID(currentMaxID);
        	writer.close();
        	return true;
        }


我的是想增量索引,是不是我创建的方式有问题?
bit6211 2009-11-10
你是不是原来有 具有相同内容的索引,你现在创建时,并没有删去或者覆盖原来的索引,导致搜索有重复的结果?

你把原来的索引文件删去,重新建立一个新的索引(就建一次),搜索试试看。
lijie250 2009-11-10
恩是的,我是直接添加了,没有删除,不是可以增量添加吧,我的lucene版本是2.4.1
bit6211 2009-11-10
是可以增量添加的,在solr(它底层用的是lucene)中,你只要定义索引的一个主键(在配置文件中定义),那么主键相同的索引,新的会自动替换旧的索引。
在lucene中,我想会有同样的机制,只是需要你手工去操作罢了。我没有实际动手过,你看看有没有相关的资料。
luckaway 2009-11-10
indexWriter.updateDocument(new Term(Constant.FIELD_ID, id), document);
找不到符合new Term(Constant.FIELD_ID, id)它就执行添加操作

其实writer.addDocument(doc);也是调用updateDocument

writer.addDocument(doc)==writer.updateDocument(null,doc)

lijie250 2009-11-10
luckaway 写道
indexWriter.updateDocument(new Term(Constant.FIELD_ID, id), document);
找不到符合new Term(Constant.FIELD_ID, id)它就执行添加操作

其实writer.addDocument(doc);也是调用updateDocument

writer.addDocument(doc)==writer.updateDocument(null,doc)


这个我回去试下
kernaling.wong 2009-11-10
其实可以这样考滤,在添加记录到lucene的时候,首先先用IndexReader去查一下是否已经存在了相同的键值,有就把原来的Docuemnt删除,再新增一个或者用updateDocument也可以,这样就能保证不会出现重复的Document了.
luckaway 2009-11-10
IndexReader是查不到还未刷到硬盘的索引的!!


是该定义一个类似于solr的主键的字段!
Global site tag (gtag.js) - Google Analytics