2009-09-09 135 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'时没有结果。