1

pylucene を使用してhttp://searchhub.org/2010/04/18/refresh-getting-started-with-payloads/から Java の Python バージョンを実装しようとしています。私のアナライザーは、DelimitedTokenFilter への init 呼び出しで lucene.InvalidArgsError を生成しています

クラスは以下のとおりです。どんな助けも大歓迎です。pylucene 3.6 ビルドの JAR ファイルでコンパイルされた Java バージョンは正常に動作します。

import lucene
class PayloadAnalyzer(lucene.PythonAnalyzer):
    encoder = None
    def __init__(self, encoder): 
        lucene.PythonAnalyzer.__init__(self) 
        self.encoder = encoder

    def tokenStream(self, fieldName, reader):
        result = lucene.WhitespaceTokenizer( lucene.Version.LUCENE_CURRENT, reader )
        result = lucene.LowerCaseFilter( lucene.Version.LUCENE_CURRENT, result )
        result = lucene.DelimitedPayloadTokenFilter( result, '|', self.encoder )
        return result
4

1 に答える 1

0

jccのドキュメントには次のように書かれています。

JCC は、これらの特別な拡張 Java クラスを検出すると、それらが宣言するネイティブ メソッドを実装する C++ コードを生成します。これらのネイティブ メソッドは、対応する Python メソッド実装を呼び出してパラメーターを渡し、結果を Java VM 呼び出し元に返します。

java/org/apache/pylucene/search/similarities/PythonDefaultSimilarity.javaしたがって、ピルセンでファイルを編集する必要があります。

次のようなコードを追加します。

import org.apache.lucene.util.BytesRef;
public native float scorePayload(int docId, int start, int end, BytesRef payload);

この後、コードでメソッドをオーバーライドできますscorePayload

class PayloadSimilarity(PythonDefaultSimilarity):

    def scorePayload(self, docId, start, end, payload):
        return PayloadHelper.decodeFloat(payload.bytes, end)


class PayloadAnalyzer(PythonAnalyzer):
    encoder = None

    def __init__(self, encoder):
        super(PayloadAnalyzer, self).__init__()
        self.encoder = encoder

    def createComponents(self, fieldName, reader):
        source = WhitespaceTokenizer(Version.LUCENE_44, reader)
        result = LowerCaseFilter(Version.LUCENE_44, source)
        result = DelimitedPayloadTokenFilter(result, u'|', self.encoder)
        return self.TokenStreamComponents(source, result)

上記のコードを pylucene4.8 でテストします。それは正常に動作します。

于 2014-12-09T05:27:55.370 に答える