如何在ApacheLucene的tokenfilter类中直接访问和更新令牌?

aurhwmvo  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(342)

我正在为elasticsearch编写一个插件,该插件将基于与现有分析器的集成来执行自然语言分析(我认为细节现在不重要)。
我很难理解或者找到lucene应该如何工作的信息。我已经看到有一些像chartermattribute这样的属性以某种方式存储在class->attribute的Map中。我不明白这是怎么回事。如何直接访问当前令牌?
我该如何更新它?哪些属性应该更新?
我需要把字符串传递给我正在集成的分析器,这样我才能得到某种输出。
至少有人能给我指出正确的方向吗?
(准确地说,我正在编写tokenfilter类的子类)

33qvvth1

33qvvth11#

如果要创建 TokenFilter 你需要看一下:
建筑的第一个想法 TokenFilter -这是一个抽象类;子类必须重写 incrementToken() . 还有,里面有几种方法- end() , close() , reset() . 如果要重写超级方法,调用超级方法是非常重要的。
然而,大多数事情都发生在 incrementToken() . 总体架构如下所示,即 incrementToken 你需要调用输入 TokenStream 这是你-得到下一个令牌(让我们想象你的父母) TokenStreamWhitespaceTokenizer )稍后更新令牌属性,以便以后可以访问它们。
大约有10个令牌属性已经存在,很可能您只需要使用它们。让我举几个重要的例子: CharTermAttribute (包含标记文本), PositionIncrementAttribute (设置与上一项的距离,默认为1), PositionLengthAttribute (大多数分析程序都忽略了它,但在nlp处理中,将tokenstreams作为图形可能很有用)以及其他一些分析程序。完整的列表可以像往常一样在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
}

当然,你需要初始化这个 termAtt 在你的课堂上有这样的事情: CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);

相关问题