我有一个使用 Lucene (Java + Hibernate + Spring + JSF + Lucene) 的 EDM(电子文档管理/归档)。 处理的文件有不同的格式:XML、DOCX、JPEG、INDD、PDF 等。 所有内容均在全文索引后存档。
搜索可以通过网页完成:用户填写关键字,Lucene + Hibernate 显示所有已索引的包含这些关键字的文档。
我想要的是知道Lucene索引的所有关键字,以便用户可以订阅他们感兴趣的关键字。
实际上,如果用户想要了解所有带有“法国”关键字的文档,他必须在网页上进行搜索。 我想要的是用户订阅“法国”关键字,当带有此关键字的文档被索引时,用户将收到一条通知,告诉他哪些文档包含他所订阅的关键字。
但我只是不知道如何查找 Lucene 索引,也不知道如何检测给定关键字的 Lucene 计数是否已更改。
有人可以告诉我该怎么做吗?
谢谢。
最佳答案
您可以构建一个包含索引中所有术语的映射,映射到它们出现的文档数量。但请注意
- lucene 的术语很难被视为关键字。
- 这张 map 会变得相当大,具体取决于索引的大小。
根据您的数据,您可能需要手动或通过某种算法选择 n 个最佳术语/关键字(例如 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());
}
}
关于java - 如何访问Lucene索引中记录的关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43481603/