当前位置:首页 > 开发 > 编程语言 > 搜索 > 正文

Lucene增量索引的搜索结果重复的问题

发表于: 2010-12-11   作者:hotsunshine   来源:转载   浏览:
摘要: Lucene的增量索引没有那么智能,虽然根据文档所言,把下面的第三个参数设为false就是增量索引(true to create the index or overwrite the existing one; false to append to the existing index,注意这个append)。但是我发现,它与true的区别,仅仅在于不去删掉以前所有的索引文件而已,他并不能智能的分
Lucene的增量索引没有那么智能,虽然根据文档所言,把下面的第三个参数设为false就是增量索引(true to create the index or overwrite the existing one; false to append to the existing index,注意这个append)。但是我发现,它与true的区别,仅仅在于不去删掉以前所有的索引文件而已,他并不能智能的分析到当前要被索引的文件是否已经被索引过,因此对先前文档作了修改,要重建索引的话,必须删除先前的这个文档所对应的索引
new IndexWriter(indexDir, new StandardAnalyzer(), false, new IndexWriter.MaxFieldLength(10000));


建立索引的关键步骤就是对IndexWriter添加Document,我是对文本文件进行分析的

File f = new File("text.txt");
Document doc = new Document();
doc.add(new Field("content", new FileReader(f))); // 由于文件内容比较大,没有保存,如果是要做高亮搜索词的话,需要保存,分析,并且指定词向量参数Field.TermVector
doc.add(new Field("title", "要被索引的字符串", Field.Store.YES, Field.Index.ANALYZED)); 
writer.addDocument(doc);


参数的说明:
Field.Store.YES表示要对这个字符串进行存储,Field.Index.ANALYZED表示要对个字符串进行分析

虽然设置了增量索引,如果运行两次这个索引的代码,然后去搜索的话,会出现两条相同的结果。考虑到,一条doc对应一个文件,便想着给doc添加一个唯一标示的字段,索引之前检测是否存在,如果已经存在删除之

doc.add(new Field("fileid", "自定义的id", Field.Store.YES, Field.Index.NOT_ANALYZED));

保存这个id字段,但是不要对这个字段进行分析,如果分析了,对索引结果会有影响。刚开始计划使用文本路径设置id,但是不起作用,只有文件名的话可以,但没有唯一性,id的定制很重要。

删除doc的代码
writer.deleteDocuments(new Term("fileid", "自定义的id"));

关于是用IndexWriter来删除还是用IndexReader来删除可以参考下面文章
http://www.cnblogs.com/huangfox/archive/2010/10/14/1851031.html
为保持数据一致,作者建议使用indexwriter来做删除操作













Lucene增量索引的搜索结果重复的问题

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号