2010-01-06 34 views
3

我想在pylucene中編寫自定義分析器。 通常在java lucene中,當你編寫一個分析器類時,你的類繼承了lucene的Analyzer類。使用jcc在pylucene/inheritance中編寫自定義anaylzer?

但是pylucene使用jcc,java把C++/python編譯器。

那麼如何讓一個python類從java類繼承使用jcc,尤其是如何編寫一個自定義的pylucene分析器呢?

謝謝。

+0

你錯過了一個單詞。 「特別是」什麼? – jcdyer 2010-01-06 12:39:17

回答

0

您可以從任何pylucene類繼承,但名稱以Python的啓動者也將extend the underlying Java class,即,使相關方法「虛擬」從Java代碼調用時。所以在定製分析儀的情況下,從繼承PythonAnalyzer並實施tokenStream方法。

+0

任何「祕密」,使這項工作?我已經嘗試從'PythonAnalyzer'和'ReusableAnalyzerBase'繼承,並且在創建查詢分析器實例時都生成無效的args異常 – Justin 2011-12-08 17:31:53

1

下面是一個包裝EdgeNGram濾波器的分析器的示例。

import lucene 
class EdgeNGramAnalyzer(lucene.PythonAnalyzer): 
    ''' 
    This is an example of a custom Analyzer (in this case an edge-n-gram analyzer) 
    EdgeNGram Analyzers are good for type-ahead 
    ''' 

    def __init__(self, side, minlength, maxlength): 
     ''' 
     Args: 
      side[enum] Can be one of lucene.EdgeNGramTokenFilter.Side.FRONT or lucene.EdgeNGramTokenFilter.Side.BACK 
      minlength[int] 
      maxlength[int] 
     ''' 
     lucene.PythonAnalyzer.__init__(self) 
     self.side = side 
     self.minlength = minlength 
     self.maxlength = maxlength 

    def tokenStream(self, fieldName, reader): 
     result = lucene.LowerCaseTokenizer(Version.LUCENE_CURRENT, reader) 
     result = lucene.StandardFilter(result) 
     result = lucene.StopFilter(True, result, StopAnalyzer.ENGLISH_STOP_WORDS_SET) 
     result = lucene.ASCIIFoldingFilter(result) 
     result = lucene.EdgeNGramTokenFilter(result, self.side, self.minlength, self.maxlength) 
     return result