Java ApacheLucene没有';尽管使用了StopAnalyzer和StopFilter,但仍不能过滤停止字

Java ApacheLucene没有';尽管使用了StopAnalyzer和StopFilter,但仍不能过滤停止字,java,apache,lucene,information-retrieval,stop-words,Java,Apache,Lucene,Information Retrieval,Stop Words,我有一个基于ApacheLucene5.5/6.0的模块,用于检索关键字。除了一件事外,一切都很好——Lucene不过滤停止词 我尝试使用两种不同的方法启用停止字过滤 方法#1: 方法#2: 此处提供完整代码: 我的问题: 为什么Lucene不过滤停止词 如何在Lucene 5.5/6.0中启用停止字过滤 刚刚测试了方法1和方法2,它们似乎都能很好地过滤掉停止词。下面是我如何测试它的: public static void main(String[] args) throws IOExcept

我有一个基于ApacheLucene5.5/6.0的模块,用于检索关键字。除了一件事外,一切都很好——Lucene不过滤停止词

我尝试使用两种不同的方法启用停止字过滤

方法#1:

方法#2:

此处提供完整代码:

我的问题:

  • 为什么Lucene不过滤停止词
  • 如何在Lucene 5.5/6.0中启用停止字过滤

  • 刚刚测试了方法1和方法2,它们似乎都能很好地过滤掉停止词。下面是我如何测试它的:

    public static void main(String[] args) throws IOException, ParseException, org.apache.lucene.queryparser.surround.parser.ParseException 
    {
         StandardTokenizer stdToken = new StandardTokenizer();
         stdToken.setReader(new StringReader("Some stuff that is in need of analysis"));
         TokenStream tokenStream;
    
         //You're code starts here
         tokenStream = new StopFilter(new ASCIIFoldingFilter(new ClassicFilter(new LowerCaseFilter(stdToken))), EnglishAnalyzer.getDefaultStopSet());
         tokenStream.reset();
         //And ends here
    
         CharTermAttribute token = tokenStream.getAttribute(CharTermAttribute.class);
         while (tokenStream.incrementToken()) {
             System.out.println(token.toString());
         }
         tokenStream.close();
    }
    
    结果:

    一些
    东西
    需要
    分析


    这消除了我的样本中的四个停止词。

    陷阱在默认Lucene的停止词列表中,我预计,它的范围更广

    以下是默认情况下尝试加载自定义停止词列表的代码,如果失败,则使用标准代码:

    字符集stopWordsSet;
    试一试{
    //使用自定义的停止词列表
    String stopWordsDictionary=FileUtils.readFileToString(新文件(%PATH_TO_File%));
    stopWordsSet=WordlistLoader.getWordSet(新的StringReader(stopWordsDictionary));
    }catch(filenotfounde异常){
    //使用标准的停止词列表
    stopWordsSet=ChararlySet.copy(StandardAnalyzer.STOP\u WORDS\u SET);
    }
    tokenStream=new StopFilter(新的ASCIIFoldingFilter(新的ClassicFilter(新的小写过滤器(stdToken))),stopWordsSet);
    tokenStream.reset();
    
    问题在于
    Lucene
    没有过滤掉
    we
    I
    和其他常见的英语单词。我应该附加其他扩展停止词词典吗?
    Lucene
    是否提供其他停止词词典?
    EnglishAnalyzer
    StandardAnalyzer
    使用相同的停止词集,因此我认为Lucene中没有更广泛的停止词列表。因此,是的,您可能需要创建自己的。如果您使用的是StandardAnalyzer,则可以轻松地将停止字存储在纯文本文件中,并将读取器传递给构造函数。您是指
    StandardAnalyzer
    还是
    StandardTokenizer
    ?我使用
    StandardAnalyzer。停止单词设置
    ,但未使用
    StandardAnalyzer
    的构造函数。相反,我有
    stdToken.setReader(newstringreader(全文))。我应该将停止词列表放在哪里?您需要将停止词的
    字符集
    传递到您的
    停止过滤器
    StandardAnalyzer
    只是有一个方便的ctor。要从文件生成,您需要使用。或者你可以自己创建一个,这真的很好用。非常好,特别感谢
    WordlistLoader.getWordSet
    tokenStream = new StopFilter(new ClassicFilter(new LowerCaseFilter(stdToken)), StopAnalyzer.ENGLISH_STOP_WORDS_SET);
    tokenStream.reset();
    
    public static void main(String[] args) throws IOException, ParseException, org.apache.lucene.queryparser.surround.parser.ParseException 
    {
         StandardTokenizer stdToken = new StandardTokenizer();
         stdToken.setReader(new StringReader("Some stuff that is in need of analysis"));
         TokenStream tokenStream;
    
         //You're code starts here
         tokenStream = new StopFilter(new ASCIIFoldingFilter(new ClassicFilter(new LowerCaseFilter(stdToken))), EnglishAnalyzer.getDefaultStopSet());
         tokenStream.reset();
         //And ends here
    
         CharTermAttribute token = tokenStream.getAttribute(CharTermAttribute.class);
         while (tokenStream.incrementToken()) {
             System.out.println(token.toString());
         }
         tokenStream.close();
    }