2016-04-28 3 views
2

の使用順序を台無し私は、以下に示すようCustomAnalyzerを使用してクエリを解析するためのLucene 6.0.0でorg.apache.lucene.queryparser.classic.QueryParserを使用しています:QueryParserがPatternReplaceCharFilter

public static void testFilmAnalyzer() throws IOException, ParseException { 
    CustomAnalyzer nameAnalyzer = CustomAnalyzer.builder() 
      .addCharFilter("patternreplace", 
        "pattern", "(movie|film|picture).*", 
        "replacement", "") 
      .withTokenizer("standard") 
      .build(); 

    QueryParser qp = new QueryParser("name", nameAnalyzer); 
    qp.setDefaultOperator(QueryParser.Operator.AND); 
    String[] strs = {"avatar film fiction", "avatar-film fiction", "avatar-film-fiction"}; 

    for (String str : strs) { 
     System.out.println("Analyzing \"" + str + "\":"); 
     showTokens(str, nameAnalyzer); 
     Query q = qp.parse(str); 
     System.out.println("Parsed query of \"" + str + "\":"); 
     System.out.println(q + "\n"); 
    } 
} 

private static void showTokens(String text, Analyzer analyzer) throws IOException { 
    StringReader reader = new StringReader(text); 
    TokenStream stream = analyzer.tokenStream("name", reader); 
    CharTermAttribute term = stream.addAttribute(CharTermAttribute.class); 
    stream.reset(); 
    while (stream.incrementToken()) { 
     System.out.print("[" + term.toString() + "]"); 
    } 
    stream.close(); 
    System.out.println(); 
} 

私はtestFilmAnalyzerを起動したときに、私は、次のような出力が得られます。

Analyzing "avatar film fiction": 
[avatar] 
Parsed query of "avatar film fiction": 
+name:avatar +name:fiction 

Analyzing "avatar-film fiction": 
[avatar] 
Parsed query of "avatar-film fiction": 
+name:avatar +name:fiction 

Analyzing "avatar-film-fiction": 
[avatar] 
Parsed query of "avatar-film-fiction": 
name:avatar 

QueryParserがそう後で行いながらアナライザは、(つまり、トークン化の前に)その正しい意図した順序でPatternReplaceCharFilterを使用するように思えます。誰かがそれについての説明を持っていますか?それはバグじゃない?

答えて

1

いいえ、これはバグではありません。 CharFiltersは、トークン化の前に、クエリ時間かインデックス時間かにかかわらず、いつもが適用されたです。

ただし、のスペースは、QueryParser構文で意味を持ちますが、これは完全に解析とは関係ありません。クエリーの別々の句を区切り、各句はそれ自身で分析されます。デフォルトのフィールドに頼らないと、これはわかりやすくなります。その場合は、avatar-film fictionname:avatar-film name:fictionに書き換える必要があります。 「アバターフィルム」と「フィクション」という2つの句のそれぞれが別々に分析され、結果が表示されます。

String[] strs = {"\"avatar film fiction\"", "\"avatar-film fiction\"", "\"avatar-film-fiction\""}; 

と、あなたが期待している結果が表示されます。

は、フレーズ検索を使用してみてください。

関連する問題