gpt4 book ai didi

java |卢森| TokenStream 字段无法存储

转载 作者:行者123 更新时间:2023-11-30 02:20:04 25 4
gpt4 key购买 nike

在应用程序中,我收到一个应用过滤器的文本,我想将此过滤结果存储到 lucene Document 对象中。我不关心原文。

String stringToProcess = "...";
TokenStream stream = analyzer.tokenStream(null, new StringReader(stringToProcess));
TokenStream procStream = new CustomFilter(stream, opts);

Document luceneDocument = new Document();
FieldType ft = new FieldType(TextField.TYPE_STORED);
ft.setOmitNorms(false);
ft.setStoreTermVectors(true);
luceneDocument.add(new Field("content", procStream, ft));

这会抛出:

Exception in thread "main" java.lang.IllegalArgumentException: TokenStream fields cannot be stored

如果我将 TextField.TYPE_STORED 更改为 TYPE_NOT_STORED 也不异常(exception)。但是,该字段的内容为nullField 有一个构造函数,它明确接受 TokenStream 对象。

我可以使用 .incrementToken().getAttribute(ChatTermAttribute.class)procStream 中手动提取 token 。

我的问题:如何将 TokenStream 传递给 Field 对象?

最佳答案

您不能只传入 TokenStream 并存储该字段。

TokenStream 是经过分析、可索引的标记流。字段存储的内容是预分析字符串。您没有将该字符串提供给该字段,因此它没有任何适合存储的内容,因此出现异常。

相反,更典型的做法是在 IndexWriterConfig 中设置 Analyzer,并让它为您分析字段。我猜你这样做而不是让 IndexWriter 处理它的原因是因为你想将 CustomFilter 添加到开箱即用的分析器中。相反,只需创建您自己的自定义分析器即可。分析仪很容易。只需复制您要使用的分析器的源代码,并将自定义过滤器添加到 createComponents 中的链中即可。假设您使用StandardAnalyzer,那么您将复制的incrementToken方法更改为如下所示:

@Override
protected TokenStreamComponents createComponents(final String fieldName) {
final StandardTokenizer src = new StandardTokenizer();
src.setMaxTokenLength(maxTokenLength);
TokenStream tok = new StandardFilter(src);
tok = new LowerCaseFilter(tok);
tok = new StopFilter(tok, stopwords);
tok = new CustomFilter(tok, opts); //Just adding this line
return new TokenStreamComponents(src, tok) {
@Override
protected void setReader(final Reader reader) {
src.setMaxTokenLength(StandardAnalyzer.this.maxTokenLength);
super.setReader(reader);
}
};
}

然后您可以创建您的字段,如下所示:

new Field("content", stringToProcess, ft);
<小时/>

好吧,所以我假设这有点像 XY problem 。需要注意的是,创建自定义分析器非常可能是更好的解决方案,您实际上可以将 TokenStream 传递到 Field 并存储它,您只需要提供要存储的字符串以及 token 流。看起来像这样:

Field myField = new Field("content", stringToProcess, ft);
myField.setContentStream(procStream);

关于 java |卢森| TokenStream 字段无法存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47133482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com