私はとてもシンプルです アナライザ スラッシュ(/)をスペースに置き換えようとします。なぜなら 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("/", " ");