我对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函数。
关于如何使分析器工作的任何想法,以便当我将它传递给查询解析器时,解析器可以将字符串解析为双字母组合?
提前致谢!