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在pylucene中编辑文件。

添加一些这样的代码:

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 回答