Lucene 4.2.1没有StandardAnalyzer,我不知道如何实现不改变源文本的基本分析器。有什么指针吗?
final SimpleFSDirectory DIRECTORY = new SimpleFSDirectory(new File(ELEMENTS_INDEX_DIR));
IndexWriterConfig indexWriterConfig = new IndexWriterConfig(Version.LUCENE_42, new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String s, Reader reader) {
return null;
}
});
IndexWriter indexWriter = new IndexWriter(DIRECTORY, indexWriterConfig);
List<ModelObject> elements = dao.getAll();
for (ModelObject element : elements) {
Document document = new Document();
document.add(new StringField("id", String.valueOf(element.getId()), Field.Store.YES));
document.add(new TextField("name", element.getName(), Field.Store.YES));
indexWriter.addDocument(document);
}
indexWriter.close();
答案 0 :(得分:9)
您必须从createComponents返回TokenStreamComponents。 null
不够用。
然而,Lucene 4.2.1当然确实拥有StandardAnalyzer。
如果您正在参考Lucene 4.x中的StandardAnalyzer中的更改,并且正在寻找旧的StandardAnalyzer,那么您将需要ClassicAnalyzer。
如果你真的想要一个不会修改任何内容但只是以非常简单的方式进行标记的修剪分析器,那么WhitespaceAnalyzer可能会满足您的目的。
如果你根本不想修改或标记它,那么KeywordAnalyzer。
如果您必须创建自己的Analyzer,如您所说,则覆盖方法createComponents
,并实际构建并返回TokenStreamComponents
的实例。如果上述四个都不能满足您的需求,我不知道您的需求是什么,所以我不会在这里尝试一个具体的例子,但这里是Analyzer docs
Analyzer analyzer = new Analyzer() {
@Override
protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
Tokenizer source = new FooTokenizer(reader);
TokenStream filter = new FooFilter(source);
filter = new BarFilter(filter);
return new TokenStreamComponents(source, filter);
}
};
对于TokenStreamComponents也有一个arg ctor,顺便说一下,过滤器是可选的。
答案 1 :(得分:2)
您应该将Common Analyzers添加到您的项目中。 它们现在位于Lucene-4.2.1.zip文件中“analysis / common”下的单独JAR文件中。
lucene-analyzers-common-4.*.jar
一旦将其添加到项目中(当您添加核心时),您应该将其工作:
import org.apache.lucene.analysis.standard.StandardAnalyzer;