我已经在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"相关的警告。
我的问题是,应用这些过滤器的顺序应该是什么?我想应用所有这些(全部小写,只是我选择的术语,没有空克,没有换行符),不会认为这会被任何改变,显然它确实如此。
答案 0 :(得分:2)
是的,订单很重要。过滤器按顺序应用于文本。
当一个过滤器的操作会影响另一个过滤器的结果时,这很重要。使用词干分析器很容易看到这种情况。
如果我有一个SynonymFilter sith同义词(viking - > seafarer)和一个EnglishStemFilter,那么viking将会结束
如果我把词干分析器放在SynonymFilter之前:
至于您的分析仪的正确订购,我不知道。主要问题似乎在于放置UsefulGrams
过滤器的位置,我不知道实际上做了什么。