2

我对 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 函数。

关于如何使分析器工作的任何想法,以便当我将它传递给查询解析器时,解析器可以将字符串解析为二元组?

提前致谢!

4

0 回答 0