如何解决我可以将字符串中的字段值获取到 Apache Solr 中的自定义 TokenFilter 中吗?
我需要编写一个自定义的 LemmaTokenFilter,它用词形还原(基本)形式替换和索引单词。问题是,我从外部 API 获取基本表单,这意味着我需要调用 API、发送文本、解析响应并将其作为 list_of_fonts = []
发送到我的 LemmaTokenFilter。该地图包含成对的 Map<String,String>
。但是,我不知道如何访问由 TokenFilters 处理的文本字段的完整值。
一个想法是当 LemmaTokenFilterFactory 创建 LemmaTokenFilter 时,一个一个地通过 tokenStream,但是我需要注意不要编辑 tokenStream 中的任何内容,以某种方式重置当前令牌(因为我需要对其调用 <originalWord,baseFormOfWord>
方法以获取所有标记),但最重要的是这似乎是不必要的,因为字段值已经在某处,我不想花时间尝试从标记中重新组合它.这种实现可能太慢了。
另一个想法是单独处理每个令牌,但是只用一个词调用外部 API 然后解析响应肯定效率太低。
我发现了一些关于使用 ResourceLoaderAware 接口的信息,但是我真的不明白如何利用它来发挥我的优势。我可能可以在每次索引之前将地图保存在文本文件中,但是在每次文档索引之前写入文件、打开和读取它似乎也太慢了。
所以最好的方法是将字段的值作为字符串传递给 LemmaTokenFilter 的构造函数,但是我不知道如何从 LemmaTokenFilterFactory 的 .increment()
方法访问它。>
我在谷歌上找不到任何帮助,所以欢迎提出任何想法。
这是我目前所拥有的:
create()
public final class LemmaTokenFilter extends TokenFilter {
private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class);
private Map<String,String> lemmaMap;
protected LemmaTokenFilter(TokenStream input,Map<String,String> lemmaMap) {
super(input);
this.lemmaMap = lemmaMap;
}
@Override
public boolean incrementToken() throws IOException {
if (input.incrementToken()) {
String term = termAtt.toString();
String lemma;
if ((lemma = lemmaMap.get(term)) != null) {
termAtt.setEmpty();
termAtt.copyBuffer(lemma.toCharArray(),lemma.length());
}
return true;
} else {
return false;
}
}
}
解决方法
1.基于 API 的方法: 您可以使用顶部的自定义词形还原器创建分析链。设计这个lemmatizer,我猜你可以看看Keyword Tokenizer的实现; 这样您就可以读取输入中的所有内容,然后调用您的 API; 替换输入文本中 API 响应中的所有令牌; 之后在分析链中,使用标准或空白标记器对您的数据进行标记。
2.基于文件的方法 它将遵循所有相同的步骤,除了从定义 TokenStream
时提到的文件中调用它可以使用哈希映射的 API现在来到 ResourceLoaderAware: 当您需要指示您的 Tokenstream 资源已更改时,需要使用 inform 方法来处理该问题。作为参考,您可以查看StemmerOverrideFilter
- Keyword Tokenizer:将整个输入作为单个标记发出。
所以我想我找到了答案,或者实际上是两个答案。
一种方式是编写我的客户端应用程序,首先处理传入的请求 - 字段值被发送到外部 API 并将响应存储到某个全局变量中,然后可以从自定义 TokenFilters 访问.
另一种方法是使用自定义 UpdateRequestProcessors,它允许我们修改传入文档的内容,调用外部 API 并再次保存响应,以便可以从自定义 TokenFilters 以某种方式全局访问它。 Here Erik Hatcher 谈到了 ScriptUpdateProcessor 的使用,我相信它也适用于我的情况。
希望这对遇到类似问题的人有所帮助,因为我很难找到解决方案(在 SO 上找不到任何类似的线程)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。