/ / Lucene QueryParserアナライザーの不整合-lucene、アナライザー、クエリパーサー

Lucene QueryParserアナライザの不一致 - lucene、analyzer、query-parser

私はとてもシンプルです アナライザ スラッシュ(/)をスペースに置き換えようとします。なぜなら QueryParser 解析する前に文字列をスラッシュでエスケープするように強制します。 MappingCharFilter 「/」を単一のスペースに置き換えるアナライザーに。アナライザーは次のように定義されます。

@Override
protected TokenStreamComponents createComponents(String field, Reader in) {
NormalizeCharMap.Builder builder = new NormalizeCharMap.Builder();
builder.add("\/", " ");
Reader mappingFilter = new MappingCharFilter(builder.build(), in);

Tokenizer tokenizer = new WhitespaceTokenizer(version, mappingFilter);
return new TokenStreamComponents(tokenizer);
}

次に、QueryParserでこのアナライザーを使用して、ダッシュ付きの文字列を解析します。

String text = QueryParser.escape("one/two");
QueryParser parser = new QueryParser(Version.LUCENE_48, "f", new MyAnalyzer(Version.LUCENE_48));
System.err.println(parser.parse(text));

期待される出力は

f:one f:two

しかし、私は得る:

f:one/two

不可解なことは、アナライザをデバッグすると、入力文字列が正しくトークン化され、1つではなく2つのトークンが返されることです。

何が起こっている?

ありがとう。

回答:

回答№1は0

非常に簡単な修正。 builder.addメソッドの最初の引数でスラッシュ文字をエスケープしないでください。

builder.add("/", " ");