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




tutorial solr (2)

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 ...


Answers

La façon dont j'essayais de résoudre le problème était erronée. Ce post et la réponse de FemtoRgon étaient la solution.

En définissant un filtre qui étend PythonFilteringTokenFilter , je peux utiliser la fonction accept() (comme celle utilisée dans le StopFilter par exemple).

Voici l'extrait de code correspondant:

class MyFilter(PythonFilteringTokenFilter):

  def __init__(self, version, tokenStream):
    super(MyFilter, self).__init__(version, tokenStream)
    self.termAtt = self.addAttribute(CharTermAttribute.class_)


  def accept(self):
    term = self.termAtt.toString()
    accepted = False
    # Do whatever is needed with the term
    # accepted = ... (True/False)
    return accepted

Ensuite, ajoutez le filtre aux autres filtres (comme dans le code extrait de la question):

filter = MyFilter(Version.LUCENE_4_10_1, filter)

De votre course de shell:

pip2 install unicodecsv

Et (contrairement à la question initiale) en supposant que vous utilisez le module csv intégré de Python, tournez
import csv dans
import unicodecsv as csv dans votre code.





java python apache indexing lucene