"应用过滤器的顺序背后的逻辑是什么?#34;在Apache Lucene中

时间:2016-05-22 14:50:48

标签: java apache lucene analyzer

我已经在Apache Lucene中实现了我自己的分析器用于特定目的。在术语被编入索引之前,需要应用某些过滤器。我认为改变过滤器的应用顺序并不重要。但它似乎确实如此。例如;

analyzer = new Analyzer(){ 
      @Override
      protected TokenStreamComponents createComponents(String fieldName){
        AttributeFactory factory = AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY;
        Tokenizer source = new NGramTokenizer(factory,3,10);
        TokenStream filter = new NewlineFilter(source);
        filter = new LowerCaseFilter(filter);
        filter = new UsefulGrams(getVersion(), filter, usefulGramSet);
        filter = new EmptySpaceFilter(filter);
        return new TokenStreamComponents(source,filter);
      };
  };

我的令牌生成器正在生成克,然后切换换行符并降低所有案例。在此之后,我只想要我找到的克"有用"应该在索引中,该过滤器消除了无用的克数。最后,它过滤掉完全由空格组成的克。

使用我保留的数据集,此订单生成316个索引术语。但是,如果我改变过滤器的顺序;

analyzer = new Analyzer(){ 
      @Override
      protected TokenStreamComponents createComponents(String fieldName){
        AttributeFactory factory = AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY;
        Tokenizer source = new NGramTokenizer(factory,3,10);
        TokenStream filter = new UsefulGrams(getVersion(), source, usefulGramSet);
        filter = new NewlineFilter(filter);
        filter = new EmptySpaceFilter(filter);
        filter = new LowerCaseFilter(filter);
        return new TokenStreamComponents(source,filter);
      };
  };

这会产生350个索引术语。请注意"首先" filter必须使用SOURCE TOKENIZER,但其他的使用FILTER TOKENSTREAM。 如果我将SOURCE放在每个参数中,它会发出与'#34; addsuppression"相关的警告。

我的问题是,应用这些过滤器的顺序应该是什么?我想应用所有这些(全部小写,只是我选择的术语,没有空克,没有换行符),不会认为这会被任何改变,显然它确实如此。

1 个答案:

答案 0 :(得分:2)

是的,订单很重要。过滤器按顺序应用于文本。

当一个过滤器的操作会影响另一个过滤器的结果时,这很重要。使用词干分析器很容易看到这种情况。

如果我有一个SynonymFilter sith同义词(viking - > seafarer)和一个EnglishStemFilter,那么viking将会结束

  • SynonymFilter:viking - >海员
  • EnglishStemFilter:seafarer - > seafar

如果我把词干分析器放在SynonymFilter之前:

  • EnglishStemFilter:viking - >维凯
  • SynonymFilter:vike(无效果)

至于您的分析仪的正确订购,我不知道。主要问题似乎在于放置UsefulGrams过滤器的位置,我不知道实际上做了什么。