- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在应用程序中,我收到一个应用过滤器的文本,我想将此过滤结果存储到 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)。但是,该字段的内容为null
。 Field
有一个构造函数,它明确接受 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/
在应用程序中,我收到一个应用过滤器的文本,我想将此过滤结果存储到 lucene Document 对象中。我不关心原文。 String stringToProcess = "..."; TokenSt
我正在开发一个在大型静态 数据存储库中启用索引搜索的应用程序。这不是服务器-客户端应用程序,其中服务器始终处于运行状态,而是每次按需启动的 native 应用程序。 我想对存储库中的文件进行一次索引,
这就是我想做的事情。我在 Elasticsearch 中有一个包含多个文档的索引。在每个文档中,我都有两个字段:deviceField(设备名称)和pressionField(定期按压的值)。我想在索
我们使用 Solr 来存储带有关键字的文档;每个关键字都与文档中的一个范围相关联。 关键字是在将它们加载到 Solr 之前通过一些花哨的分析和/或手动工作生成的。一个关键字可以在文档中重复多次。另一方
我是一名优秀的程序员,十分优秀!