【问题标题】:Zend Lucene fails all searches with special charactersZend Lucene 使所有带有特殊字符的搜索失败
【发布时间】:2009-09-09 09:54:18
【问题描述】:

如果有人知道这个问题的简单答案,我就不必费力地用转义字符串创建一个额外的索引,也不必在乱扔我漂亮的代码时哭得眼花缭乱。

基本上,我们运行的 Lucene 搜索无法处理任何非字母字符。空格、百分号、点、破折号、斜线,应有尽有。这非常令人恼火,因为我无法对包含这些字符的项目进行任何搜索,无论我在哪里逃脱它们。

我有两个选择:在单独的索引中删除这些字符并将它们从我正在搜索的名称中删除,或者停止该死的搜索。

【问题讨论】:

    标签: zend-search-lucene escaping


    【解决方案1】:

    您可以使用“/”转义特殊字符。 Lucene 将以下内容视为特殊字符,您必须转义这些字符才能使其正常工作。

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

    如果要搜索“2+3”,则查询应为“2/+3”

    【讨论】:

    • 谢谢。这是正确的答案(我一直愚蠢地试图用反斜杠逃脱)。然而,我们早就离开了 Zend 管理的 Lucene 索引,因为它是一个可怕的该死的烂摊子。下次我们将破解一个 Solr 实例并绕过所有这些地狱。
    • 我只是有一个问题!我不需要转义 $ 符号,因为它是标记字符串结尾的特殊字符吗?
    【解决方案2】:

    使用QueryParser.escape(String s) 转义查询字符串。

    【讨论】:

    • 如果您正在执行Boolean 查询,这不是解决方案。因为像 +web +mail 这样的查询会被转义,它会搜索 webmail 而不是这两个关键字。有人知道Boolean 查询的正确转义吗?
    【解决方案3】:

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

    转义字符是反斜杠,而不是正向:.

    为了回答 Ankit,$ 似乎不必转义,因为它不是特殊字符。

    按照 Ralph 的建议转义破折号对我(Zend Lucene)没有任何影响。你会认为,当一个词 'abc-def' 被索引并且你搜索 'abc-def' 时,你会以某种方式找到那个词,无论在索引步骤是否忽略破折号。相同的输入应该有相同的结果。这个词似乎被索引为两个单独的标记“abc”和“def”。然而,当 'abc def' 搜索时,搜索 'abc-def' 没有结果。

    【讨论】:

      猜你喜欢
      • 2016-05-30
      • 1970-01-01
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多