Java 由Shingle筛选器生成的令牌不包括在查询-Lucene中

Java 由Shingle筛选器生成的令牌不包括在查询-Lucene中,java,lucene,Java,Lucene,我用的是Lucene 4.10.4。上述代码的输出为 public class CustomAnalyzer extends Analyzer { public static final int DEFAULT_MAX_TOKEN_LENGTH = 255; private int maxTokenLength = DEFAULT_MAX_TOKEN_LENGTH; @Override protected Analyzer.TokenStreamComponen

我用的是Lucene 4.10.4。上述代码的输出为

public class CustomAnalyzer extends Analyzer {
    public static final int DEFAULT_MAX_TOKEN_LENGTH = 255;
    private int maxTokenLength = DEFAULT_MAX_TOKEN_LENGTH;

    @Override
    protected Analyzer.TokenStreamComponents createComponents(final String fieldName,final Reader reader) {
        final ClassicTokenizer src = new ClassicTokenizer(getVersion(), reader);
        src.setMaxTokenLength(maxTokenLength);
        TokenStream  tok = new ShingleFilter(src,2,3);
        tok = new ClassicFilter(tok);
        tok = new LowerCaseFilter(tok);
    //    tok = new SynonymFilter(tok,SynonymDictionary.getSynonymMap(),true);
        return new Analyzer.TokenStreamComponents(src, tok) {
            @Override
            protected void setReader(final Reader reader) throws IOException {
                src.setMaxTokenLength(CustomAnalyzer.this.maxTokenLength);
                super.setReader(reader);
            }
        };
    }
}


public class Test {
    public static void main(String[] args) throws Exception {
        Directory dir = new NIOFSDirectory(new File("/home/local/test"));
        IndexReader indexReader = DirectoryReader.open(dir);
        IndexSearcher indexSearcher = new IndexSearcher(indexReader);
        CustomAnalyzer analyzer1 = new CustomAnalyzer();
        TokenStream ts=new CustomSynonymAnalyzer().tokenStream("n",new StringReader("cup board"));
        ts.reset();
        System.out.println("Tokens are :");
        while (ts.incrementToken()) {
           System.out.print(ts.getAttribute(CharTermAttribute.class) + ", ");
        }
        QueryParser parser = new QueryParser("n", analyzer1);
        Query query = null;
        query = parser.parse("cup board");
        System.out.println("\nQuery is");
        System.out.println(query.toString());
    }
}

我希望得到的查询是n:cup n:board n:cup board。但是由形成的标记不会追加到查询中。我只得到n:杯子n:板。我的错误在哪里?

这些令牌不是被分析器拆分的,而是被QueryParser语法拆分的。它们是单独的查询子句,而不是单独的术语,因为子句由空格分隔


尝试短语查询,查看差异:parser.parse\cup board\

如何使用木瓦过滤器实现这一点?对于查询词hello world java,我需要在查询中形成标记hello、hello world、hello world java、world java、java的组合。
Tokens are :
cup, cup board, board 
Query is
n:cup n:board