Using Lucene Analyzer Without Indexing - Is My Approach Reasonable?(在没有索引的情况下使用 Lucene Analyzer - 我的方法合理吗?)
问题描述
我的目标是利用 Lucene 的许多标记器和过滤器来转换输入文本,但不创建任何索引.
My objective is to leverage some of Lucene's many tokenizers and filters to transform input text, but without the creation of any indexes.
例如,给定这个(人为的)输入字符串...
For example, given this (contrived) input string...
" 某人的 - [texté] 在这里,foo ."
...还有像这样的 Lucene 分析器...
...and a Lucene analyzer like this...
Analyzer analyzer = CustomAnalyzer.builder()
.withTokenizer("icu")
.addTokenFilter("lowercase")
.addTokenFilter("icuFolding")
.build();
我想得到以下输出:
某人的文本在这里 foo
下面的 Java 方法可以满足我的需求.
The below Java method does what I want.
但有没有更好(即更典型和/或更简洁)的方式让我这样做?
我特别想的是我使用 TokenStream
和 CharTermAttribute
的方式,因为我以前从未像这样使用过它们.感觉很笨重.
I am specifically thinking about the way I have used TokenStream
and CharTermAttribute
, since I have never used them like this before. Feels clunky.
代码如下:
Lucene 8.3.0 导入:
Lucene 8.3.0 imports:
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.analysis.custom.CustomAnalyzer;
我的方法:
private String transform(String input) throws IOException {
Analyzer analyzer = CustomAnalyzer.builder()
.withTokenizer("icu")
.addTokenFilter("lowercase")
.addTokenFilter("icuFolding")
.build();
TokenStream ts = analyzer.tokenStream("myField", new StringReader(input));
CharTermAttribute charTermAtt = ts.addAttribute(CharTermAttribute.class);
StringBuilder sb = new StringBuilder();
try {
ts.reset();
while (ts.incrementToken()) {
sb.append(charTermAtt.toString()).append(" ");
}
ts.end();
} finally {
ts.close();
}
return sb.toString().trim();
}
推荐答案
我已经使用这个设置几个星期了,没有问题.我还没有找到更简洁的方法.我认为问题中的代码是可以的.
I have been using this set-up for a few weeks without issue. I have not found a more concise approach. I think the code in the question is OK.
这篇关于在没有索引的情况下使用 Lucene Analyzer - 我的方法合理吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在没有索引的情况下使用 Lucene Analyzer - 我的方法合理吗?
- Eclipse 插件更新错误日志在哪里? 2022-01-01
- value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
- Jersey REST 客户端:发布多部分数据 2022-01-01
- Java包名称中单词分隔符的约定是什么? 2022-01-01
- Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
- 从 finally 块返回时 Java 的奇怪行为 2022-01-01
- 如何使用WebFilter实现授权头检查 2022-01-01
- C++ 和 Java 进程之间的共享内存 2022-01-01
- Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
- 将log4j 1.2配置转换为log4j 2配置 2022-01-01