【问题标题】:What is the logic behind the "order of applying filters" in Apache LuceneApache Lucene 中“应用过滤器的顺序”背后的逻辑是什么
【发布时间】:2016-05-22 14:50:48
【问题描述】:

出于特定目的,我在 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 个索引词。请注意,“第一个”过滤器必须使用 SOURCE TOKENIZER,但其他过滤器使用 FILTER TOKENSTREAM。 如果我将 SOURCE 放在每个参数中,它会给出与“addsuppression”相关的警告。

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

【问题讨论】:

  • 看来,只有在某些情况下,索引术语编号发生变化,问题似乎是由其他原因引起的......

标签: java apache lucene analyzer


【解决方案1】:

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

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

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

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

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

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

至于分析仪的正确顺序,我不知道。主要问题似乎是在哪里放置 UsefulGrams 过滤器,我不知道它实际上是做什么的。

【讨论】:

    猜你喜欢
    • 2015-07-31
    • 2015-08-12
    • 2018-06-18
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多