`

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

    博客分类:
  • java
阅读更多
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来做删除操作













分享到:
评论
12 楼 hotsunshine 2012-05-16  
u_lie 写道
.....没明白我意思,不过我明白了! 谢谢你了

doc.add(new Field("content", new FileReader(f)));

FileReader方法为只读方法,没有能保存文件内容的属性。

想要保存文件内容就只能将文件内容读取出来转换成字符串,利用下面的形式

doc.add(new Field("title", "文件字符串", Field.Store.YES, Field.Index.ANALYZED));   

我还以为这种方法很笨,有更好的方法呢~!哎!!


哈哈,不客气,祝贺。
11 楼 u_lie 2012-05-16  
.....没明白我意思,不过我明白了! 谢谢你了

doc.add(new Field("content", new FileReader(f)));

FileReader方法为只读方法,没有能保存文件内容的属性。

想要保存文件内容就只能将文件内容读取出来转换成字符串,利用下面的形式

doc.add(new Field("title", "文件字符串", Field.Store.YES, Field.Index.ANALYZED));   

我还以为这种方法很笨,有更好的方法呢~!哎!!

10 楼 hotsunshine 2012-05-16  
u_lie 写道
大哥!我就最后问你一个问题! 就是读取文件建立索引
doc.add(new Field("content", new FileReader(f)))
这个是不是不能保存啊?所以查询的时候content为空。
是不是只能保存字符串啊?没有更好的方法了吗~!请教下一 最后这一个问题!谢谢了!

Field.Store.YES, Field.Index.ANALYZED

看见了没,stroe yes这个参数就是保存,后面那个是分析,文本是可以保存的
9 楼 u_lie 2012-05-16  
大哥!我就最后问你一个问题! 就是读取文件建立索引
doc.add(new Field("content", new FileReader(f)))
这个是不是不能保存啊?所以查询的时候content为空。
是不是只能保存字符串啊?没有更好的方法了吗~!请教下一 最后这一个问题!谢谢了!
8 楼 hotsunshine 2012-05-16  
u_lie 写道
大哥~!还有个问题请教下,就是按照你上面的方法读取TXT文件建立索引后,为什么搜索时候content就是文件内容为空呢~!
还有大哥,如何获取文件内容摘要啊,小弟刚刚接触lucene好多地方发蒙,给贴点代码出来呗 最好相信点的 呵呵 谢谢了~!

你上网搜一下,这个lucene的索引的文档,很多的,还有高亮代码之类的。你一定要搞明白哪些参数是什么意思,我没有时间给你一点点解释
7 楼 u_lie 2012-05-16  
大哥~!可以给我解释下
doc.add(new Field("content", new FileReader(f))); // 由于文件内容比较大,没有保存,如果是要做高亮搜索词的话,需要保存,分析,并且指定词向量参数Field.TermVector 

这句话的意思吗~! 怎么才能保存啊,为什么我像这么写能够检索到,但是却获取不到文件内容呢~!代码该怎么写才能获取到文件内容啊~!请教一下
6 楼 u_lie 2012-05-16  
哥哥我等你
5 楼 u_lie 2012-05-16  
大哥~!还有个问题请教下,就是按照你上面的方法读取TXT文件建立索引后,为什么搜索时候content就是文件内容为空呢~!
还有大哥,如何获取文件内容摘要啊,小弟刚刚接触lucene好多地方发蒙,给贴点代码出来呗 最好相信点的 呵呵 谢谢了~!
4 楼 hotsunshine 2012-05-14  
u_lie 写道
请问下文件内容保存和高亮搜索的地方怎么做啊

给你一段代码你参考一下吧

 /**
   * 获取高亮字符串
   */
  public String makeHighlight(String str) {
    SimpleHTMLFormatter html_formater = new SimpleHTMLFormatter("<span class='search-highlight'>", "</span>");
    Highlighter highlighter = new Highlighter(html_formater, new QueryScorer(query));
    highlighter.setTextFragmenter(new SimpleFragmenter(200));

    String re_str = "";
    if (str != null) {
      TokenStream tokenStream = new IKAnalyzer().tokenStream("", new StringReader(str));
      try {
        re_str = highlighter.getBestFragment(tokenStream, str);
        if(re_str == null || "".equals(re_str)) re_str = str;
      } catch (IOException ex) {
        re_str = str;
      } catch (InvalidTokenOffsetsException ex) {
        re_str = str;
      }
    }
    return re_str;
  }
3 楼 u_lie 2012-05-14  
请问下文件内容保存和高亮搜索的地方怎么做啊
2 楼 hotsunshine 2011-03-25  
dongcb678 写道
大哥 又没遇到过compass查询重复的问题 应该也是索引重复了 没头绪啊
qq 150584428

这个没用过,避免重复索引的话,设置一个 唯一标示的id ,下一次再去索引的时候,把以前的干掉,再重建。昨天还看到一个方法,就是根据id找到索引,然后更新其中的一些域
1 楼 dongcb678 2011-03-23  
大哥 又没遇到过compass查询重复的问题 应该也是索引重复了 没头绪啊
qq 150584428

相关推荐

    基于lucene技术的增量索引

    本文将深入探讨如何利用Lucene实现增量索引,这是一种在数据库或文件系统更新时仅对新数据或变化数据进行索引的技术,以降低资源消耗并保持搜索性能。 **1. Lucene基础知识** Lucene首先需要理解的是它的核心概念,...

    Lucene5学习之增量索引(Zoie)

    Lucene本身并不直接支持增量索引,因此,开发者们开发了Zoie系统,它是基于Lucene的一个扩展,旨在解决大数据量场景下的实时索引问题。Zoie的名字来源于“Zero Indexing Overhead”,即零索引开销,它的核心思想是...

    lucene分词搜索,增量索引及全量索引

    总结,Lucene作为强大的全文搜索引擎,其分词搜索、增量索引和全量索引机制为企业级应用提供了高效的检索解决方案。理解并灵活运用这些概念,能帮助开发者优化系统性能,提升用户体验。在实际应用中,应根据数据规模...

    lucene实现索引查询

    Lucene 是一个高性能、全文本搜索库,被广泛用于构建高效的搜索引擎和信息检索系统。它提供了完整的搜索功能,包括分析、索引、查询以及结果排序等。在Java开发中,Lucene 提供了丰富的API来简化这些操作。以下是...

    lucene索引结构原理.docx

    - **索引构建**:Lucene支持增量索引和批量索引,可以处理数据源的小幅变化或大规模数据。数据库通常需要全量重建索引,尤其是在数据发生变化时。 - **结果输出**:数据库查询返回RecordSet,而Lucene查询返回Hits...

    Lucene.net建立索引,检索分页Demo

    Lucene 提供了强大的文本分析、索引创建、文档检索以及搜索结果排序等功能。在 .NET 平台上,Lucene.net 提供了与原生 Lucene 相同的强大功能,并且完全兼容 .NET Framework 和 .NET Core。 1. **文本分析(Text ...

    Solr数据库插入(全量和增量)索引

    我们的测试结果表明,全量索引和增量索引都可以正确地将数据插入 Solr 索引库中,并且可以实时地更新索引。 结论 通过以上测试结果,我们可以看到,Solr 数据库插入全量和增量索引可以正确地将数据插入 Solr 索引...

    solr增量导入更新索引包

    Solr,作为一款流行的开源全文搜索引擎,经常被用于大规模数据的快速检索。增量导入更新索引包是Solr中的一项重要功能,它允许系统仅处理自上次完整索引以来发生改变的数据,从而大大提升了效率并降低了资源消耗。...

    lucene站内搜索

    1. **性能优化**: 使用多线程并行索引,或者利用NRT(Near Real Time)特性,实现更快的增量索引。 2. **查询优化**: 使用过滤器(Filter)、布尔查询(BooleanQuery)和短语查询(PhraseQuery)等提高查询效率。 ...

    lucene搜索引擎项目

    Lucene支持增量索引,意味着可以对新的或已更改的数据进行实时更新。索引优化则是一次性合并多个段(segments)的过程,以提高搜索性能。 5. **搜索结果相关性** Lucene通过TF-IDF(Term Frequency-Inverse ...

    基于Lucene的分布式并行索引.pdf

    除了倒排索引,Lucene还支持增量索引,这意味着可以只对文档的更改部分进行索引更新,而不是重新对整个文档集进行索引,从而节省资源并提高效率。 然而,尽管Lucene提供了强大的索引能力,但在实际应用中,随着索引...

    lucene3.6 搜索例子

    IndexWriter支持增量索引,即在已有索引的基础上添加新的文档,以及批量导入大量数据。 三、搜索过程 1. 查询构造:Lucene支持多种查询语法,如布尔查询、短语查询、范围查询等。通过QueryParser,我们可以根据...

    lucene全文检索案例源码

    - 增量索引:在大型数据集上,应采用增量索引策略,避免一次性加载所有数据。 - 使用自定义ScoreFunction:根据业务需求,自定义评分函数,使搜索结果更符合用户期望。 - 利用Filter和QueryWrapperFilter:过滤无关...

    lucene全文检索全面教程

    6. **更新与增量索引**:Lucene支持实时更新,可以仅索引新数据或修改过的数据。 ### 四、实战案例 - **全文检索例子.doc**:这个文档可能包含一个或多个示例,演示如何在实际项目中创建索引、执行查询和处理搜索...

    增量索引2

    增量索引技术是现代搜索引擎和信息检索系统不可或缺的一部分,它能够有效应对大规模数据集的实时变化需求。通过采用合适的监测机制和优化策略,可以极大地提高索引更新的速度和稳定性。此外,面对实际应用中遇到的...

    基于lucene搜索引擎的java源码

    **基于Lucene搜索引擎的Java...这不仅涉及到了Lucene的核心功能,也涵盖了实际项目中常见的增量索引和数据库集成问题。通过阅读和理解这些源码,你将能够熟练地在自己的项目中应用Lucene,提高搜索功能的效率和准确性。

    【大搜集:lucene学习资料】---<下载不扣分,回帖加1分,欢迎下载,童叟无欺>

    lucene为数据库搜索建立增量索引.txt lucene数据库索引.txt 新闻系统全文检索的思绪.txt lucene学习笔记 1 .txt lucene学习笔记 2.txt lucene学习笔记 3 .txt lucene入门实战.txt Lucene 的学习 .txt ...

    lucene.net实例

    本文将深入探讨如何利用 Lucene.NET 实现全文检索,包括增量索引、更新索引和删除索引等关键操作。 **1. 全文检索基础** 全文检索是通过分析文本中的关键词来查找相关信息的技术。Lucene.NET 提供了一种高效的倒排...

    lucene3.5全文检索案例lucene+demo

    2. 索引构建:使用IndexWriter对象,将Document批量写入索引,支持实时更新和增量索引。 3. 查询解析:QueryParser解析用户输入的查询字符串,生成对应的Query对象。 4. 搜索执行:使用Searcher对象,执行Query...

    lucene索引

    4. **实时性需求**:如果应用需要实时更新索引,需要考虑增量索引和实时搜索的实现,确保新添加的数据能快速被搜索到。 5. **中文处理**:中文的分词难度较大,需要选择合适的分词器,并处理好词性的识别和词语的...

Global site tag (gtag.js) - Google Analytics