我正在为elasticsearch编写一个插件,该插件将基于与现有分析器的集成来执行自然语言分析(我认为细节现在不重要)。
我很难理解或者找到lucene应该如何工作的信息。我已经看到有一些像chartermattribute这样的属性以某种方式存储在class->attribute的Map中。我不明白这是怎么回事。如何直接访问当前令牌?
我该如何更新它?哪些属性应该更新?
我需要把字符串传递给我正在集成的分析器,这样我才能得到某种输出。
至少有人能给我指出正确的方向吗?
(准确地说,我正在编写tokenfilter类的子类)
1条答案
按热度按时间33qvvth11#
如果要创建
TokenFilter
你需要看一下:建筑的第一个想法
TokenFilter
-这是一个抽象类;子类必须重写incrementToken()
. 还有,里面有几种方法-end()
,close()
,reset()
. 如果要重写超级方法,调用超级方法是非常重要的。然而,大多数事情都发生在
incrementToken()
. 总体架构如下所示,即incrementToken
你需要调用输入TokenStream
这是你-得到下一个令牌(让我们想象你的父母)TokenStream
是WhitespaceTokenizer
)稍后更新令牌属性,以便以后可以访问它们。大约有10个令牌属性已经存在,很可能您只需要使用它们。让我举几个重要的例子:
CharTermAttribute
(包含标记文本),PositionIncrementAttribute
(设置与上一项的距离,默认为1),PositionLengthAttribute
(大多数分析程序都忽略了它,但在nlp处理中,将tokenstreams作为图形可能很有用)以及其他一些分析程序。完整的列表可以像往常一样在lucene的源代码中找到。通常,在你调用
incrementToken()
你收到了上一封邮件的令牌文本TokenStream
用它做一些操作。我可以想象一些与nlp分析相关的代码可能是这样的:
当然,你需要初始化这个
termAtt
在你的课堂上有这样的事情:CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);