0

lucene.net(2.3.2)と互換性のあるWordDelimiterFilterの移植バージョンを使用していますが、ハイフンを含む単語でワイルドカード検索を実行すると機能しません。

例として、「CL-276-0001」という単語があります。「cl」 / 「cl-276」 / 「cl-276-0001」を検索すると、レコードに問題はありません(最初に解決しようとしていたものです)。 )が、「cl-276 *」、または「cl-276-0 *」を検索すると、機能しなくなりました。「cl*」は影響を受けません。これにより、呼び出されたものにワイルドカードを追加せずに、クエリパーサーで何かを実行している可能性があると思います。

これを解決/理解するための助けをいただければ幸いです。

編集:クエリパーサーによって生成されたクエリを見ました。これは正確に入力されたものです。これは、ユーザーがプレフィックスとして入力したものを正確に検索するため、検索が機能しないことを意味していると思います。今、私はこの振る舞いを変えるべきではないと考えています。

2番目の編集:誰かがアナライザーがどのように見えるか尋ねました:

public override TokenStream TokenStream(string fieldName, TextReader reader)
{
    TokenStream result = new WhitespaceTokenizer(reader);
    result = new WordDelimiterFilter(result,1, 1, 1 , 1, 1 );
    result = new StandardFilter(result);
    result = new LowerCaseFilter(result);
    result = new StopFilter(result, LoadStopWords());
    return result;
}
4

1 に答える 1

1

CL-276-0001アナライザーによってトークン[cl][276]と[0001]に分割され、それらのトークンはインデックスに格納されます。
一方、ワイルドカード検索ではアナライザーを使用せず、検索基準を小文字にするだけです。検索基準cl-276(またはcl-276-0)がインデックスに存在しないため、結果は得られません。

このための1つの解決策は、QueryParserを使用する代わりに、TermQuery(ケーシングが重要)を構築することです。

于 2012-08-21T08:57:02.593 に答える