如何从 Lucene 5.x 中的字段中获取 n 个第一项?
How to get n first terms from field in Lucene 5.x?
我正在使用 Lucene 作为 Eclipse 插件。目前我像这样迭代我的索引词:
- 我使用 IndexReader.getTermVector(id, field)
得到一个 Terms 实例
- 我使用 TermsEnum 遍历此实例,如下所示:
while ((text = vectorEnum.next()) != null)
现在我还想要获取字段的前n个元素。我认为我必须使用 PostingsEnum 来完成此操作,但我不知道如何使用它。我想我可以通过在 TermsEnum 上调用 postings() 来获取它,但我不知道该怎么做。
编辑:
我猜这是我代码的重要部分:
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());
}
}
}
我正在使用 Lucene 作为 Eclipse 插件。目前我像这样迭代我的索引词:
- 我使用 IndexReader.getTermVector(id, field) 得到一个 Terms 实例
- 我使用 TermsEnum 遍历此实例,如下所示:
while ((text = vectorEnum.next()) != null)
现在我还想要获取字段的前n个元素。我认为我必须使用 PostingsEnum 来完成此操作,但我不知道如何使用它。我想我可以通过在 TermsEnum 上调用 postings() 来获取它,但我不知道该怎么做。
编辑: 我猜这是我代码的重要部分:
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());
}
}
}