2017-04-18 54 views
1

我有一个使用Lucene(Java + Hibernate + Spring + JSF + Lucene)的EDM(电子文档管理/归档)。 处理的文件具有不同的格式:XML,DOCX,JPEG,INDD,PDF等。 全文归档后都会被归档。如何访问记录在Lucene索引中的关键字?

搜索可以完成得益于一个网页:用户填写关键字和Lucene + Hibernate显示已被索引的所有文档包含这些关键字。

我想什么是知道的Lucene的,以使可能的用户订阅了他们感兴趣的关键字索引的所有关键字。

实际上,如果用户想知道所有的文件“法国“关键字,他必须在网页上进行搜索。 我想要的是订阅“法国”关键字的用户,当具有此关键字的文档将被索引时,用户将收到一条通知,告诉他哪些文档包含他订阅的关键字。

但我只是不知道如何查找Lucene索引既不能检测到给定关键字的Lucene计数已经改变。

有人可以告诉我该怎么做吗?

Thanx。

+0

每次运行索引过程时,重新搜索所有订阅的关键字不是更容易吗? –

回答

0

你可以建立包含在索引中,映射到它们出现在文件的数量所有条款的地图。不过要小心的是

  1. 这Lucene的条件很难被认为是关键字。
  2. 根据索引的大小,该映射将变得相当大。

根据您的资料,您可能需要选择ñ最好的条件/关键字,手动或通过某种算法(例如20页最常见的术语)。

IndexReader reader = ..... // Open your index 

// Create a new HashMap, mapping Terms to doc frequency 
Map<String,Integer> allTerms = new HashMap<String,Integer>(); 

// Iterate over all fields of your documents 
Fields fields = MultiFields.getFields(reader); 
for (String field : fields) { 
    Terms terms = fields.terms(field); 
    TermsEnum termsEnum = terms.iterator(); 

    // Iterate over all terms for the current field 
    for(BytesRef br = termsEnum.next(); br != null; br = termsEnum.next()) { 
     // Put the term and the number of occurrences into the map. 
     allTerms.put(br.utf8ToString(), termsEnum.docFreq()); 
    } 
} 
+0

谢谢你@ philipp-ludwig 我还没有测试过它(在法国很晚很安静),但发现一种方法来质疑字典是非常有趣的。 我知道所有的术语都不是“可读的”,因为它们是词组/记号。 – Lovegiver

+0

我必须找到一种方法来选择最不相关最常见的那些! 仍然有一件困难的事情是检测字典本身的变化。当字典添加到字典中时,是否有办法触发警报?我们如何看到某些变化? – Lovegiver

+0

那么,添加文档后,您可能需要重新生成地图,然后检查旧版本和新版本之间的差异。 –