我正在尝试使用pylucene从http://searchhub.org/2010/04/18/refresh-getting-started-with-payloads/实现一个python版本的java。我的分析器在对DelimitedTokenFilter的初始化调用中生成一个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发布于 2014-12-09 13:27:55
jcc的doc表示:
当JCC看到这些特殊的扩展java类时,它会生成实现它们声明的本机方法的C++代码。这些本机方法调用相应的Python方法实现,传入参数并将结果返回给Java VM调用者。
因此,您应该在pylucene中编辑文件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下测试了上面的代码。它工作得很好。
https://stackoverflow.com/questions/13426157
复制相似问题