2012-11-16 1 views
1

J'essaye d'implémenter une version de python du java de http://searchhub.org/2010/04/18/refresh-getting-started-with-payloads/ using pylucene. Mon analyseur est en train de produire une lucene.InvalidArgsError sur l'appel init au DelimitedTokenFilterDelimitedPayloadFilter dans PyLucene?

La classe est ci-dessous, et toute aide est grandement appréciée. La version java compilée avec les fichiers JAR de la version 3.6 de pylucene fonctionne correctement.

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 
+0

Mon problème initial avec les arguments est résolu si j'utilise le délimiteur par défaut à la place de '|': lucene.DelimitedTokenFilter.DEFAULT_DELIMITER. Cela ne semble pas résoudre mon problème. tout compile mais la charge utile revient toujours à 1.0. –

Répondre

0

Le doc de jcc dit:

Lorsque JCC voit ces classes java extension spéciale génère le code C++ mise en œuvre des méthodes natives qu'ils déclarent. Ces méthodes natives appellent les implémentations de méthode Python correspondantes en transmettant dans les paramètres et en renvoyant le résultat à l'appelant VM Java.

Vous devriez donc éditer le fichier java/org/apache/pylucene/search/similarities/PythonDefaultSimilarity.java dans pylucene.

Ajouter un code comme ceci:

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

Après cela, votre code peut remplacer la méthode 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) 

Je teste le code ci-dessus sous pylucene4.8. Ça fonctionne bien.

Questions connexes