java - 如何访问Lucene索引中记录的关键字?

标签 java search lucene keyword

我有一个使用 Lucene (Java + Hibernate + Spring + JSF + Lucene) 的 EDM(电子文档管理/归档)。 处理的文件有不同的格式:XML、DOCX、JPEG、INDD、PDF 等。 所有内容均在全文索引后存档。

搜索可以通过网页完成:用户填写关键字,Lucene + Hibernate 显示所有已索引的包含这些关键字的文档。

我想要的是知道Lucene索引的所有关键字,以便用户可以订阅他们感兴趣的关键字。

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

但我只是不知道如何查找 Lucene 索引,也不知道如何检测给定关键字的 Lucene 计数是否已更改。

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

谢谢。

最佳答案

您可以构建一个包含索引中所有术语的映射,映射到它们出现的文档数量。但请注意

  1. lucene 的术语很难被视为关键字。
  2. 这张 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/

相关文章:

java - Java 中的 MP4 容器编写器

java - 用于在 char 'x' 之前选择最多 char before char 'y' 的正则表达式

MySQL 表列具有英文值或阿拉伯语值

android - 如何实现对使用 ListAdapater、ArrayList 和 HashMap 的 ListView 的搜索

algorithm - 状态空间搜索 : A* and Breadth First Search

xml - 使用搜索引擎作为键值存储有哪些优点和缺点?

java - 字符串和 StringBuffer

java - 为 2D 对象列表赋值时出现 NullPointerException

java - Solr 不会覆盖 - 重复的 uniqueKey 条目

lucene - 是否可以通过匹配术语来订购 lucene 文档?