【问题标题】:How to access keywords recorded in a Lucene index?如何访问记录在 Lucene 索引中的关键字?
【发布时间】:2017-09-14 20:23:03
【问题描述】:

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

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

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

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

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

谁能告诉我该怎么做?

谢谢。

【问题讨论】:

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

标签: java search lucene keyword


【解决方案1】:

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

  1. 那个lucene的词几乎不能算关键字。
  2. 此地图会变得非常大,具体取决于您的索引的大小。

根据您的数据,您可能需要手动或通过某种算法(例如 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());
    }
}

【讨论】:

  • 谢谢@philipp-ludwig 我还没有测试它(法国很晚才安静)但是发现一种质疑字典的方法非常有趣。我理解所有术语都不是“可读”的,因为它们是标记/词块。
  • 我必须找到一种方法来选择最相关但不是最常见的那些!仍然困难的一件事是检测字典本身的变化。有没有办法在字典中添加单词时触发警报?我们怎样才能看到发生了变化?
  • 好吧,您可能需要在添加文档并检查新旧版本之间的任何差异后再次重新构建地图。
猜你喜欢
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2013-11-13
  • 2011-05-05
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 2014-02-16
相关资源
最近更新 更多