如何获取ES中的所有术语和文档列表。例如,反向索引数据如下所示:
word1: doc1,doc5,doc6...
word2: doc3,doc9,doc12...
word3: doc5,doc100...
我只想获得所有条款和对应的文档列表。任何api我都能做到这一点。谢谢!
答案 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()
)