Lucene JCR-SQL-contains函数不转义特殊字符?

Lucene JCR-SQL-contains函数不转义特殊字符?,lucene,aem,jcr,jcr-sql2,Lucene,Aem,Jcr,Jcr Sql2,我有以下查询字符串: 从cq:PageContent中选择jcr:title、jcr:created、jcr:description,其中jcr:path类似于“/content/../%”并包含.,“*”按日期排序ASC 问题是查询返回给定路径中的所有节点,即使它们在任何项目中都没有星号。我想转义星号字符,但结果是一样的。我试过这样的方法: 从cq:PageContent中选择jcr:title、jcr:created、jcr:description,其中jcr:path类似于“/conten

我有以下查询字符串:

从cq:PageContent中选择jcr:title、jcr:created、jcr:description,其中jcr:path类似于“/content/../%”并包含.,“*”按日期排序ASC

问题是查询返回给定路径中的所有节点,即使它们在任何项目中都没有星号。我想转义星号字符,但结果是一样的。我试过这样的方法:

从cq:PageContent中选择jcr:title、jcr:created、jcr:description,其中jcr:path类似于“/content/../%”并包含.,“\*”按日期排序ASC

甚至像这样:

从cq:PageContent中选择jcr:title、jcr:created、jcr:description,其中jcr:path类似于“/content/../%”并包含.,“\*\*\*\*\*\*\*\*\*\*\*\*\*”按日期排序ASC

在所有这些查询中,结果都是相同的,即使这些页面都没有包含星号字符或其中11个字符的属性

报告说:

在单引号“'”的searchexp文本实例中,双引号“”和连字符“-”必须用反斜杠“\”转义。因此,反斜杠本身也必须转义,以双反斜杠“\”结束


没有提到其他字符,如*,因此即使没有任何转义,它也应该可以工作。请让我了解为什么我会在这里得到这样的结果,以及如何正确地摆脱这样的困扰。

您输入的文档有答案。有些特殊字符必须转义,但是,如果您希望某些文字(如星号)仅与字符“*”匹配,则必须使用转义字符,这是一个反斜杠。文档中有点让人困惑的是,反斜杠本身在解析字符串时是一个特殊字符,因此如果希望反斜杠被视为转义字符,则需要对其进行转义

换句话说,要避开星号,您需要将其写为

\\*

我终于找到了答案

全文中的转义文本包含子句 Jackrabbit Oak使用。因此,要转义用户提供的文本以在contains中使用,您需要过滤掉所有特殊字符,或者转义它们。例如,要过滤掉特殊字符,请使用:

String filteredContains=searchTerm.replaceAll[\\Q+-&&|!{}[]^\~*?:\\/\\E]; 串q= /jcr:root/foo/element*,foo+ [jcr:contains@title,“+filteredContains.replaceAll”,+”]+ [@itemID='+itemID.replaceAll',+']

仅适用于Jackrabbit 2.x:使用Text.escapeIllegalXpathSearchChars。。。对于对jcr的调用:包含。。。另见JCR-1248:

串q= /jcr:root/foo/element*,foo+ [jcr:contains@title,“+Text.escapeIllelExpathSearchCharsSearchTerm.replaceAll”,+”]+ [@itemID='+itemID.replaceAll',+']

我不确定jcr:contains是否适合您。也许jcr:喜欢是你想要的更好的方法

jcr:contains是全文搜索,使用lucene索引。所以它可能会产生一些意想不到的影响。它也不能如此轻松地与其他索引组合

jcr:like是与通配符的属性比较。这个通配符可以用反斜杠转义

第一个示例SQL-2查询

在任何属性中使用*搜索cq:PageContent节点。%符号是通配符。已搜索*文件

SELECT * FROM [cq:PageContent] AS content
WHERE ISDESCENDANTNODE('/content/myproject/...')
AND content.* LIKE '%*%'
第二个示例SQL-2查询

在任何属性中使用%搜索cq:PageContent节点。因此百分比符号用\%转义,并用通配符%包围

SELECT * FROM [cq:PageContent] AS content
WHERE ISDESCENDANTNODE('/content/myproject/...')
AND content.* LIKE '%\%%'
第三个XPath查询示例

与上一个几乎相同,就像XPath查询一样。只是我不知道,你怎么能搜索任何属性。因此,本例搜索jcr:title属性

/jcr:root/content/myproject/...//element(*, cq:PageContent)[jcr:like(@jcr:title, '%\%%')]

请包括一些匹配和不匹配的样本数据。顺便说一下,我想这里的大多数人都不熟悉您的SQL风格。您使用的是什么AEM版本?