我可以从ElasticSearch获取所有术语和docId列表吗?

时间:2016-04-26 22:19:02

标签: elasticsearch lucene

如何获取ES中的所有术语和文档列表。例如,反向索引数据如下所示:

word1: doc1,doc5,doc6...
word2: doc3,doc9,doc12...
word3: doc5,doc100...

我只想获得所有条款和对应的文档列表。任何api我都能做到这一点。谢谢!

1 个答案:

答案 0 :(得分:0)

为了检索这一点,您应该了解一下Lucene的运作方式。在Lucene中,索引的结构(如您所知)使用Fields-> Terms-> PostingLists(表示为PostingsEnums)。

要检索这些值,您可以将其用作模板Lucene工具(假设您可以访问基础阅读器 - AtomicReader

// get every one of the fields in the reader
Fields fields = MultiFields.getFields(reader);
for (String field: fields) {
    // get the Terms for the field
    TermsEnum terms = fields.terms(field).iterator(null);

    // a term is represented by a BytesRef in lucene
    // and we will iterate across all of them using
    // the TermsEnum syntax (read lucene docs for this)
    BytesRef t;
    while ((t = terms.next()) != null) {
        // get the PostingsEnum (not that this is called
        // DocsEnum in Lucene 4.X) which represents an enumeration
        // of all of the documents for the Term t
        PostingsEnum docs = terms.postings(null, null);
        String line = String.format("%s: ",t);
        while (docs.nextDoc() != NO_MORE_DOCS) {
            line += String.valueOf(docs.docID());
            line += ", "
        }
        System.out.println(line);
    }
}

我实际上没有机会完全按原样运行此代码(我有一个类似的工具,我已经为Lucene的特定分支编写了比较索引),但希望这能给你一般了解Lucene的结构,以便您可以编写自己的工具。

棘手的部分是从索引中获取显式AtomicReader - 但我确定还有其他StackOverflow答案可以帮助您解决这个问题! (作为一点提示,您可能希望查看使用DirectoryReader#open(File f)#leaves()

打开索引