2011-07-12 23 views
4

が、私は、ユーザー実行Lucene検索クエリが

検索テキストがそれに任意の特殊文字を持っていない場合、それは正常に動作しますが入力したテキストが含まれている文書の検索をやっている「が含ま」。

以下は、私のQueryParserの作成方法です。 :検索テキストがそれに特別な文字が含まれている場合

//analyzer is an StandardAnalyzer() 
    QueryParser parser = new QueryParser("Text", analyzer); 
      parser.SetAllowLeadingWildcard(true); 
      return parser.Parse(string.Format("*{0}*", searchText)); 

私は次のエラーを取得する:

検索テキストが「ベッド[」

Cannot parse '*bed [*': Encountered "<EOF>" at line 1, column 7. 

どのように私は私の作ることができると言うと仮定します検索文字列に特殊文字が含まれていて、その特殊文字を無視したくない場合は、クエリパーサは失敗しません。

答えて

6

は、使用してみてください:

QueryParser parser = new QueryParser("Text", analyzer); 
parser.SetAllowLeadingWildcard(true); 
var escapedSearchText = QueryParser.Escape(searchText); 
return parser.Parse(string.Format("*{0}*", escapedSearchText)); 

すなわちあなたのクエリを構築する前に検索テキストを逃れます。このことができます

希望、

+0

別のものは、照会しながら、それは特殊文字を無視し、QueryParser.Escapeをやった後で私が意味する、それはまだ「ベッド[」またはQueryParserを検索します。 .Escapeは "ベッド"だけを検索するようにします – Malcolm

+0

私はあなたがここで何をしているのかは完全にはわかりませんが、インデックス/クエリに標準アナライザを使用していると思われます。 se、then:これらの文字はアナライザによって静かに無視されます(むしろスキップされます)。 –

+0

はい私はStandardAnalyserを使用しています。ホワットはテストしましたが、無視していることがわかりましたので、特別な文字で動作させることができ、無視しません。 – Malcolm

0

のLuceneは、クエリ構文の一部である特殊文字をエスケープをサポートしています。現在のリストの特殊文字は

    • & &ある|| ! (){} []^"〜*?:\

これらの文字は、文字の前に\を使用してエスケープする例は、(1 + 1)を検索する場合:2使用クエリ:

(1 + 1)\:私はお願いしたいと思います2

関連する問題