3

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();
4

2 回答 2

9

您必须从 createComponents 返回一个 TokenStreamComponents。 null是不够的。

然而,Lucene 4.2.1确实StandardAnalyzer

如果您可能正在参考 Lucene 4.x 中 StandardAnalyzer 的更改,并且正在寻找旧的 StandardAnalyzer,那么您将需要ClassicAnalyzer

如果您真的想要一个不修改任何内容但只是以非常简单的方式进行标记的精简分析器,那么WhitespaceAnalyzer可能会满足您的目的。

如果您根本不希望它被修改或标记,那么KeywordAnalyzer

而且,如果您必须创建自己的分析器,如您所说,则覆盖方法createComponents,并实际构建并返回TokenStreamComponents. 如果以上四个都不能满足你的需求,我不知道你的需求是什么,所以我不会在这里尝试一个具体的例子,但这里是分析器文档中的例子

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,所以过滤器是可选的,顺便说一下。

于 2013-04-22T22:40:46.210 回答
2

您应该将 Common Analyzers 添加到您的项目中。它们现在位于“analysis/common”下的 Lucene-4.2.1.zip 文件中的单独 JAR 文件中。

 lucene-analyzers-common-4.*.jar

一旦你将它添加到你的项目中(当你添加了核心)你应该有这个工作:

import org.apache.lucene.analysis.standard.StandardAnalyzer;
于 2013-05-02T08:38:53.833 回答