【问题标题】:How do I use ASCIIFoldingFilter in my Lucene app?如何在我的 Lucene 应用程序中使用 ASCIIFoldingFilter?
【发布时间】:2011-03-22 06:17:23
【问题描述】:

我有一个从索引中搜索的标准 Lucene 应用程序。我的索引包含很多法语术语,我想使用 ASCIIFoldingFilter。

我已经做了很多搜索,但我不知道如何使用它。构造函数接受一个 TokenStream 对象,当您向它发送一个字段时,我是否调用分析器上检索 TokenStream 的方法?那我该怎么办?有人可以指出一个使用 TokenFilter 的例子吗?谢谢。

【问题讨论】:

    标签: java lucene


    【解决方案1】:

    Analyzer 抽象类的结构多年来似乎发生了变化。在当前版本 (v4.9.0) 中,方法 tokenStream 设置为 final。下面的类应该做的工作:

    // Accent insensitive analyzer
    public class AccentInsensitiveAnalyzer extends StopwordAnalyzerBase {
        public AccentInsensitiveAnalyzer(Version matchVersion){
            super(matchVersion, StandardAnalyzer.STOP_WORDS_SET);
        }
    
        @Override
        protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
            final Tokenizer source = new StandardTokenizer(matchVersion, reader);
    
            TokenStream tokenStream = source;
            tokenStream = new StandardFilter(matchVersion, tokenStream);
            tokenStream = new LowerCaseFilter(tokenStream);
            tokenStream = new StopFilter(matchVersion, tokenStream, getStopwordSet());
            tokenStream = new ASCIIFoldingFilter(tokenStream);
            return new TokenStreamComponents(source, tokenStream);
        }
    }
    

    【讨论】:

      【解决方案2】:

      令牌过滤器(如 ASCIIFoldingFilter)的基础是 TokenStream,因此分析器主要通过以下方法返回它们:

      public abstract TokenStream tokenStream(String fieldName, Reader reader);
      

      如您所见,过滤器将 TokenStream 作为输入。它们就像包装器一样,或者更准确地说,就像decorators 对他们的输入。这意味着它们增强了包含的 TokenStream 的行为,同时执行它们的操作和包含的输入的操作。

      你可以找到解释here。它不是直接引用 ASCIIFoldingFilter 但同样的原则适用。基本上,您创建一个自定义分析器,其中包含类似的内容(精简示例):

      public class CustomAnalyzer extends Analyzer {
        // other content omitted
        // ...
        public TokenStream tokenStream(String fieldName, Reader reader) {
          TokenStream result = new StandardTokenizer(reader);
          result = new StandardFilter(result);
          result = new LowerCaseFilter(result);
          // etc etc ...
          result = new StopFilter(result, yourSetOfStopWords);
          result = new ASCIIFoldingFilter(result);
          return result;
        }
        // ...
      }
      

      TokenFilter 和 Tokenizer 都是 TokenStream 的子类。

      还请记住,您必须在索引和搜索中使用相同的自定义分析器,否则您可能会在查询中得到不正确的结果。

      【讨论】:

      • StandartTokenizer 现已弃用 IIRC,现在的方法是什么?
      猜你喜欢
      • 1970-01-01
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2017-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多