`

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技术的增量索引,实现索引的首次创建,动态增删改

    Lucene5学习之增量索引(Zoie)

    NULL 博文链接:https://iamyida.iteye.com/blog/2199848

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

    对数据进行分词,建立索引,增量及全量更新,定时更新

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

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

    lucene全文检索-javademo.rar

    lukeall.jar---双击,然后选择索引文件的位置,就可以看见里面的文件了! hello.java 是对文档的内容检索 ...TeacherIndex 是采用ssh框架的模式对数据库里面的表创建索引、添加增量索引、检索文件操作

    基于lucene搜索引擎的java源码

    这是基于lucene搜索引擎的java源码,里面数据库,包括建立索引,增量索引一应俱全,希望对大家有作用。

    lucene1.0.doc

    1. lucence的出现的原因和目的 2 ...5. lucene可检索的内容 4 6. lucence与网络抓取的结合 4 6.1三种方案 4 6.2采用什么样的的文件存储格式 4 6.3如何使lucence增量更新索引 4 7. lucene索引权重 5

    lucene.net实例

    lucene.net实现全文检索,有网上难以找到的增量索引、更新索引、删除索引实例,五万多条数据,建立索引、查询数据瞬间完成,速度之快难以想象。

    Lucene IndexApplication:使用lucene索引文本文档-开源

    增量索引与批量索引一样快。 Quartz.NET 引擎,用于搜索索引服务的自定义作业调度。 自动和安排 Lucene 搜索索引的构建。 用于记录系统消息的通用日志框架。 您可以为严重和非严重错误和消息配置设置。 排名搜索...

    LUCENE实例

    CreateLucene.java 增量生成索引 CreateLuceneAll.java 全量生成索引 CreateLuceneInter.java 按照时间区间生成索引 里面为参考代码,使用lucene-core-2.9.0.jar

    利用Lucene.NET建立SQL数据库记录索引文件程序C#源代码(包含数据库结构)

    对初学使用dotlucent作站内检索的比较有帮助。 利用dotlucene为网站做的索引文件的应用程序。 数据库源是SQL Server,项目是...应用程序界面可以配置数据库链接,生成报告,定时执行增量索引,对单条索引进行更新操作。

    解密搜索引擎技术实战-Lucene&java;精华版

    用简单的例子介绍了Lucene的最新应用方法,包括完整的搜索实现过程:从完成索引到搜索用户界面的实现。此外还进一步介绍了实现准实时搜索的方法,展示了Solr的用法以及实现分布式搜索服务集群的方法。最后介绍了在...

    1.解密搜索引擎技术实战:Lucene&Java;精华版(第3版)

    本书总结搜索引擎相关理论与实际解决方案,并给出了Java实现,其中利用了流行的开源项目Lucene和Solr,而且还包括...用简单的例子介绍了Lucene的应用方法,包括完整的搜索实现过程:从完成索引到搜索用户界面的实现。

    Lucene.NET v3.0.3 DEMO范例程序(含PanGu分词)

    这是Lucene.NET v3.0.3 DEMO范例程序(含PanGu分词),用C#... 项目中还整理了一个后台任务线程监听范例,可以用作增量索引创建,但这个需要你自行加入相关具体的适合自己的代码…… 对了,这是基于.NET MVC的范例项目。

    基于lucene4.3的知识图谱搜索引擎XunTa(一种用"知识点"来找人的搜人引擎).zip

    在架构上内生地支持增量式实时搜索。  2.除达人搜索外,还提供最新搜索。  3.经过长期测试,性能稳定,速度快 三.布署方法  1. 软件包解压后可看到以下文件目录结构:  xunta_v1.0  |---demo 可直接布署到...

    compass_src

    如果进行增量索引,就要增加一个字段,在数据更新时进行特殊的处理,删除时也不能直接删除数据,要等lucene删完索引它才能删除,这样Lucene对应用就非常不透明了。 三来不支持事务,如果建立索引过程中出现异常,...

    自己动手写搜索引擎(罗刚著).doc

    2.2.3 Lucene 全文检索引擎 15 2.2.4 Nutch网络搜索软件 15 2.2.5 用户界面 17 2.3 商业搜索引擎技术介绍 17 2.3.1 通用搜索 17 2.3.2 垂直搜索 18 2.3.3 站内搜索 19 2.3.4 桌面搜索 21 2.4 本章小结 21 第3章 获得...

    solr 企业搜索引擎教程

    更重要的是,Solr 创建的索引与 Lucene 搜索引擎库完全兼容。 通过对 Solr 进行适当的配置, 某些情况下可能需要进行编码,Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。此 外,很多 Lucene 工具(如 Nutch、...

    Tantivy 是受 Apache Lucene 启发并用 Rust 编写的全文搜索引擎库

    10ms),非常适合命令行工具BM25评分(与Lucene相同)自然查询语言(例如(michael AND jackson) OR "king of pop" )短语查询搜索(例如"michael jackson" )增量索引多线程索引(在我的桌面上索引英文维基百科需要 ...

    jwSearchEngine V1.0.1站内搜索工具 升级版

    3、 新增定时增量索引功能 主要是为那些有自己独立服务器的站长,提供一个方便的制作站内搜索引擎的方法。 本产品完全免费 网址:http://jwsearchengine.sinaapp.com 网站测试地址: http://Jw.9zoe.com 本产品是...

Global site tag (gtag.js) - Google Analytics