简单问一下,Lucene 包 (Java) 中的 porter 词干分析器线程安全吗?
我猜答案是否定的,因为您需要设置当前字符串,调用 Stem 方法,然后获取当前 block 以获取词干单词。但也许我错过了一些东西 - 是否有线程安全的方法可以从 Lucene 中提取单个单词或字符串的词干?
有经验的人知道实例化一个 Porter Stemmer 实例然后在该 Stemmer 实例上使用同步块(synchronized block)并执行 setCurrent("..."); stem(); get();
是否会更快吗?例程还是为要处理的每个字符串/文档创建新的波特词干分析器实例更快。
在本例中,我有数千个文档,每个文档都由一个线程池占用(即 1 个线程有一个文档)。
编辑仅供引用 - 使用模式示例:
import org.tartarus.snowball.ext.PorterStemmer;
...
private String stem(String word){
PorterStemmer stem = new PorterStemmer();
stem.setCurrent(word);
stem.stem();
return stem.getCurrent();
}
干杯!
最佳答案
查看文档,似乎 PorterStemmer
类是不可重入的,所以如果我是你,我会为每个线程构建一个实例。如果词干分析是程序所做的主要事情之一,并且没有其他方法让 CPU 核心保持忙碌,那么同步块(synchronized block)似乎是一个坏主意:程序将一直阻塞,等待词干分析器完成一份文件。我也不会为每个文档创建一个线程;每个核心一个线程的线程池可能是一个更明智的选择。
(没有示例代码,因为我什至无法从 API 文档中找出用法。RTFS 来了解这个东西是如何工作的...)
关于java - Lucene Porter Stemmer 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7483384/