在Lucene(PyLucene)中查找单个字段的术语

3 投票
1 回答
2362 浏览
提问于 2025-04-17 12:05

我对Lucene的术语向量还比较陌生,想确保我的术语收集尽可能高效。 我正在获取唯一的术语,然后检索该术语的docFreq()来进行分面分析。

我使用以下方法从索引中收集所有文档的术语:

lindex = SimpleFSDirectory(File(indexdir))
ireader = IndexReader.open(lindex, True)
terms = ireader.terms() #Returns TermEnum

这个方法效果不错,但有没有办法只返回特定字段的术语(在所有文档中)——这样不是更高效吗?

比如:

 ireader.terms(Field="country")

1 个回答

3

IndexReader.terms() 方法可以接受一个可选的 Field() 对象。Field 对象由两个部分组成,一个是字段名称,另一个是值,Lucene 称之为“术语字段”和“术语文本”。

如果我们提供一个 Field 参数,并且将“术语文本”的值留空,就可以从我们关心的术语开始进行术语迭代。

lindex = SimpleFSDirectory(File(indexdir))
ireader = IndexReader.open(lindex, True)
# Query the lucene index for the terms starting at a term named "field_name"
terms = ireader.terms(Term("field_name", "")) #Start at the field "field_name"
facets = {'other': 0}
while terms.next():
    if terms.term().field() != "field_name":  #We've got every value
        break
    print "Field Name:", terms.term().field()
    print "Field Value:", terms.term().text()
    print "Matching Docs:", int(ireader.docFreq(term))

希望其他想要了解如何在 PyLucene 中进行分面搜索的人能看到这篇帖子。关键在于按原样索引术语。为了完整起见,这里是字段值应该如何被索引的。

dir = SimpleFSDirectory(File(indexdir))
analyzer = StandardAnalyzer(Version.LUCENE_30)
writer = IndexWriter(dir, analyzer, True, IndexWriter.MaxFieldLength(512))
print "Currently there are %d documents in the index..." % writer.numDocs()
print "Adding %s Documents to Index..." % docs.count()
for val in terms:
    doc = Document()
    #Store the field, as-is, with term-vectors.
    doc.add(Field("field_name", val, Field.Store.YES, Field.Index.NOT_ANALYZED, Field.TermVector.YES))
    writer.addDocument(doc)

writer.optimize()
writer.close()

撰写回答