如何在Apache Lucene的TokenFilter类中直接访问和更新令牌?

时间:2018-12-24 11:43:30

标签: elasticsearch plugins lucene

我正在编写一个用于Elasticsearch的插件,该插件将基于与现有分析器的集成来执行自然语言分析(我想现在这些细节是无关紧要的)。

我在理解或寻找有关应该如何使用Lucene的信息时遇到了很多麻烦。我已经看到有像CharTermAttribute这样的属性,它们以某种方式存储在Class-> Attribute的映射中。我不知道这应该如何工作。如何直接访问当前令牌?

该如何更新?应更新哪些属性?

我需要将字符串传递给正在集成的分析器,以便获得某种输出。

至少有人能指出我正确的方向吗?

(确切地说,我正在编写TokenFilter类的子类)

1 个答案:

答案 0 :(得分:0)

如果要创建TokenFilter的子类,则需要查看它:

TokenFilter架构的第一个想法-这是一个抽象类;子类必须覆盖incrementToken()。另外,其中有几种方法-end()close()reset()。如果您要覆盖它们,则调用超级方法非常重要。

但是,大多数事情发生在incrementToken()中。总体架构如下:在您的incrementToken中,您需要调用即将到来的输入TokenStream-以获取下一个令牌(假设您的父母TokenStreamWhitespaceTokenizer )和更新的令牌属性,以便以后可以访问。

大约有10个令牌属性已经存在,很可能您只需要使用它们。让我列举几个重要的例子:CharTermAttribute(包含令牌文本),PositionIncrementAttribute(设置与上一项的距离,默认为1),PositionLengthAttribute(大多数分析器忽略它,但是在NLP处理中实际上将TokenStreams作为图可能有用,还有其他一些。完整列表可以像往常一样在source code of Lucene中找到。

通常,在调用incrementToken()之后,您将从上一个TokenStream获取令牌文本并对其进行一些操作。

我可以想象一些与NLP分析相关的代码看起来像这样:

if (!input.incrementToken()) {
    return false; // no more tokens left
} else {
    final CharTermAttribute attribute = input.getAttribute(CharTermAttribute.class); //getting token text from the previous TokenStream
    final String result = doNLP(attribute.toString()); // invoking your NLP analysis on token text
    termAtt.copyBuffer(result , 0, suffix.length()); // storing output result of your NLP analysis in the CharTermAttribute  that you have in your TokenStream, so later indexing pipeline could use it
}

当然,您需要在类中使用以下内容初始化此termAttCharTermAttribute termAtt = addAttribute(CharTermAttribute.class);