Apache Lucene:如何在索引时使用TokenStream手动接受或拒绝令牌

我正在寻找一种方法来编写一个自定义索引与Apache Lucene(PyLucene是准确的,但Java的答案是好的)。

我想要做的是:当向索引添加文档时,Lucene将标记它,删除停用词等。如果我没有弄错,通常使用Analyzer来完成。

我想要实现的是以下内容:在Lucene存储一个给定的术语之前,我想进行查找(比如在一个字典中)来检查是否保留该术语或丢弃它(如果该术语存在于我的字典中,我保留它,否则我放弃它)。

我应该如何继续?

这里是(在Python中)我的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 ???? 

提前感谢您的指导!

编辑1 :挖掘到Lucene的文档后,我觉得它与TokenStreamComponents 。 它返回一个TokenStream,你可以遍历你正在索引的字段的Token列表。

现在有一些与我不明白的Attributes有关。 或者更确切地说,我可以读取令牌,但不知道该如何继续。

编辑2 :我发现这个职位 ,他们提到使用CharTermAttribute 。 然而(尽pipe在Python中)我无法访问或获取CharTermAttribute 。 有什么想法吗 ?

编辑3 :我现在可以访问每个术语,请参阅更新代码片段。 现在剩下要做的是实际存储期望的术语

我试图解决问题的方式是错误的。 这个帖子和femtoRgon的答案是解决方案。

通过定义一个扩展PythonFilteringTokenFilter的过滤器,我可以使用accept()函数accept()例如StopFilter使用的StopFilter )。

这是相应的代码片段:

 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 

然后,只需将过滤器附加到其他过滤器(如在问题的剪切代码中):

 filter = MyFilter(Version.LUCENE_4_10_1, filter)