我对 Lucene 和 Pylucene 很陌生。当我使用 pylucene 编写自定义分析器以将文本标记为二元组时,这是一个问题。
分析器类的代码是:
class BiGramShingleAnalyzer(PythonAnalyzer):
def __init__(self, outputUnigrams=False):
PythonAnalyzer.__init__(self)
self.outputUnigrams = outputUnigrams
def tokenStream(self, field, reader):
result = ShingleFilter(LowerCaseTokenizer(Version.LUCENE_35,reader))
result.setOutputUnigrams(self.outputUnigrams)
#print 'result is', result
return result
我在 LowerCaseTokeinizer 生成的 TokenStream 上使用了 ShingleFilter。当我直接调用 tokenStream 函数时,它可以正常工作:
str = ‘divide this sentence'
bi = BiGramShingleAnalyzer(False)
sf = bi.tokenStream('f', StringReader(str))
while sf.incrementToken():
print sf
(divide this,startOffset=0,endOffset=11,positionIncrement=1,type=shingle)
(this sentence,startOffset=7,endOffset=20,positionIncrement=1,type=shingle)
但是当我尝试使用此分析器构建查询解析器时,出现了问题:
parser = QueryParser(Version.LUCENE_35, 'f', bi)
query = parser.parse(str)
在查询中什么都没有。
在 tokenStream 函数中添加 print 语句后,我发现当我调用 parser.parse(str) 时,tokenStream 中的 print 语句实际上被调用了 3 次(我的 str 变量中的 3 个单词)。在我看来,解析器对我传递给它的 str 进行了预处理,并在预处理结果上调用了 tokenStream 函数。
关于如何使分析器工作的任何想法,以便当我将它传递给查询解析器时,解析器可以将字符串解析为二元组?
提前致谢!