使用ShingleFilter在PyLucene中构建costomized分析器

时间:2012-04-22 22:31:45

标签: lucene pylucene

我对Lucene和Pylucene很新。当我使用pylucene编写自定义分析器,将文本标记为bigrams时,这是一个问题。

分析器类的代码是:

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

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

提前致谢!

0 个答案:

没有答案