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

时间:2017-04-18 20:27:38

标签: java search lucene keyword

我有一个与Lucene(Java + Hibernate + Spring + JSF + Lucene)合作的EDM(电子文档管理/存档)。 处理的文件具有不同的格式:XML,DOCX,JPEG,INDD,PDF等。 所有这些都是在全文索引之后存档的。

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

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

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

但我只是不知道如何查看Lucene索引既没有检测到Lucene对给定关键字的计数发生了变化。

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

感谢名单。

1 个答案:

答案 0 :(得分:0)

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

  1. lucene的条款很难被视为关键词。
  2. 根据索引的大小,此地图会变得非常大。
  3. 根据您的数据,您可能需要手动或通过某种算法(例如最常用的20个术语)选择 n 最佳术语/关键字。

    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());
        }
    }