2011-07-12 108 views
4

我做搜索的文件包含由用戶執行Lucene的搜索查詢「包含」

如果SEARCHTEXT不具備任何特殊字符,它工作正常輸入的文本。

下面是我如何創建我的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

我不完全確定你在這裏之後,但我懷疑你是使用標準分析器進行索引/查詢。如果這是ca然後是:這些字符將被分析器默默忽略(或者說,跳過)。 –

+0

是的,我正在使用StandardAnalyser,經過測試,我看到它的忽略,有沒有任何工作,所以我可以使它與特殊字符工作,而不是忽略他們 – Malcolm

0

Lucene支持轉義特殊字符是查詢語法的一部分。當前列表中的特殊字符是

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

爲了躲避這些字符的字符之前使用\例如搜索(1 + 1):2,使用查詢:

(1 + 1)\:2