2009-09-09 171 views
2

如果有人知道這個簡單的答案,我不必通過創建額外的索引和逃脫的字符串,並在拋出我漂亮的代碼時大喊大叫。Zend Lucene不能通過特殊字符搜索所有搜索

基本上,我們運行的Lucene搜索不能處理任何非字母字符。空格,百分號,點,破折號,斜槓,你的名字。這是非常令人憤怒的,因爲我無法搜索包含這些角色的物品,無論我在哪裏逃避或不逃避。

我有兩個選擇:將這些字符殺死在一個單獨的索引中,並將它們從我正在搜索的名稱中刪除或停止該死的搜索。

回答

3

您可以使用'/'轉義特殊字符。 Lucene會將以下內容視爲特殊字符,並且您必須轉義這些字符才能使其工作。

+ - && || ! () { } [ ]^" ~ * ? : \ 

如果你要搜索 「2 + 3」,查詢應該是 「2/+ 3」

+1

謝謝。這是正確的答案(我一直愚蠢地試圖用反斜槓逃脫)。然而,我們早已從Zend管理的Lucene索引中移除,因爲它是一個可怕的上帝該死的混亂。下一次,我們將打破一個Solr實例並繞過這一切。 – John

+0

我只是有一個問題!我不需要轉義'$'符號,因爲它是一個特殊的字符,標誌着字符串的結尾? – Ankit

3

使用QueryParser.escape(String s)逃避查詢字符串。

+0

如果您正在執行「布爾」查詢,這不是解決方案。因爲'+ web + mail'這樣的查詢會被轉義,並且它會爲這兩個關鍵字搜索「web」或「mail」。任何人都知道'Boolean'查詢有正確的轉義嗎? – TiMESPLiNTER

1

根據http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.html#-

轉義字符斜線落後,不-forward:。

爲了回答Ankit,$似乎不需要轉義,因爲它不是特殊字符。

按照Ralph的建議逃離破折號對我沒有任何影響(Zend Lucene)。你會認爲,當一個單詞'abc-def'被索引,並且你搜索'abc-def'時,你會以某種方式找到該單詞,而不管在索引步驟中是否忽略短劃線。相同的輸入應該有相同的結果。這個詞似乎被編入兩個獨立的標記'abc'和'def'。然而,'abc-def'搜索'abc def'時沒有結果。