簡體   English   中英

如何從Lucene 5.x的字段中獲取n個第一項?

[英]How to get n first terms from field in Lucene 5.x?

我正在將Lucene用於Eclipse插件。 目前,我對索引的術語進行如下迭代:

  1. 我使用IndexReader.getTermVector(id,field)獲得一個Terms實例
  2. 我像這樣使用TermsEnum遍歷此實例: while ((text = vectorEnum.next()) != null)

現在,我還需要獲取字段的前n個元素。 我認為必須使用PostingsEnum來完成此操作,但我不知道如何使用它。 我想我可以通過在我的TermsEnum上調用postsing ()來獲得它,但是我不知道該怎么做。

編輯:那是我的代碼的重要部分,我猜:

Terms vector = indexReader.getTermVector(id, field);
BytesRef text = null; 
if (vector != null) {
                TermsEnum vectorEnum = vector.iterator();
                while ((text = vectorEnum.next()) != null) {
                    String term = text.utf8ToString();
                    [do stuff]
                }

這就是FieldType:

FieldType fieldType = new FieldType();
fieldType.setIndexOptions(IndexOptions.DOCS_AND_FREQS_AND_POSITIONS);
fieldType.setStored(true);
fieldType.setStoreTermVectors(true);
fieldType.setTokenized(true);

不知道為什么,但是使用setIndexOptions請求職位似乎不起作用,因此您必須顯式設置setStoreTermVectorPositions。 您仍然必須將索引選項設置為NONE以外的其他值,但是似乎沒有必要使用DOCS_AND_FREQS_AND_POSITIONS,即

fieldType.setIndexOptions(IndexOptions.DOCS);
fieldType.setStoreTermVectorPositions(true);

然后您可以訪問以下職位:

Terms vector = indexReader.getTermVector(id, field);
if (vector != null) {
    TermsEnum vectorEnum = vector.iterator();
    BytesRef text;
    while ((text = vectorEnum.next()) != null) {
        String term = text.utf8ToString();
        PostingsEnum postings = vectorEnum.postings(null, PostingsEnum.POSITIONS);
        while (postings.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
            int freq = postings.freq();
            while (freq-- > 0)
                logger.info("Position: {}", postings.nextPosition());
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM