java - Apache Lucene: cómo usar TokenStream para aceptar o rechazar manualmente un token al indexar
python indexing (1)
Estoy buscando una forma de escribir un índice personalizado con Apache Lucene (PyLucene para ser preciso, pero una respuesta de Java está bien).
Lo que me gustaría hacer es lo siguiente: al agregar un documento al índice, Lucene lo convertirá en token, eliminará las palabras de finalización, etc. Esto generalmente se hace con el Analyzer
si no me equivoco.
Lo que me gustaría implementar es lo siguiente: antes de que Lucene almacene un término determinado, me gustaría realizar una búsqueda (por ejemplo, en un diccionario) para verificar si se conserva el término o si se descarta (si el término está presente en mi diccionario). , Lo conservo, de lo contrario lo descarto).
Cómo debo proceder ?
Aquí está (en Python) mi implementación personalizada del 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 ????
¡Gracias por su guía con anticipación!
EDIT 1 : Después de buscar en la documentación de Lucene, pensé que tenía algo que ver con los TokenStreamComponents
. Devuelve un TokenStream con el que puede iterar a través de la lista de tokens del campo que está indexando.
Ahora hay algo que ver con los Attributes
que no entiendo. O más precisamente, puedo leer los tokens, pero no tengo idea de cómo debo proceder después.
EDIT 2 : Encontré esta publicación donde mencionan el uso de CharTermAttribute
. Sin embargo (en Python) no puedo acceder ni obtener un CharTermAttribute
. Alguna idea ?
EDIT3 : ahora puedo acceder a cada término, ver el fragmento de código de actualización. Ahora lo que queda por hacer es almacenar los términos deseados ...
La forma en que estaba tratando de resolver el problema estaba mal. Este post y la respuesta de femtoRgon fueron la solución.
Al definir un filtro que amplía PythonFilteringTokenFilter
, puedo hacer uso de la función accept()
(como la que se usa en StopFilter
por ejemplo).
Aquí está el fragmento de código correspondiente:
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
A continuación, agregue el filtro a los otros filtros (como en el código eliminado de la pregunta):
filter = MyFilter(Version.LUCENE_4_10_1, filter)