[java] Apache Lucene: Comment utiliser TokenStream pour accepter ou rejeter manuellement un jeton lors de l'indexation



Answers

Question

Je cherche un moyen d'écrire un index personnalisé avec Apache Lucene (PyLucene pour être précis, mais une réponse Java est bien).

Ce que je voudrais faire est la suivante: Lors de l'ajout d'un document à l'index, Lucene le marquera, supprimera les mots d'arrêt, etc. Ceci est généralement fait avec l' Analyzer si je ne me trompe pas.

Ce que je voudrais mettre en œuvre est le suivant: Avant que Lucene stocke un terme donné, je voudrais effectuer une recherche (disons, dans un dictionnaire) pour vérifier si garder le terme ou le jeter (si le terme est présent dans mon dictionnaire) , Je le garde, sinon je le jette).

Comment dois-je procéder ?

Voici (en Python) mon implémentation personnalisée de l' Analyzer :

class CustomAnalyzer(PythonAnalyzer):

    def createComponents(self, fieldName, reader):

        source = StandardTokenizer(Version.LUCENE_4_10_1, reader)
        filter = StandardFilter(Version.LUCENE_4_10_1, source)
        filter = LowerCaseFilter(Version.LUCENE_4_10_1, filter)
        filter = StopFilter(Version.LUCENE_4_10_1, filter,
                            StopAnalyzer.ENGLISH_STOP_WORDS_SET)

        ts = tokenStream.getTokenStream()
        token = ts.addAttribute(CharTermAttribute.class_)
        offset = ts.addAttribute(OffsetAttribute.class_)

        ts.reset()

         while ts.incrementToken():
           startOffset = offset.startOffset()
           endOffset = offset.endOffset()
           term = token.toString()
           # accept or reject term 

         ts.end()
         ts.close()

           # How to store the terms in the index now ?

         return ????

Merci pour vos conseils à l'avance!

EDIT 1 : Après avoir creusé dans la documentation de Lucene, j'ai pensé que cela avait quelque chose à voir avec les TokenStreamComponents . Il renvoie un TokenStream avec lequel vous pouvez parcourir la liste de jetons du champ que vous indexez.

Maintenant, il y a quelque chose à faire avec les Attributes que je ne comprends pas. Ou plus précisément, je peux lire les jetons, mais je ne sais pas comment procéder après.

EDIT 2 : J'ai trouvé ce post où ils mentionnent l'utilisation de CharTermAttribute . Cependant (en Python cependant) je ne peux pas accéder ou obtenir un CharTermAttribute . Des pensées ?

EDIT3 : Je peux maintenant accéder à chaque terme, voir l'extrait de code de mise à jour. Maintenant, ce qui reste à faire est de stocker les termes désirés ...




Links